Python API

Contents

Python API#

This reference is generated from module docstrings and public exports.

Inspection#

rsm_schema.validate_document(document)[source]#

Validate a complete RSM document against the canonical JSON Schema.

This is the authoritative validation path when callers need conditional JSON Schema rules that generated Pydantic models cannot express.

Parameters:

document (Mapping[str, Any])

Return type:

None

Inspection helpers for the bundled RSM JSON Schema.

class rsm_schema.inspector.SchemaNode(schema, raw, pointer, name=None, required=False)[source]#

Bases: object

A view onto one node in a JSON Schema document.

Parameters:
  • schema (rsm_schema.inspector.Schema) – Owning schema document.

  • raw (collections.abc.Mapping[str, Any]) – Raw mapping for this node.

  • pointer (str) – JSON Pointer locating the node in the document.

  • name (str | None) – Property or definition name, when the node has one.

  • required (bool) – Whether the node is required by its parent object.

schema: Schema#
raw: Mapping[str, Any]#
pointer: str#
name: str | None#
required: bool#
property title: str | None#

Return the schema title, if present.

property description: str | None#

Return the schema description, if present.

property ref: str | None#

Return the $ref value, if present.

property types: tuple[str, ...]#

Return declared JSON Schema types.

Returns:

tuple[str, …] – Zero, one, or multiple declared types. An empty tuple means the schema does not explicitly declare type.

property properties: tuple[SchemaNode, ...]#

Return direct object properties.

property items: SchemaNode | None#

Return the array item schema, when it is a single schema object.

resolve()[source]#

Resolve a local $ref or return this node unchanged.

Returns:

SchemaNode – Referenced node for local JSON Pointer references.

Raises:
  • ValueError – If the reference is external. External reference resolution is deliberately not hidden behind network I/O in this package.

  • KeyError – If a local reference cannot be resolved.

Return type:

SchemaNode

class rsm_schema.inspector.Schema(document)[source]#

Bases: object

Loaded JSON Schema document with lightweight traversal helpers.

Parameters:

document (Mapping[str, Any])

classmethod bundled()[source]#

Load the schema bundled with the installed package.

Returns:

Schema – Bundled RSM schema.

Return type:

Schema

static encode_pointer_token(token)[source]#

Encode one JSON Pointer token.

Parameters:

token (str)

Return type:

str

property raw: Mapping[str, Any]#

Return the raw schema document as a mapping.

property root: SchemaNode#

Return the root schema node.

property title: str | None#

Return the document title, if present.

validate_schema()[source]#

Validate the schema against the declared JSON Schema meta-schema.

Raises:

jsonschema.exceptions.SchemaError – If the schema itself is invalid.

Return type:

None

validate_document(document)[source]#

Validate an RSM document against this JSON Schema.

Unlike validation through the generated Pydantic model, this enforces composition and conditional keywords such as the requirement that a non-empty contributor list credit at least one author.

Parameters:

document (Mapping[str, Any]) – JSON-compatible RSM document.

Raises:

jsonschema.exceptions.ValidationError – If the document does not conform to the schema.

Return type:

None

at(pointer)[source]#

Return the node at a JSON Pointer.

Parameters:

pointer (str) – JSON Pointer such as /$defs/person or #/properties/project_slug.

Returns:

SchemaNode – Located schema node.

Return type:

SchemaNode

definition(name)[source]#

Return a named schema definition from $defs or definitions.

Parameters:

name (str) – Definition name.

Returns:

SchemaNode – Definition node.

Return type:

SchemaNode

walk(start=None)[source]#

Depth-first traversal over structural child schemas.

Parameters:

start (SchemaNode | None) – Node to start from. Defaults to the document root.

Yields:

SchemaNode – Each reachable schema node once per structural location. References are not followed automatically, which prevents recursive schemas from looping.

Return type:

Iterator[SchemaNode]

Generated models#

datamodel-code-generator produces these classes from the bundled schema. The public exports include the document root and reusable entities from $defs; generator-internal wrappers remain in rsm_schema.generated.models.

Pydantic v2 models generated from the bundled RSM JSON Schema.

RSMMetadata is the document root. The other names re-exported here are the reusable entities from the schema’s $defs; everything else the generator emits (property wrappers, enums, and the Entry* value types) lives in rsm_schema.generated.models under names the generator chooses, and is not part of this package’s public surface.

class rsm_schema.generated.Containerization(*, type, details=None)[source]#

Bases: BaseModel

Parameters:
  • type (Type3)

  • details (str | None)

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

type: Type3#
details: str | None#
class rsm_schema.generated.Contributor(*, name, given_names=None, family_names=None, email=None, affiliations=None, orcid=None, roles, url=None)[source]#

Bases: Person

Parameters:
  • name (Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • given_names (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • family_names (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • email (EmailStr | None)

  • affiliations (list[Organization] | None)

  • orcid (str | None)

  • roles (Annotated[list[Role], FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • url (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])])

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

roles: Annotated[list[Role], FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
class rsm_schema.generated.DataFormat(*, term=None, uri=None, version_constraint=None, schema_constraints=None, sample_url=None)[source]#

Bases: BaseModel

Parameters:
  • term (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • uri (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])])

  • version_constraint (str | None)

  • schema_constraints (str | None)

  • sample_url (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])])

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

term: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
uri: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])]#
version_constraint: str | None#
schema_constraints: str | None#
sample_url: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])]#
class rsm_schema.generated.EdamTerm(*, term=None, uri=None)[source]#

Bases: BaseModel

Parameters:
  • term (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • uri (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])])

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

term: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
uri: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])]#
class rsm_schema.generated.ExternalDependency(*, name, version_constraint=None, url=None, license=None, purpose=None)[source]#

Bases: BaseModel

Parameters:
  • name (Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • version_constraint (str | None)

  • url (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])])

  • license (str | None)

  • purpose (str | None)

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

name: Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
version_constraint: str | None#
url: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])]#
license: str | None#
purpose: str | None#
class rsm_schema.generated.ExternalService(*, name, provider=None, service_types=None, quantity=None, cost_coverage=None)[source]#

Bases: BaseModel

Parameters:
  • name (Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • provider (str | None)

  • service_types (list[ServiceType] | None)

  • quantity (str | None)

  • cost_coverage (list[CostCoverageEnum] | None)

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

name: Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
provider: str | None#
service_types: list[ServiceType] | None#
quantity: str | None#
cost_coverage: list[CostCoverageEnum] | None#
class rsm_schema.generated.FunctionIo(*, data=None, format=None)[source]#

Bases: BaseModel

Parameters:
model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

data: EdamTerm | None#
format: list[DataFormat] | None#
class rsm_schema.generated.Funding(*, funder=None, funder_identifier=None, funder_identifier_type=None, funder_url=None, award_number=None, award_title=None, grant_url=None, project_code=None)[source]#

Bases: BaseModel

Parameters:
  • funder (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • funder_identifier (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • funder_identifier_type (FunderIdentifierType | None)

  • funder_url (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])])

  • award_number (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • award_title (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • grant_url (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])])

  • project_code (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

funder: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
funder_identifier: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#

Stable identifier for the funder, such as a ROR ID or Crossref Funder ID.

funder_identifier_type: FunderIdentifierType | None#

Identifier scheme used by funder_identifier.

funder_url: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])]#

Public webpage for the funding organization.

award_number: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
award_title: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
grant_url: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])]#
project_code: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
class rsm_schema.generated.Interface(*, type, specification=None, status=None)[source]#

Bases: BaseModel

Parameters:
  • type (Type2)

  • specification (str | None)

  • status (Status | None)

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

type: Type2#
specification: str | None#
status: Status | None#
class rsm_schema.generated.OperatingSystem(*, name, specification=None, status=None)[source]#

Bases: BaseModel

Parameters:
  • name (Name)

  • specification (str | None)

  • status (Status1 | None)

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

name: Name#
specification: str | None#
status: Status1 | None#
class rsm_schema.generated.Organization(*, name, identifier=None, email=None, url=None, address=None)[source]#

Bases: BaseModel

Parameters:
  • name (Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • identifier (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])])

  • email (EmailStr | None)

  • url (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])])

  • address (str | None)

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

name: Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
identifier: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])]#
email: EmailStr | None#
url: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])]#
address: str | None#
class rsm_schema.generated.PersistentIdentifier(*, type, identifier, associated_version=None)[source]#

Bases: BaseModel

Parameters:
  • type (Type1)

  • identifier (Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • associated_version (str | None)

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

type: Type1#
identifier: Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
associated_version: str | None#
class rsm_schema.generated.Person(*, name, given_names=None, family_names=None, email=None, affiliations=None, orcid=None, roles=None, url=None)[source]#

Bases: BaseModel

Parameters:
  • name (Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • given_names (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • family_names (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • email (EmailStr | None)

  • affiliations (list[Organization] | None)

  • orcid (str | None)

  • roles (list[Role] | None)

  • url (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])])

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

name: Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
given_names: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
family_names: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
email: EmailStr | None#
affiliations: list[Organization] | None#

Organizations the person is affiliated with, most relevant first.

orcid: str | None#
roles: list[Role] | None#
url: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])]#
class rsm_schema.generated.ProgrammingLanguage(*, name, version_constraint=None, role=None)[source]#

Bases: BaseModel

Parameters:
  • name (Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • version_constraint (str | None)

  • role (str | None)

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

name: Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
version_constraint: str | None#
role: str | None#
class rsm_schema.generated.Publication(*, title=None, type=None, doi=None, pmid=None, pmcid=None, url=None, citation=None, note=None, preferred=None, authors=None)[source]#

Bases: BaseModel

Parameters:
  • title (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • type (str | None)

  • doi (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • pmid (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • pmcid (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • url (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])])

  • citation (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • note (str | None)

  • preferred (bool | None)

  • authors (list[Person] | None)

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

title: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
type: str | None#
doi: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
pmid: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
pmcid: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
url: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])]#
citation: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
note: str | None#
preferred: bool | None#
authors: list[Person] | None#
class rsm_schema.generated.RSMMetadata(*, project_name=None, project_slug, project_short_description=None, project_long_description=None, development_status=None, topics={'entries': []}, keywords={'entries': []}, contributors={'entries': []}, funding={'entries': []}, motivation={'categories': {'entries': []}}, audiences={'entries': []}, related_software={'entries': []}, urls={}, registries={'entries': []}, persistent_identifiers={'entries': []}, publications={'entries': []}, licensing={}, access={}, include_metadata=False, documentation_builder=None, documentation_types={'entries': []}, community_files={'entries': []}, code_review_policy=None, support_routes={'entries': []}, contacts={}, governance_notes=None, programming_languages={'entries': []}, software_functions={'entries': []}, interfaces={'entries': []}, operating_systems={'entries': []}, external_dependencies={'entries': []}, external_services={'entries': []}, test_types={'entries': []}, test_frameworks={'entries': []}, quality_tools={}, project_manager=None, versioning={}, distribution_channels={'entries': []}, containerization={'entries': []}, resource_requirements=None, maintenance_level=None, continuity_plan=None, retirement_criteria={'entries': []}, public_risk_notes=None, regulatory_requirements={'selected': {'entries': []}}, security_measures={'selected': {'entries': []}}, data_management={})[source]#

Bases: BaseModel

Structured metadata for research software management (RSM).

Parameters:
  • project_name (str | None)

  • project_slug (str)

  • project_short_description (str | None)

  • project_long_description (str | None)

  • development_status (DevelopmentStatus | None)

  • topics (Annotated[Topics, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • keywords (Annotated[Keywords, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • contributors (Annotated[Contributors, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • funding (Annotated[FundingModel, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • motivation (Annotated[Motivation, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • audiences (Annotated[Audiences, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • related_software (Annotated[RelatedSoftwareModel, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • urls (Annotated[Urls, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • registries (Annotated[Registries, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • persistent_identifiers (Annotated[PersistentIdentifiers, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • publications (Annotated[Publications, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • licensing (Annotated[Licensing, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • access (Annotated[Access, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • include_metadata (bool)

  • documentation_builder (DocumentationBuilder | None)

  • documentation_types (Annotated[DocumentationTypes, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • community_files (Annotated[CommunityFiles, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • code_review_policy (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, json_schema_extra={'contentMediaType': 'text/markdown'})])

  • support_routes (Annotated[SupportRoutes, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • contacts (Annotated[Contacts, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • governance_notes (str | None)

  • programming_languages (Annotated[ProgrammingLanguages, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • software_functions (Annotated[SoftwareFunctions, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • interfaces (Annotated[Interfaces, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • operating_systems (Annotated[OperatingSystems, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • external_dependencies (Annotated[ExternalDependencies, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • external_services (Annotated[ExternalServices, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • test_types (Annotated[TestTypes, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • test_frameworks (Annotated[TestFrameworks, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • quality_tools (Annotated[QualityTools, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • project_manager (ProjectManager | None)

  • versioning (Annotated[Versioning, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • distribution_channels (Annotated[DistributionChannels, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • containerization (Annotated[ContainerizationModel, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • resource_requirements (str | None)

  • maintenance_level (MaintenanceLevel | None)

  • continuity_plan (str | None)

  • retirement_criteria (Annotated[RetirementCriteria, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • public_risk_notes (str | None)

  • regulatory_requirements (Annotated[RegulatoryRequirements, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • security_measures (Annotated[SecurityMeasures, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

  • data_management (Annotated[DataManagement, FieldInfo(annotation=NoneType, required=True, validate_default=True)])

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

project_name: str | None#

Human-readable project title.

project_slug: str#

Machine-readable package and repository name. Consumers apply their own additional slug constraints.

project_short_description: str | None#

One-sentence description used in README and package metadata.

project_long_description: str | None#

Longer public description of the project motivation and scope.

development_status: DevelopmentStatus | None#

Current repostatus.org lifecycle status for the software.

topics: Annotated[Topics, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Research domains the software applies to, as EDAM topic terms. Entries may include term and uri. Broader and controlled where keywords are free text.

keywords: Annotated[Keywords, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Public keywords used in package metadata, citation metadata, registries, and archives.

contributors: Annotated[Contributors, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Everyone credited for the software, each entry declaring one or more roles. Name and roles are required; entries may also include given_names, family_names, email, affiliations, orcid, and url. A non-empty list must credit at least one author, which is what citation metadata requires.

funding: Annotated[FundingModel, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Public funding records. Entries may include funder, funder identifiers and URLs, award_number, award_title, grant_url, and project_code.

motivation: Annotated[Motivation, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Public purpose, purpose categories, problem statement, and value proposition.

audiences: Annotated[Audiences, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Intended users or stakeholder groups.

related_software: Annotated[RelatedSoftwareModel, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Related or upstream tools. Entries may include name, url_or_doi, and relationship.

urls: Annotated[Urls, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Canonical source repository, project homepage, and published documentation URLs.

registries: Annotated[Registries, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Registry entries such as PyPI, CRAN, bio.tools, WorkflowHub, or institutional catalogues. Entries may include name, url_or_id, and notes.

persistent_identifiers: Annotated[PersistentIdentifiers, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Persistent identifiers. Each entry declares its CFF identifier type and value, with an optional associated version.

publications: Annotated[Publications, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Associated publications. Entries may include title, type, authors, doi, pmid, pmcid, url, citation, note, and preferred.

licensing: Annotated[Licensing, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

License text or SPDX identifier and the selected dependency-license compatibility method.

access: Annotated[Access, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

How users can obtain or use the software, independently of its copyright license.

include_metadata: bool#

Whether the project publishes CodeMeta and Citation File Format metadata files alongside their validation workflow.

documentation_builder: DocumentationBuilder | None#

Optional documentation site generator. An empty selection means documentation is plain Markdown.

documentation_types: Annotated[DocumentationTypes, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

SMP documentation categories the project provides. API and technical reference material are part of developer documentation.

community_files: Annotated[CommunityFiles, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Standard root community files the project provides. CONTRIBUTING.md and SUPPORT.md imply the corresponding GitHub collaboration files.

code_review_policy: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, json_schema_extra={'contentMediaType': 'text/markdown'})]#

Public code-review policy for proposed changes, including reviewer expectations, approval requirements, and merge conditions. Markdown is supported.

support_routes: Annotated[SupportRoutes, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Public support, bug-reporting, or feature-request systems and their public URLs.

contacts: Annotated[Contacts, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Public contact routes for general community, code-of-conduct, and private security reports.

governance_notes: str | None#

Public governance and decision-making notes.

programming_languages: Annotated[ProgrammingLanguages, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Programming languages used by the project. Entries include a name and may include version_constraint and role from the SMP.

software_functions: Annotated[SoftwareFunctions, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Functions or operations performed by the software. Entries may include operations, inputs, outputs, cmd, and note.

interfaces: Annotated[Interfaces, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Interfaces exposed by the software. Type names the interface; specification and status describe it.

operating_systems: Annotated[OperatingSystems, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Supported operating systems or platforms. Entries may include name, specification, and status from the SMP.

external_dependencies: Annotated[ExternalDependencies, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

External software dependencies or standards. Entries may include name, version_constraint, url, license, and purpose.

external_services: Annotated[ExternalServices, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

External public services, partners, or roles needed by the project. Entries may include name, provider, service_types, quantity, and cost_coverage.

test_types: Annotated[TestTypes, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Types of tests used or desired. Supported values match the SMP testing checklist.

test_frameworks: Annotated[TestFrameworks, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Testing frameworks used by the project.

quality_tools: Annotated[QualityTools, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Optional primary formatter, linter, and static type checker.

project_manager: ProjectManager | None#

Primary project and dependency manager, which determines setup, command execution, lockfile handling, and CI.

versioning: Annotated[Versioning, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Version value and public release policy. Empty properties leave the policy unspecified.

distribution_channels: Annotated[DistributionChannels, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Controlled public distribution routes, including package registries, releases, archives, installers, and hosted services.

containerization: Annotated[ContainerizationModel, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Container recipes the project ships. Project managers and lockfiles are declared separately.

resource_requirements: str | None#

Public typical and worst-case memory, storage, compute, GPU, wall-clock, or scaling requirements.

maintenance_level: MaintenanceLevel | None#

Public maintenance commitment after active development winds down; leave empty when no commitment is declared.

continuity_plan: str | None#

Public continuity or handover plan.

retirement_criteria: Annotated[RetirementCriteria, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Public conditions under which the software may be retired.

public_risk_notes: str | None#

Public risk or mitigation notes. Sensitive security, privacy, or compliance details should not be included.

regulatory_requirements: Annotated[RegulatoryRequirements, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Controlled and additional public regulatory, quality, policy, or availability requirements.

security_measures: Annotated[SecurityMeasures, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Controlled and additional public security measures protecting the software and its data.

data_management: Annotated[DataManagement, FieldInfo(annotation=NoneType, required=True, validate_default=True)]#

Public sensitive-data statement and DMP reference or contact route.

class rsm_schema.generated.Registry(*, name, url_or_id=None, notes=None)[source]#

Bases: BaseModel

Parameters:
  • name (Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • url_or_id (str | None)

  • notes (str | None)

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

name: Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
url_or_id: str | None#
notes: str | None#
class rsm_schema.generated.RelatedSoftware(*, name=None, url_or_doi=None, relationship=None)[source]#

Bases: BaseModel

Parameters:
  • name (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • url_or_doi (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • relationship (str | None)

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

name: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
url_or_doi: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
relationship: str | None#
class rsm_schema.generated.SoftwareFunction(*, operations=None, inputs=None, outputs=None, cmd=None, note=None)[source]#

Bases: BaseModel

Functions or operations performed by the software. Entries may include operations, inputs, outputs, cmd, and note.

Parameters:
model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

operations: list[EdamTerm] | None#
inputs: list[FunctionIo] | None#
outputs: list[FunctionIo] | None#
cmd: str | None#
note: str | None#
class rsm_schema.generated.SupportRoute(*, system, url=None)[source]#

Bases: BaseModel

Parameters:
  • system (Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])])

  • url (Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])])

model_config: ClassVar[ConfigDict] = {'extra': 'forbid', 'populate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

system: Annotated[str, FieldInfo(annotation=NoneType, required=True, metadata=[MinLen(min_length=1)])]#
url: Annotated[str | None, FieldInfo(annotation=NoneType, required=True, metadata=[_PydanticGeneralMetadata(pattern='^(?:[A-Za-z][A-Za-z0-9+.-]*:.*)?$')])]#