class LockedDependency(jsl.Document): class Options(object): definition_id = "metadata_locked_dependency" description = "Locked dependency description" name = jsl.StringField() version = jsl.StringField() specification = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) resolved = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) dependencies = jsl.ArrayField( jsl.DocumentField(jsl.RECURSIVE_REFERENCE_CONSTANT, as_ref=True))
class TargetInfo(jsl.Document): docker = jsl.ArrayField([ jsl.StringField(), jsl.OneOfField([jsl.StringField(), jsl.NullField()]) ]) rsync = jsl.ArrayField([ jsl.StringField(), jsl.OneOfField([jsl.StringField(), jsl.NullField()]) ]) containers = jsl.ArrayField( [jsl.StringField(), jsl.ArrayField(jsl.StringField())])
class ComponentAnalysis(JSLSchemaBaseWithRelease): class Options(object): definition_id = "component_analysis" description = "Software component analysis" ecosystem = jsl.StringField( description="Language ecosystem providing the component", required=True) package = jsl.StringField(description="Component name", required=True) version = jsl.StringField(description="Component version", required=True) latest_version = jsl.OneOfField( [jsl.StringField(), jsl.NullField()], description= "Latest version available of this component (null if unknown)", required=True) started_at = jsl.DateTimeField( description="Date/time component analysis was started", required=True) finished_at = jsl.DateTimeField( description="Date/time component analysis was finished", required=True) access_count = jsl.NumberField( description="Number of times this component has been queried", required=True) dependents_count = jsl.Var({ lambda v: v >= ROLE_v1_1_0: jsl.NumberField(description="Number of dependent GitHub projects", required=True) }) analyses = jsl.DocumentField(AnalysisSet, as_ref=True, required=True) package_info = jsl.DictField( description="Additional information related to the package", additional_properties=True, required=False)
class StackRecommendations(jsl.Document): class Options: description = "Stack Recommendations" definition_id = "stack_recommendations" #TODO: Get more details about component_level. Current example responses have this field as Null component_level = jsl.NullField(required=True) similar_stacks = jsl.ArrayField(jsl.DocumentField(SimilarStacks, as_ref=True), required=True)
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 AugeasLensProperties(jsl.Document): class Options(object): definition_id = 'AugeasLensProperties' name = jsl.StringField(required=True) value = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) properties = jsl.ArrayField( jsl.DocumentField(jsl.RECURSIVE_REFERENCE_CONSTANT))
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" name = jsl.StringField() version = jsl.StringField() specification = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) resolved = jsl.OneOfField([jsl.StringField(), jsl.NullField()]) dependencies = jsl.ArrayField( jsl.DocumentField(jsl.RECURSIVE_REFERENCE_CONSTANT, as_ref=True)) with added_in(ROLE_v3_3_0) as added_in_v3_3_0: added_in_v3_3_0.subpackages = jsl.ArrayField( jsl.StringField()) # go glide
class Dependency(jsl.Document): class Options(object): definition_id = 'dependency_object' description = 'Dependency Object' ecosystem = jsl.StringField(required=True) name = jsl.StringField(required=True) version = jsl.OneOfField([jsl.StringField(), jsl.NullField()], required=True) declaration = jsl.StringField(required=True) resolved_at = jsl.StringField(required=True)
class LinguistDetail(jsl.Document): class Options(object): definition_id = "linguist_details" description = "Details of Linguist run on one file" path = jsl.StringField(required=True) output = jsl.OneOfField( [jsl.DocumentField(LinguistOutput, as_ref=True), jsl.NullField()], required=True ) type = jsl.ArrayField(jsl.StringField(), required=True)
class StackRecommendations(jsl.Document): """Class with the schema definition based on JSL domain specific language.""" class Options: """A container for options.""" description = "Stack Recommendations" definition_id = "stack_recommendations" # TODO: Get more details about component_level. Current example # responses have this field as Null component_level = jsl.NullField(required=True) similar_stacks = jsl.ArrayField(jsl.DocumentField(SimilarStacks, as_ref=True), required=True)
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 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)
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 )
def _set_nullable(prop): if not prop.required: return jsl.OneOfField([prop, jsl.NullField(name=prop.name)]) return prop
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)