class ComponentMetadata(jsl.Document): class Options: description = "Data from metadata file" definition_id = "component_metadata" tests_implemented = jsl.BooleanField() required_engines = jsl.DocumentField(ComponentMetadataEngines, as_ref=True, required=True) dependency_lock_file = jsl.BooleanField()
class ObjectSchema(CRUDSchema): id = jsl.IntField(required=False) uuid = jsl.StringField(required=False) body = jsl.StringField(required=True, default='') created_flag = jsl.BooleanField(required=False, default=False) updated_flag = jsl.BooleanField(required=False, default=False)
class NEVPreprocessingParams(jsl.Document): comment = jsl.StringField() spike_no_secondary_unit = jsl.BooleanField(required=True) spike_no_255_unit = jsl.BooleanField(required=True) spike_no_0_unit = jsl.BooleanField(required=True) throw_high_byte = jsl.BooleanField( required=True) # I dropped "fix_nev" because this works whether you fix it or not. fix_nev = jsl.BooleanField(required=True)
class FilterMetadata(jsl.Document): negate = jsl.BooleanField() type = jsl.StringField() key = jsl.StringField() value = jsl.StringField() disabled = jsl.BooleanField() indexRefName = jsl.StringField() alias = jsl.StringField() # null acceptable params = jsl.DictField(properties={'query': jsl.StringField()})
class UpstreamToDownstream(Common): """ https://github.com/user-cont/betka """ master_checker = jsl.BooleanField() upstream_branch_name = jsl.StringField() upstream_git_path = jsl.StringField() pr_checker = jsl.BooleanField() # TODO: required if pr_checker is 'True' otherwise optional pr_comment_message = jsl.StringField() commit_message_template = jsl.StringField() image_url = jsl.UriField()
class UpstreamToDownstream(Common): """ https://github.com/sclorg/betka """ master_checker = jsl.BooleanField() upstream_branch_name = jsl.StringField() upstream_git_path = jsl.StringField() pr_checker = jsl.BooleanField() pr_comment_message = jsl.StringField() jira_ticket = jsl.StringField() image_url = jsl.UriField()
class ComponentMetadata(jsl.Document): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "Data from metadata file" definition_id = "component_metadata" tests_implemented = jsl.BooleanField() required_engines = jsl.DocumentField(ComponentMetadataEngines, as_ref=True, required=True) dependency_lock_file = jsl.BooleanField()
class WirelessOptions(jsl.Document): ssid = jsl.StringField(description="ESSID to broadcast.", max_length=32) key = jsl.StringField(description="Wireless network password.", min_length=8) nasid = jsl.StringField(description="NAS identifier for RADIUS.") acct_server = jsl.StringField(description="RADIUS accounting server.") acct_secret = jsl.StringField(description="RADIUS accounting secret.") acct_interval = jsl.IntField( description="RADIUS accounting update interval (seconds).", minimum=1) hidden = jsl.BooleanField( description="Disable broadcasting the ESSID in beacons.") isolate = jsl.BooleanField( description="Disable forwarding traffic between connected clients.") maxassoc = jsl.IntField( description="Maximum number of associated clients.", minimum=0)
class TomlMetadata(GenericSchema): """Schema for siem rule toml metadata.""" creation_date = jsl.StringField(required=True, pattern=DATE_PATTERN, default=time.strftime('%Y/%m/%d')) # rule validated against each ecs schema contained beats_version = jsl.StringField(pattern=VERSION_PATTERN, required=False) ecs_versions = jsl.ArrayField(jsl.StringField(pattern=VERSION_PATTERN, required=True), required=False) maturity = jsl.StringField(enum=MATURITY_LEVELS, default='development', required=True) os_type_list = jsl.ArrayField(jsl.StringField(enum=OS_OPTIONS), required=False) related_endpoint_rules = jsl.ArrayField(jsl.ArrayField(jsl.StringField(), min_items=2, max_items=2), required=False) updated_date = jsl.StringField(required=True, pattern=DATE_PATTERN, default=time.strftime('%Y/%m/%d')) query_schema_validation = jsl.BooleanField(required=False)
class ChuteRequests(jsl.Document): as_root = jsl.BooleanField(name="as-root", description="Run service as privileged user.") port_bindings = jsl.ArrayField( name="port-bindings", description="Port bindings from host to service container.", items=jsl.DocumentField(PortBinding))
class MOBaseField(jsl.Document): name = jsl.StringField(required=True, description='Title of the header row of this field') description = jsl.StringField( description='Data dictionary entry for this field') nullable = jsl.BooleanField( description= 'Must be present and set to False for this field to be blank')
def dataclass_field_to_jsl_field(prop: dataclasses.Field, nullable=False) -> jsl.BaseField: t = dataclass_check_type(prop, date) if t: return jsl.DateTimeField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, datetime) if t: return jsl.DateTimeField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, str) if t: return jsl.StringField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, int) if t: return jsl.IntField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, float) if t: return jsl.NumberField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, bool) if t: return jsl.BooleanField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, dict) if t: return jsl.DictField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, ISchema) if t: subtype = jsonobject_to_jsl(t['schema'], nullable=nullable) return jsl.DocumentField(name=prop.name, document_cls=subtype, required=t['required']) t = dataclass_check_type(prop, list) if t: return jsl.ArrayField(name=prop.name, required=t['required']) t = dataclass_check_type(prop, typing.List) if t: if 'schema' not in t.keys(): return jsl.ArrayField(name=prop.name, required=t['required']) if issubclass(t['schema'], ISchema): subtype = jsl.DocumentField( document_cls=jsonobject_to_jsl(t['schema'], nullable=nullable)) elif t['schema'] == str: subtype = jsl.StringField(name=prop.name) elif t['schema'] == int: subtype = jsl.IntField(name=prop.name) elif t['schema'] == float: subtype = jsl.NumberField(name=prop.name) elif t['schema'] == dict: subtype = jsl.DictField(name=prop.name) else: raise KeyError(t['schema']) return jsl.ArrayField(items=subtype, required=t['required']) raise KeyError(prop)
class DigesterDetail(jsl.Document): class Options(object): definition_id = "digester_details" description = "Details of Digester run on one file" artifact = jsl.BooleanField() # not required path = jsl.StringField(required=True) ssdeep = jsl.StringField(required=True) md5 = jsl.StringField(required=True) sha1 = jsl.StringField(required=True) sha256 = jsl.StringField(required=True)
class FSFragment(OwnedObject): class Options(object): definition_id = 'filesystem_fragment' source = jsl.DocumentField(Host, required=True) path = jsl.StringField(pattern=ABSOLUTE_PATH_PATTERN, required=True) kind = jsl.StringField(enum=['file', 'directory'], required=True) # if the fragment is static it will be baked into the image # otherwise the fragment will be put onto a persistent storage and bind mounted # into the container static = jsl.BooleanField() target_path = jsl.StringField(pattern=ABSOLUTE_PATH_PATTERN, required=True)
class RawData(jsl.Document): class Options(object): additional_properties = True class init(jsl.Document): init = jsl.StringField() # Manifest properties init = jsl.DocumentField(init, as_ref=True, required=True) OCR = jsl.BooleanField() relationships = jsl.ArrayField() rights = jsl.StringField()
class ApiSchema78(BaseApiSchema): """Schema for siem rule in API format.""" STACK_VERSION = "7.8" RULE_TYPES = [MACHINE_LEARNING, SAVED_QUERY, QUERY] actions = jsl.ArrayField(required=False) description = jsl.StringField(required=True) # api defaults to false if blank enabled = jsl.BooleanField(default=False, required=False) # _ required since `from` is a reserved word in python from_ = jsl.StringField(required=False, default='now-6m', name='from') false_positives = jsl.ArrayField(jsl.StringField(), required=False) filters = jsl.ArrayField(jsl.DocumentField(Filters)) interval = jsl.StringField(pattern=INTERVAL_PATTERN, default='5m', required=False) max_signals = jsl.IntField(minimum=1, required=False, default=100) # cap a max? meta = jsl.DictField(required=False) name = jsl.StringField(required=True) note = MarkdownField(required=False) # output_index =jsl.StringField(required=False) # this is NOT allowed! references = jsl.ArrayField(jsl.StringField(), required=False) risk_score = jsl.IntField(minimum=0, maximum=100, required=True, default=21) severity = jsl.StringField(enum=['low', 'medium', 'high', 'critical'], default='low', required=True) tags = jsl.ArrayField(jsl.StringField(), required=False) throttle = jsl.StringField(required=False) timeline_id = jsl.StringField(required=False) timeline_title = jsl.StringField(required=False) to = jsl.StringField(required=False, default='now') type = jsl.StringField(enum=[MACHINE_LEARNING, QUERY, SAVED_QUERY], required=True) threat = jsl.ArrayField(jsl.DocumentField(Threat), required=False, min_items=1) with jsl.Scope(MACHINE_LEARNING) as ml_scope: ml_scope.anomaly_threshold = jsl.IntField(required=True, minimum=0) ml_scope.machine_learning_job_id = jsl.StringField(required=True) ml_scope.type = jsl.StringField(enum=[MACHINE_LEARNING], required=True, default=MACHINE_LEARNING) with jsl.Scope(SAVED_QUERY) as saved_id_scope: saved_id_scope.index = jsl.ArrayField(jsl.StringField(), required=False) saved_id_scope.saved_id = jsl.StringField(required=True) saved_id_scope.type = jsl.StringField(enum=[SAVED_QUERY], required=True, default=SAVED_QUERY) with jsl.Scope(QUERY) as query_scope: query_scope.index = jsl.ArrayField(jsl.StringField(), required=False) # this is not required per the API but we will enforce it here query_scope.language = jsl.StringField(enum=['kuery', 'lucene'], required=True, default='kuery') query_scope.query = jsl.StringField(required=True) query_scope.type = jsl.StringField(enum=[QUERY], required=True, default=QUERY) with jsl.Scope(jsl.DEFAULT_ROLE) as default_scope: default_scope.type = type
def jsonobject_property_to_jsl_field(prop: jsonobject.JsonProperty, nullable=False) -> jsl.BaseField: if isinstance(prop, jsonobject.DateProperty): return jsl.DateTimeField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.DateTimeProperty): return jsl.DateTimeField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.StringProperty): return jsl.StringField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.IntegerProperty): return jsl.IntField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.FloatProperty): return jsl.NumberField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.BooleanProperty): return jsl.BooleanField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.DictProperty): if prop.item_wrapper: subtype = jsonobject_to_jsl(prop.item_wrapper.item_type, nullable=nullable) return jsl.DocumentField(name=prop.name, document_cls=subtype, required=prop.required) return jsl.DictField(name=prop.name, required=prop.required) if isinstance(prop, jsonobject.ListProperty): if prop.item_wrapper: if isinstance(prop.item_wrapper, jsonobject.ObjectProperty): if issubclass(prop.item_wrapper.item_type, jsonobject.JsonObject): subtype = jsl.DocumentField(document_cls=jsonobject_to_jsl( prop.item_wrapper.item_type), nullable=nullable) elif isinstance(prop.item_wrapper.item_type, jsonobject.JsonProperty): subtype = jsonobject_property_to_jsl_field( prop.item_wrapper.item_type) else: raise KeyError(prop.item_wrapper.item_type) elif isinstance(prop.item_wrapper, jsonobject.StringProperty): subtype = jsl.StringField(name=prop.name) elif isinstance(prop.item_wrapper, jsonobject.IntegerProperty): subtype = jsl.IntField(name=prop.name) elif isinstance(prop.item_wrapper, jsonobject.FloatProperty): subtype = jsl.NumberField(name=prop.name) elif isinstance(prop.item_wrapper, jsonobject.DictProperty): subtype = jsl.DictField(name=prop.name) else: raise KeyError(prop.item_wrapper) return jsl.ArrayField(items=subtype, required=prop.required) return jsl.ArrayField(name=prop.name, required=prop.required) raise KeyError(prop)
class ParameterBase(jsl.Document): class Options(object): additional_properties = True name = jsl.StringField(pattern='[^\s=]+', required=True) label = jsl.StringField(required=True) required = jsl.BooleanField(required=True) default_value = jsl.StringField(required=False) help_string = jsl.StringField(required=False) possible_values = jsl.DictField(required=False, min_properties=1) ctrl_props = jsl.DictField(required=False, min_properties=1) help_link = jsl.DocumentField(ParameterHelpLink, as_ref=True, required=False)
class ModularAlert(jsl.Document): short_name = jsl.StringField(required=True) label = jsl.StringField(required=True) description = jsl.StringField(required=False) icon_path = jsl.StringField(required=False) largeIcon = jsl.StringField(required=False) smallIcon = jsl.StringField(required=False) code = jsl.StringField(required=False) uuid = jsl.StringField(required=False) active_response = jsl.DictField( required=False, additional_properties=True, properties={ "supports_adhoc": jsl.BooleanField(required=False), "drilldown_uri": jsl.StringField(required=False), "group": jsl.ArrayField(jsl.StringField(), required=False, min_items=1), "category": jsl.ArrayField(jsl.StringField(), required=False, min_items=1), "task": jsl.ArrayField(jsl.StringField(), required=True, min_items=1), "subject": jsl.ArrayField(jsl.StringField(), required=True, min_items=1), "index": jsl.StringField(required=False, pattern=r"^[\w\-:]{0,50}$"), "sourcetype": jsl.StringField(required=False, pattern=r"^[\w\-:]{0,50}$"), "technology": jsl.ArrayField(jsl.DocumentField(Technology, as_ref=True), required=True, min_items=1) }) parameters = jsl.ArrayField(jsl.OneOfField([ jsl.DocumentField(CheckboxParameter, as_ref=True), jsl.DocumentField(DropdownlistParameter, as_ref=True), jsl.DocumentField(RadioParameter, as_ref=True), jsl.DocumentField(PasswordParameter, as_ref=True), jsl.DocumentField(TextareaParameter, as_ref=True), jsl.DocumentField(TextParameter, as_ref=True), jsl.DocumentField(SplunksearchdropdownParameter, as_ref=True) ]), required=False) alert_props = jsl.DocumentField(ModularAlertProps, as_ref=True, required=False)
class PredicateSchema(jsl.Document): """ A predicate schema Attributes: operator (str): Specify the compare operator of predicate. Supported predicates are >, <, >=, <=, !=, and ==. value (number, bool, sring, or None): The value to compare with of the predicate. """ operator = jsl.StringField(required=True, pattern='[!=><]=|[><]') value = jsl.AnyOfField([ jsl.NumberField(), jsl.BooleanField(), jsl.StringField(), jsl.NullField()], required=True)
class LockedDependency(jsl.Document): """JSL schema for locked dependency description.""" class Options(object): """JSL schema for locked dependency description.""" definition_id = "metadata_locked_dependency" description = "Locked dependency description" additional_properties = True name = jsl.StringField() version = jsl.StringField() specification = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) resolved = jsl.OneOfField( [jsl.StringField(), jsl.NullField(), jsl.BooleanField()]) dependencies = jsl.ArrayField( jsl.DocumentField(jsl.RECURSIVE_REFERENCE_CONSTANT, as_ref=True)) # go glide subpackages = jsl.ArrayField(jsl.StringField())
class MOTable(jsl.Document): name = jsl.StringField(required=True, description='Name of the table') file_name_prefix = jsl.StringField( required=True, description='The file name prefix used for this table.') description = jsl.StringField( description='Data dictionary entry for this table') primary_key = jsl.OneOfField( [jsl.StringField(), jsl.BooleanField(enum=[False])], description='The name of the primary key of this table ' 'or false if the table fails to have one') fields = jsl.ArrayField( jsl.OneOfField([ jsl.DocumentField(MOStringField, as_ref=True), jsl.DocumentField(MODateField, as_ref=True), jsl.DocumentField(MOIntegerField, as_ref=True), jsl.DocumentField(MOBooleanField, as_ref=True), jsl.DocumentField(MODecimalField, as_ref=True), jsl.DocumentField(MOForeignKeyField, as_ref=True) ]), required=True, min_items=1, description='The ordered list of fields as they will appear in the file' )
class MouseExpRawSchemaInputJSL(jsl.Document): """this JSL is for input, not the final saved form.""" schema_revision = jsl.IntField( enum=[1], required=True) # the version of schema, in case we have drastic change timestamp = jsl.StringField(format="date-time", required=True) animal_id = jsl.StringField(required=True) session_id = jsl.StringField(required=True) acquisition_system = jsl.StringField(enum=system_list, required=True) acquisition_system_files = jsl.DocumentField( schemautil.filetransfer.FileListRelative, required=True) experiment_name = jsl.StringField(required=True) notebook_path = jsl.StringField( pattern=schemautil.StringPatterns.strictFilenameSensiblePattern('txt'), required=True) all_file_site = jsl.DocumentField( schemautil.filetransfer.FileTransferSiteRemote, required=True) all_file_prefix = jsl.StringField( pattern=schemautil.StringPatterns.relativePathPattern) session_names = jsl.DocumentField(schemautil.filetransfer.FileListRelative, required=True) has_real_time_data = jsl.BooleanField(required=True) additional_parameters = jsl.DictField(required=True) notes = jsl.StringField(required=True)
class SiemRuleApiSchema(jsl.Document): """Schema for siem rule in API format.""" actions = jsl.ArrayField(required=False) author = jsl.ArrayField(jsl.StringField(default="Elastic"), required=True, min_items=1) building_block_type = jsl.StringField(required=False) description = jsl.StringField(required=True) # api defaults to false if blank enabled = jsl.BooleanField(default=False, required=False) exceptions_list = jsl.ArrayField(required=False) # _ required since `from` is a reserved word in python from_ = jsl.StringField(required=False, default='now-6m', name='from') false_positives = jsl.ArrayField(jsl.StringField(), required=False) filters = jsl.ArrayField(jsl.DocumentField(Filters)) interval = jsl.StringField(pattern=INTERVAL_PATTERN, default='5m', required=False) license = jsl.StringField(required=True, default="Elastic License") max_signals = jsl.IntField(minimum=1, required=False, default=100) # cap a max? meta = jsl.DictField(required=False) name = jsl.StringField(required=True) note = jsl.StringField(required=False) # output_index = jsl.StringField(required=False) # this is NOT allowed! references = jsl.ArrayField(jsl.StringField(), required=False) risk_score = jsl.IntField(minimum=0, maximum=100, required=True, default=21) risk_score_mapping = jsl.ArrayField(jsl.DocumentField(RiskScoreMapping), required=False, min_items=1) rule_id = jsl.StringField(pattern=UUID_PATTERN, required=True) rule_name_override = jsl.StringField(required=False) severity = jsl.StringField(enum=['low', 'medium', 'high', 'critical'], default='low', required=True) severity_mapping = jsl.ArrayField(jsl.DocumentField(SeverityMapping), required=False, min_items=1) # saved_id - type must be 'saved_query' to allow this or else it is forbidden tags = jsl.ArrayField(jsl.StringField(), required=False) throttle = jsl.StringField(required=False) timeline_id = jsl.StringField(required=False) timeline_title = jsl.StringField(required=False) timestamp_override = jsl.StringField(required=False) to = jsl.StringField(required=False, default='now') # require this to be always validated with a role # type = jsl.StringField(enum=[MACHINE_LEARNING, QUERY, SAVED_QUERY], required=True) threat = jsl.ArrayField(jsl.DocumentField(Threat), required=False, min_items=1) with jsl.Scope(MACHINE_LEARNING) as ml_scope: ml_scope.anomaly_threshold = jsl.IntField(required=True, minimum=0) ml_scope.machine_learning_job_id = jsl.StringField(required=True) ml_scope.type = jsl.StringField(enum=[MACHINE_LEARNING], required=True, default=MACHINE_LEARNING) with jsl.Scope(QUERY) as query_scope: query_scope.index = jsl.ArrayField(jsl.StringField(), required=False) # this is not required per the API but we will enforce it here query_scope.language = jsl.StringField(enum=['kuery', 'lucene'], required=True, default='kuery') query_scope.query = jsl.StringField(required=True) query_scope.type = jsl.StringField(enum=[QUERY], required=True, default=QUERY) with jsl.Scope(SAVED_QUERY) as saved_id_scope: saved_id_scope.index = jsl.ArrayField(jsl.StringField(), required=False) saved_id_scope.saved_id = jsl.StringField(required=True) saved_id_scope.type = jsl.StringField(enum=[SAVED_QUERY], required=True, default=SAVED_QUERY)
class SingleCodeRange(jsl.Document): type = jsl.StringField(enum=["RANGE"], required=True) min_value = jsl.IntField(required=True) max_value = jsl.IntField(required=True) missable = jsl.BooleanField(required=True)
class SingleCodeSingleMissable(jsl.Document): type = jsl.StringField(enum=["SINGLE"], required=True) code = jsl.IntField(required=True) missable = jsl.BooleanField(enum=[False], required=True) # currently, missable code is not supported.
class Vote(Document): option_id = jsl.StringField(required=true_if_creator) is_public = jsl.BooleanField(required=False)
class MetadataDict(jsl.Document): """JSL schema for generic metadata dict in details list.""" class Options(object): """JSL schema for generic metadata dict in details list.""" definition_id = "details_metadata" description = "generic metadata dict in details list" # some of these may be missing in some ecosystem, so no required=True author = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) bug_reporting = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) code_repository = jsl.OneOfField( [jsl.DocumentField(CodeRepository, as_ref=True), jsl.NullField()] ) with removed_in(ROLE_v3_2_0) as removed_in_v3_2_0: removed_in_v3_2_0.declared_license = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) with added_in(ROLE_v3_2_0) as added_in_v3_2_0: added_in_v3_2_0.declared_licenses = jsl.OneOfField([jsl.ArrayField(jsl.StringField()), jsl.NullField()]) dependencies = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()] ) description = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) devel_dependencies = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()] ) # engines are NPM thingie and can contain lots of various keys # so we just allow pretty much anything in that dict engines = jsl.OneOfField( [jsl.DictField(additional_properties=True), jsl.NullField()] ) files = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()] ) git_head = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) homepage = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) keywords = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()] ) # metadata is a rubygems thing and can contain arbitrary key/value pairs metadata = jsl.OneOfField( [jsl.DictField(additional_properties=True), jsl.NullField()] ) name = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) platform = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) readme = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) scripts = jsl.OneOfField( [jsl.DictField(additional_properties=True), jsl.NullField()] ) version = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) with jsl.Scope(lambda v: v in (ROLE_v1_0_1, ROLE_v1_1_0)) as v1_0_1_v1_1_0: v1_0_1_v1_1_0.npm_shrinkwrap = jsl.OneOfField( [jsl.DocumentField(NpmShrinkwrap, as_ref=True), jsl.NullField()]) with jsl.Scope(lambda v: v < ROLE_v1_1_0) as before_v1_1_0: before_v1_1_0.maintainers = jsl.OneOfField( [jsl.ArrayField(jsl.DocumentField(Maintainer, as_ref=True)), jsl.NullField()]) with added_in(ROLE_v1_1_0) as since_v1_1_0: since_v1_1_0.contributors = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()]) since_v1_1_0.maintainers = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()]) with jsl.Scope(ROLE_v2_0_0) as v2_0_0: v2_0_0._system = jsl.StringField() with jsl.Scope(lambda v: ROLE_v2_1_0 <= v < ROLE_v3_0_0) as since_v2_1_0: since_v2_1_0._bayesian_dependency_tree_lock = jsl.OneOfField([ jsl.DocumentField(LockFile, as_ref=True), jsl.NullField() ]) with added_in(ROLE_v2_1_1) as since_v2_1_1: since_v2_1_1._tests_implemented = jsl.BooleanField() with added_in(ROLE_v3_0_0) as since_v3_0_0: since_v3_0_0.ecosystem = jsl.StringField() since_v3_0_0._dependency_tree_lock = jsl.OneOfField([ jsl.DocumentField(LockFile, as_ref=True), jsl.NullField() ]) with added_in(ROLE_v3_1_1) as since_v3_1_1: since_v3_1_1.path = jsl.OneOfField( [jsl.StringField(), jsl.NullField()], required=False )
class Common(jsl.Document): enabled = jsl.BooleanField() notifications = jsl.DocumentField(Notifications, as_ref=True)
class MetadataDict(jsl.Document): """JSL schema for generic metadata dict in details list.""" class Options(object): """JSL schema for generic metadata dict in details list.""" definition_id = "details_metadata" description = "generic metadata dict in details list" # some of these may be missing in some ecosystem, so no required=True # 'author' should have been list of 'authors', but it's too late now author = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) bug_reporting = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) code_repository = jsl.OneOfField( [jsl.DocumentField(CodeRepository, as_ref=True), jsl.NullField()]) declared_licenses = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()]) dependencies = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()]) description = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) devel_dependencies = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()]) # engines are NPM thingie and can contain lots of various keys # so we just allow pretty much anything in that dict engines = jsl.OneOfField( [jsl.DictField(additional_properties=True), jsl.NullField()]) files = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()]) git_head = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) homepage = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) keywords = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()]) # metadata is a rubygems thing and can contain arbitrary key/value pairs metadata = jsl.OneOfField( [jsl.DictField(additional_properties=True), jsl.NullField()]) name = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) platform = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) readme = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) scripts = jsl.OneOfField( [jsl.DictField(additional_properties=True), jsl.NullField()]) version = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) contributors = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()]) maintainers = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()]) _tests_implemented = jsl.BooleanField() ecosystem = jsl.StringField() _dependency_tree_lock = jsl.OneOfField( [jsl.DocumentField(LockFile, as_ref=True), jsl.NullField()]) path = jsl.OneOfField([jsl.StringField(), jsl.NullField()], required=False)