class AnalysisSet(jsl.Document): class Options(object): definition_id = "analysis_set" description = "Set of named component analyses" digests = jsl.DictField(additional_properties=True) security_issues = jsl.DictField(additional_properties=True) source_licenses = jsl.DictField(additional_properties=True) crypto_algorithms = jsl.DictField(additional_properties=True) languages = jsl.DictField(additional_properties=True) binary_data = jsl.DictField(additional_properties=True) static_analysis = jsl.DictField(additional_properties=True) metadata = jsl.DictField(additional_properties=True) github_details = jsl.DictField(additional_properties=True) redhat_downstream = jsl.DictField(additional_properties=True) blackduck = jsl.Var({ lambda v: v == ROLE_v1_0_1 or v >= ROLE_v1_1_1: jsl.DictField(additional_properties=True) }) with jsl.Scope(lambda v: v >= ROLE_v1_1_2) as added_in_v1_1_2: added_in_v1_1_2.dependency_snapshot = jsl.DictField( additional_properties=True) with jsl.Scope(lambda v: v >= ROLE_v1_1_3) as added_in_v1_1_3: added_in_v1_1_3.code_metrics = jsl.DictField( additional_properties=True)
class ApiSchema79(ApiSchema78): """Schema for siem rule in API format.""" STACK_VERSION = "7.9" RULE_TYPES = ApiSchema78.RULE_TYPES + [THRESHOLD] author = jsl.ArrayField(jsl.StringField(default="Elastic"), required=True, min_items=1) building_block_type = jsl.StringField(required=False) exceptions_list = jsl.ArrayField(required=False) license = jsl.StringField(required=True, default="Elastic License") risk_score_mapping = jsl.ArrayField(jsl.DocumentField(RiskScoreMapping), required=False, min_items=1) rule_name_override = jsl.StringField(required=False) severity_mapping = jsl.ArrayField(jsl.DocumentField(SeverityMapping), required=False, min_items=1) timestamp_override = jsl.StringField(required=False) type = jsl.StringField(enum=RULE_TYPES, required=True) # there might be a bug in jsl that requires us to redefine these here query_scope = ApiSchema78.query_scope saved_id_scope = ApiSchema78.saved_id_scope ml_scope = ApiSchema78.ml_scope with jsl.Scope(THRESHOLD) as threshold_scope: threshold_scope.index = jsl.ArrayField(jsl.StringField(), required=False) # this is not required per the API but we will enforce it here threshold_scope.language = jsl.StringField(enum=['kuery', 'lucene'], required=True, default='kuery') threshold_scope.query = jsl.StringField(required=True) threshold_scope.type = jsl.StringField(enum=[THRESHOLD], required=True, default=THRESHOLD) threshold_scope.threshold = jsl.DocumentField(ThresholdMapping, required=True) with jsl.Scope(jsl.DEFAULT_ROLE) as default_scope: default_scope.type = type
class ComponentInfo(jsl.Document): class Options: description = "Information about a single component" definition_id = "component_info" blackduck_details = jsl.DocumentField(BlackduckDetails, as_ref=True, required=True) cve_details = jsl.ArrayField(jsl.DocumentField(CVEDetail, as_ref=True), required=True) ecosystem = jsl.StringField(required=True) github_details = jsl.DocumentField(GithubDetails, as_ref=True, required=True) id = jsl.StringField(required=True) latest_version = jsl.OneOfField([jsl.StringField(), jsl.NullField()], required=True) licenses = jsl.ArrayField(jsl.StringField(), required=True) name = jsl.StringField(required=True) package_dependents_count = jsl.NumberField(required=True) version = jsl.StringField(required=True) with jsl.Scope(lambda v: v >= ROLE_v1_1_0) as added_in_v1_1_0: added_in_v1_1_0.dependents_count = jsl.NumberField(required=True) with jsl.Scope(lambda v: v >= ROLE_v1_2_0) as added_in_v1_2_0: added_in_v1_2_0.relative_usage = jsl.StringField(required=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as added_in_v2_0_0: added_in_v2_0_0.redhat_usage = jsl.DocumentField(RedHatUsage, as_ref=True, required=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_3) as added_in_v2_0_3: added_in_v2_0_3.metadata = jsl.DocumentField(ComponentMetadata, as_ref=True, required=True)
class StackAnalysisReport(jsl.Document): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "Stack analysis report with aggregated data" definition_id = "stack_analysis_report" with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as v2_0_0: v2_0_0.manifest_name = jsl.StringField(required=True) v2_0_0.ecosystem = jsl.StringField(required=True) v2_0_0.cvss = jsl.NumberField(required=True) v2_0_0.popularity = jsl.DocumentField(Popularity, as_ref=True, Required=True) v2_0_0.usage = jsl.DocumentField(Usage, as_ref=True, Required=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_2) as v2_0_2: v2_0_2.recommendation = jsl.DocumentField(Recommendation, as_ref=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_3) as added_in_v2_0_3: added_in_v2_0_3.metadata = jsl.DocumentField(Metadata, as_ref=True, required=True) analyzed_components = jsl.NumberField(required=True) total_security_issues = jsl.NumberField(required=True) total_licenses = jsl.NumberField(required=True) components_with_security_issues = jsl.ArrayField(jsl.StringField(), required=True) distinct_licenses = jsl.ArrayField(jsl.StringField(), required=True) components = jsl.ArrayField(jsl.DocumentField(ComponentInfo, as_ref=True), required=True)
class StackAnalysisResponse(JSLSchemaBase): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "Stack analysis" definition_id = "stack_analysis" with jsl.Scope(lambda v: v < ROLE_v2_0_1) as before_v2_0_1: before_v2_0_1.status = jsl.StringField( enum=["FINISHED", "FAILED", "INPROGRESS"], required=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_1) as since_v2_0_1: since_v2_0_1.status = jsl.StringField(enum=["success"], required=True) submitted_at = jsl.DateTimeField(required=True) started_at = jsl.DateTimeField(required=True) finished_at = jsl.DateTimeField(required=True) request_id = jsl.StringField(required=True) with jsl.Scope(lambda v: v < ROLE_v2_1_0) as removed_in_v2_1_0: removed_in_v2_1_0.analyses_result = jsl.ArrayField(jsl.StringField(), required=True) with jsl.Scope(lambda v: v == ROLE_v1_0_0 or v == ROLE_v1_1_0 or v == ROLE_v1_2_0) as upto_v1_2_0: upto_v1_2_0.result = jsl.DocumentField(StackAnalysisResult, required=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as added_in_v2_0_0: added_in_v2_0_0.result = jsl.ArrayField(jsl.DocumentField( StackAnalysisReport, as_ref=True), required=True)
class CVEImpact(jsl.Document): class Options(object): definition_id = "cve_impact" with jsl.Scope(ROLE_v1_0_0) as v1: v1.availability = jsl.StringField(enum=["NONE", "LOW", "HIGH"], required=True) with jsl.Scope(ROLE_v2_0_0) as v2: v2.availability = jsl.StringField(enum=["NONE", "PARTIAL", "COMPLETE"], required=True) confidentiality = jsl.StringField(enum=["NONE", "PARTIAL", "COMPLETE"], required=True) integrity = jsl.StringField(enum=["NONE", "PARTIAL", "COMPLETE"], required=True)
class CVEAccess(jsl.Document): class Options(object): definition_id = "cve_access" authentication = jsl.StringField(enum=["NONE", "SINGLE", "MULTIPLE"], required=True) complexity = jsl.StringField(enum=["LOW", "MEDIUM", "HIGH"], required=True) with jsl.Scope(ROLE_v1_0_0) as v1: v1.vector = jsl.StringField(enum=["NETWORK", "ADJACENT NETWORK", "LOCAL"], required=True) with jsl.Scope(ROLE_v2_0_0) as v2: v2.vector = jsl.StringField(enum=["NETWORK", "ADJACENT_NETWORK", "LOCAL"], required=True)
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
class NpmShrinkwrap(jsl.Document): class Options(object): definition_id = "npm_shrinkwrap" description = "npm-shrinkwrap description" name = jsl.StringField() version = jsl.StringField() npm_shrinkwrap_version = jsl.StringField() node_version = jsl.StringField() 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.resolved_dependencies = jsl.ArrayField(jsl.StringField()) with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as since_v2_0_0: since_v2_0_0.dependencies = jsl.ArrayField(jsl.StringField()) since_v2_0_0._system = jsl.StringField()
class LicenseDetailsPre30(jsl.Document): class Options(object): definition_id = "license_details_pre_3_0" with jsl.Scope(ROLE_v1_0_0) as v1_0_0: v1_0_0.count = jsl.StringField( description="Number of occurrences of this variant", required=True) with jsl.Scope(ROLE_v2_0_0) as v2_0_0: v2_0_0.count = jsl.NumberField( description="Number of occurrences of this variant", required=True) license_name = jsl.StringField( description="Common name of the detected license", required=True) variant_id = jsl.StringField( description="Specific license variant detected", required=True)
class GithubDetail(jsl.Document): """JSL schema for Github worker results details.""" class Options(object): """JSL schema for Github worker results details.""" definition_id = "github_extracted_details" description = "Details of Github inspection" # we don't mandate any of these fields, because they may not be present forks_count = jsl.IntField() last_year_commits = jsl.DocumentField(GithubLastYearCommits, as_ref=True) open_issues_count = jsl.IntField() stargazers_count = jsl.IntField() subscribers_count = jsl.IntField() with removed_in(ROLE_v2_0_0) as until_v2_0_0: until_v2_0_0.updated_issues = jsl.DocumentField(GithubUpdatedIssues, as_ref=True) until_v2_0_0.updated_pull_requests = jsl.DocumentField( GithubUpdatedPullRequests, as_ref=True) with added_in(ROLE_v1_0_2) as since_v1_0_2: since_v1_0_2.contributors_count = jsl.IntField() with jsl.Scope(ROLE_v1_0_3) as v1_0_3: v1_0_3.topics = jsl.ArrayField(jsl.StringField(), required=True) with added_in(ROLE_v1_0_4) as since_v1_0_4: since_v1_0_4.topics = jsl.ArrayField(jsl.StringField()) with added_in(ROLE_v2_0_1) as since_v2_0_1: since_v2_0_1.license = jsl.DictField() with added_in(ROLE_v2_0_2) as since_v2_0_2: since_v2_0_2.updated_on = jsl.StringField(required=True)
class SimilarityAnalysis(jsl.Document): class Options: description = "Stack Similarity Analysis Result" definition_id = "stack_similarity_analysis" missing_packages = jsl.ArrayField(jsl.StringField(), required=True) version_mismatch = jsl.ArrayField(jsl.StringField(), required=True) with jsl.Scope(lambda v: v >= ROLE_v2_1_4) as v2_1_4: v2_1_4.missing_downstream_component = jsl.ArrayField(jsl.StringField(), required=True)
def added_in(role): """Provide helper for schema fields added in a particular version. Example: with added_in(ROLE_v2_0_0) as since_v2_0: since_v2_0.new_field_name = ... """ return jsl.Scope(lambda v: v >= role)
def removed_in(role): """Provide helper for schema fields removed in a particular version. Example: with removed_in(ROLE_v2_0_0) as before_v2_0: before_v2_0.old_field_name = ... """ return jsl.Scope(lambda v: v < role)
class GithubDetails(jsl.Document): class Options: description = "Github information for a single component" definition_id = "component_github_info" forks_count = jsl.NumberField(required=True) stargazers_count = jsl.NumberField(required=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as v2_0_0: v2_0_0.issues = jsl.DocumentField(GithubMetrics, as_ref=True, required=True) v2_0_0.pull_requests = jsl.DocumentField(GithubMetrics, as_ref=True, required=True)
class LockFile(jsl.Document): class Options(object): definition_id = "metadata_lockfile" description = "Dependency lock file description" runtime = jsl.StringField() version = jsl.StringField() dependencies = jsl.ArrayField( jsl.DocumentField(LockedDependency, as_ref=True)) with jsl.Scope(lambda v: v >= ROLE_v3_0_0) as since_v3_0_0: since_v3_0_0.name = jsl.StringField()
class GithubUpdatedPullRequests(GithubUpdatedIssues): class Options(object): definition_id = "github_pull_requests_details" description = "Details of updated Github pull requests" with jsl.Scope(ROLE_v1_0_0) as v1_0_0: v1_0_0.open = jsl.IntField(required=True) v1_0_0.closed = jsl.IntField(required=True) with added_in(ROLE_v1_0_1) as since_v1_0_1: since_v1_0_1.year = jsl.DocumentField(GithubItemsByTime, as_ref=True) since_v1_0_1.month = jsl.DocumentField(GithubItemsByTime, as_ref=True)
class SimilarStacks(jsl.Document): class Options: description = "Stack Similarity Information" definition_id = "stack_similarity_information" analysis = jsl.DocumentField(SimilarityAnalysis, as_ref=True, required=True) similarity = jsl.NumberField(required=True) stack_id = jsl.NumberField(required=True) uri = jsl.StringField(required=True) with jsl.Scope(lambda v: v >= ROLE_v2_1_4) as v2_1_4: v2_1_4.source = jsl.StringField(required=True) v2_1_4.usage = jsl.NumberField(required=True) v2_1_4.original_score = jsl.NumberField(required=True)
class SimilarityAnalysis(jsl.Document): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "Stack Similarity Analysis Result" definition_id = "stack_similarity_analysis" missing_packages = jsl.ArrayField(jsl.StringField(), required=True) version_mismatch = jsl.ArrayField(jsl.StringField(), required=True) with jsl.Scope(lambda v: v >= ROLE_v2_1_4) as v2_1_4: v2_1_4.missing_downstream_component = jsl.ArrayField( jsl.StringField(), required=True)
class ApiSchema710(ApiSchema79): """Schema for siem rule in API format.""" STACK_VERSION = "7.10" RULE_TYPES = ApiSchema79.RULE_TYPES + [EQL] type = jsl.StringField(enum=RULE_TYPES, required=True) # there might be a bug in jsl that requires us to redefine these here query_scope = ApiSchema79.query_scope saved_id_scope = ApiSchema79.saved_id_scope ml_scope = ApiSchema79.ml_scope threshold_scope = ApiSchema79.threshold_scope with jsl.Scope(EQL) as eql_scope: eql_scope.index = jsl.ArrayField(jsl.StringField(), required=False) eql_scope.query = jsl.StringField(required=True) eql_scope.language = jsl.StringField(enum=[EQL], required=True, default=EQL) eql_scope.type = jsl.StringField(enum=[EQL], required=True) with jsl.Scope(jsl.DEFAULT_ROLE) as default_scope: default_scope.type = type
class GithubUpdatedIssues(jsl.Document): """JSL schema for Details of updated Github issues.""" class Options(object): """JSL schema for Details of updated Github issues.""" definition_id = "github_issues_details" description = "Details of updated Github issues" with jsl.Scope(ROLE_v1_0_0) as v1_0_0: v1_0_0.open = jsl.IntField(required=True) v1_0_0.closed = jsl.IntField(required=True) with added_in(ROLE_v1_0_1) as since_v1_0_1: since_v1_0_1.year = jsl.DocumentField(GithubItemsByTime, as_ref=True) since_v1_0_1.month = jsl.DocumentField(GithubItemsByTime, as_ref=True)
class GithubDetails(jsl.Document): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "Github information for a single component" definition_id = "component_github_info" forks_count = jsl.NumberField(required=True) stargazers_count = jsl.NumberField(required=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as v2_0_0: v2_0_0.issues = jsl.DocumentField(GithubMetrics, as_ref=True, required=True) v2_0_0.pull_requests = jsl.DocumentField(GithubMetrics, as_ref=True, required=True)
class SimilarStacks(jsl.Document): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "Stack Similarity Information" definition_id = "stack_similarity_information" analysis = jsl.DocumentField(SimilarityAnalysis, as_ref=True, required=True) similarity = jsl.NumberField(required=True) stack_id = jsl.NumberField(required=True) uri = jsl.StringField(required=True) with jsl.Scope(lambda v: v >= ROLE_v2_1_4) as v2_1_4: v2_1_4.source = jsl.StringField(required=True) v2_1_4.usage = jsl.NumberField(required=True) v2_1_4.original_score = jsl.NumberField(required=True)
class DownstreamUsageSummary(jsl.Document): class Options(object): definition_id = "downstream_usage_summary" package_names = jsl.ArrayField(jsl.StringField(), required=True) # Brew query integration registered_srpms = jsl.ArrayField(jsl.DocumentField(SRPMRecord, as_ref=True), required=True) # Pulp CDN query integration with jsl.Scope(ROLE_v1_0_0) as v1: v1.published_in = jsl.ArrayField(jsl.StringField(), required=True) with added_in(ROLE_v2_1_0) as since_v2_1: since_v2_1.all_rhn_channels = jsl.ArrayField(jsl.StringField(), required=True) since_v2_1.all_rhsm_content_sets = jsl.ArrayField(jsl.StringField(), required=True) with added_in(ROLE_v2_2_0) as since_v2_2: since_v2_2.all_rhsm_product_names = jsl.ArrayField(jsl.StringField(), required=True) with added_in(ROLE_v2_2_1) as since_v2_2_1: since_v2_2_1.rh_mvn_matched_versions = jsl.ArrayField( 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)
description = "Blackduck information for a single component" definition_id = "component_blackduck_info" license = jsl.ArrayField(jsl.DocumentField(BlackduckLicenseDetails, as_ref=True)) security = jsl.ArrayField(jsl.DocumentField(BlackduckSecurityDetails, as_ref=True)) class CVEDetail(jsl.Document): class Options: description = "Information about one CVE for a single component" definition_id = "component_cve_info" cvss = jsl.NumberField(required=True) id = jsl.StringField(required=True) with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as v2_0_0: class Month(jsl.Document): class Options: description = "GitHub Last Month Metrics" definition_id = "github_last_month_metrics" opened = jsl.NumberField(required=True) closed = jsl.NumberField(required=True) class Year(jsl.Document): class Options: description = "GitHub Last Year Metrics" definition_id = "github_last_year_metrics" opened = jsl.NumberField(required=True) closed = jsl.NumberField(required=True) class GithubMetrics(jsl.Document):
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 MercatorResult(JSLSchemaBaseWithRelease): """JSL schema for Mercator worker results.""" class Options(object): """JSL schema for Mercator worker results.""" definition_id = "metadata" description = "Result of Mercator worker" # TODO: Any ideas how to reuse MetadataDict here ? 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 jsl.Scope(ROLE_v1_1_0) as v1_1_0: v1_1_0.contributors = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()]) v1_1_0.maintainers = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()]) with jsl.Scope(lambda v: v < ROLE_v2_0_0) as before_v2_0_0: # some of these may be missing in some ecosystem, so no required=True before_v2_0_0.author = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) before_v2_0_0.bug_reporting = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) before_v2_0_0.code_repository = jsl.OneOfField( [jsl.DocumentField(CodeRepository, as_ref=True), jsl.NullField()] ) before_v2_0_0.declared_license = jsl.OneOfField( [jsl.StringField(), jsl.NullField()] ) before_v2_0_0.dependencies = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()] ) before_v2_0_0.description = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) before_v2_0_0.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 before_v2_0_0.engines = jsl.OneOfField( [jsl.DictField(additional_properties=True), jsl.NullField()] ) before_v2_0_0.files = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()] ) before_v2_0_0.git_head = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) before_v2_0_0.homepage = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) before_v2_0_0.keywords = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()] ) before_v2_0_0.maintainers = jsl.OneOfField( [jsl.ArrayField(jsl.StringField()), jsl.NullField()]) # metadata is a rubygems thing and can contain arbitrary key/value pairs before_v2_0_0.metadata = jsl.OneOfField( [jsl.DictField(additional_properties=True), jsl.NullField()] ) before_v2_0_0.name = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) before_v2_0_0.platform = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) before_v2_0_0.readme = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) before_v2_0_0.scripts = jsl.OneOfField( [jsl.DictField(additional_properties=True), jsl.NullField()] ) before_v2_0_0.version = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) # 2.0.0 with jsl.Scope(ROLE_v2_0_0) as v2_0_0: v2_0_0.details = jsl.ArrayField(jsl.OneOfField( [jsl.DocumentField(MetadataDict, as_ref=True), jsl.DocumentField(NpmShrinkwrap, as_ref=True)] )) # 2.1.0 with added_in(ROLE_v2_1_0) as since_v2_1_0: since_v2_1_0.details = jsl.ArrayField(jsl.DocumentField(MetadataDict, as_ref=True)) # 3.1.0 with added_in(ROLE_v3_1_0) as since_v3_1: since_v3_1.status = jsl.StringField(enum=["success", "error"], required=True) since_v3_1.summary = jsl.ArrayField(jsl.StringField(), required=True)