From cffee395f6f1ec88b6b0359142ab543c57ace24b Mon Sep 17 00:00:00 2001 From: Isaac To Date: Tue, 10 Mar 2026 11:14:01 -0700 Subject: [PATCH 01/38] build(hatch-env): specify env for conversion to LinkML and back Specify Hatch-managed env for auto converting `dandischema.models` to LinkML schema and back to Pydantic models --- pyproject.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index dca8b6b2..1d534fcc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,6 +62,12 @@ all = [ installer = "uv" python = "3.10" +# Env for auto converting `dandischema.models` to LinkML schema and back to Pydantic models +[tool.hatch.envs.linkml-auto-converted] +dependencies = [ + "pydantic2linkml @ git+https://github.com/dandi/pydantic2linkml.git" +] + [tool.setuptools.packages.find] namespaces = true include = ["dandischema*"] From 21e7e9ca4cc841bc9b56559b23019ba70e423d8c Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Tue, 10 Mar 2026 15:46:14 -0400 Subject: [PATCH 02/38] [DATALAD RUNCMD] Auto-convert the model === Do not change lines below === { "chain": [], "cmd": "hatch run linkml-auto-converted:2linkml", "exit": 0, "extra_inputs": [], "inputs": [], "outputs": [], "pwd": "." } ^^^ Do not change lines above ^^^ --- dandischema/models.yaml | 2304 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 2304 insertions(+) create mode 100644 dandischema/models.yaml diff --git a/dandischema/models.yaml b/dandischema/models.yaml new file mode 100644 index 00000000..f4ee6540 --- /dev/null +++ b/dandischema/models.yaml @@ -0,0 +1,2304 @@ +name: dandi-schema +status: eunal:concept-status/DRAFT +id: https://schema.dandiarchive.org/s/dandi/v0.7 +version: 0.7.0 +imports: +- linkml:types +prefixes: + linkml: + prefix_prefix: linkml + prefix_reference: https://w3id.org/linkml/ + test_schema: + prefix_prefix: test_schema + prefix_reference: http://example.org/test-schema/ +default_prefix: test_schema +default_range: string +enums: + AccessType: + name: AccessType + description: An enumeration of access status options + permissible_values: + dandi:OpenAccess: + text: dandi:OpenAccess + meaning: dandi:OpenAccess + dandi:EmbargoedAccess: + text: dandi:EmbargoedAccess + meaning: dandi:EmbargoedAccess + AgeReferenceType: + name: AgeReferenceType + description: An enumeration of age reference + permissible_values: + dandi:BirthReference: + text: dandi:BirthReference + meaning: dandi:BirthReference + dandi:GestationalReference: + text: dandi:GestationalReference + meaning: dandi:GestationalReference + DigestType: + name: DigestType + description: An enumeration of checksum types + permissible_values: + dandi:md5: + text: dandi:md5 + meaning: dandi:md5 + dandi:sha1: + text: dandi:sha1 + meaning: dandi:sha1 + dandi:sha2-256: + text: dandi:sha2-256 + meaning: dandi:sha2-256 + dandi:sha3-256: + text: dandi:sha3-256 + meaning: dandi:sha3-256 + dandi:blake2b-256: + text: dandi:blake2b-256 + meaning: dandi:blake2b-256 + dandi:blake3: + text: dandi:blake3 + meaning: dandi:blake3 + dandi:dandi-etag: + text: dandi:dandi-etag + meaning: dandi:dandi-etag + dandi:dandi-zarr-checksum: + text: dandi:dandi-zarr-checksum + meaning: dandi:dandi-zarr-checksum + IdentifierType: + name: IdentifierType + description: An enumeration of identifiers + permissible_values: + dandi:doi: + text: dandi:doi + meaning: dandi:doi + dandi:orcid: + text: dandi:orcid + meaning: dandi:orcid + dandi:ror: + text: dandi:ror + meaning: dandi:ror + dandi:dandi: + text: dandi:dandi + meaning: dandi:dandi + dandi:rrid: + text: dandi:rrid + meaning: dandi:rrid + LicenseType: + name: LicenseType + description: An enumeration. + permissible_values: + spdx:CC0-1.0: + text: spdx:CC0-1.0 + meaning: spdx:CC0-1.0 + spdx:CC-BY-4.0: + text: spdx:CC-BY-4.0 + meaning: spdx:CC-BY-4.0 + ParticipantRelationType: + name: ParticipantRelationType + description: An enumeration of participant relations + permissible_values: + dandi:isChildOf: + text: dandi:isChildOf + meaning: dandi:isChildOf + dandi:isParentOf: + text: dandi:isParentOf + meaning: dandi:isParentOf + dandi:isSiblingOf: + text: dandi:isSiblingOf + meaning: dandi:isSiblingOf + dandi:isMonozygoticTwinOf: + text: dandi:isMonozygoticTwinOf + meaning: dandi:isMonozygoticTwinOf + dandi:isDizygoticTwinOf: + text: dandi:isDizygoticTwinOf + meaning: dandi:isDizygoticTwinOf + RelationType: + name: RelationType + description: An enumeration of resource relations + permissible_values: + dcite:IsCitedBy: + text: dcite:IsCitedBy + meaning: dcite:IsCitedBy + dcite:Cites: + text: dcite:Cites + meaning: dcite:Cites + dcite:IsSupplementTo: + text: dcite:IsSupplementTo + meaning: dcite:IsSupplementTo + dcite:IsSupplementedBy: + text: dcite:IsSupplementedBy + meaning: dcite:IsSupplementedBy + dcite:IsContinuedBy: + text: dcite:IsContinuedBy + meaning: dcite:IsContinuedBy + dcite:Continues: + text: dcite:Continues + meaning: dcite:Continues + dcite:Describes: + text: dcite:Describes + meaning: dcite:Describes + dcite:IsDescribedBy: + text: dcite:IsDescribedBy + meaning: dcite:IsDescribedBy + dcite:HasMetadata: + text: dcite:HasMetadata + meaning: dcite:HasMetadata + dcite:IsMetadataFor: + text: dcite:IsMetadataFor + meaning: dcite:IsMetadataFor + dcite:HasVersion: + text: dcite:HasVersion + meaning: dcite:HasVersion + dcite:IsVersionOf: + text: dcite:IsVersionOf + meaning: dcite:IsVersionOf + dcite:IsNewVersionOf: + text: dcite:IsNewVersionOf + meaning: dcite:IsNewVersionOf + dcite:IsPreviousVersionOf: + text: dcite:IsPreviousVersionOf + meaning: dcite:IsPreviousVersionOf + dcite:IsPartOf: + text: dcite:IsPartOf + meaning: dcite:IsPartOf + dcite:HasPart: + text: dcite:HasPart + meaning: dcite:HasPart + dcite:IsReferencedBy: + text: dcite:IsReferencedBy + meaning: dcite:IsReferencedBy + dcite:References: + text: dcite:References + meaning: dcite:References + dcite:IsDocumentedBy: + text: dcite:IsDocumentedBy + meaning: dcite:IsDocumentedBy + dcite:Documents: + text: dcite:Documents + meaning: dcite:Documents + dcite:IsCompiledBy: + text: dcite:IsCompiledBy + meaning: dcite:IsCompiledBy + dcite:Compiles: + text: dcite:Compiles + meaning: dcite:Compiles + dcite:IsVariantFormOf: + text: dcite:IsVariantFormOf + meaning: dcite:IsVariantFormOf + dcite:IsOriginalFormOf: + text: dcite:IsOriginalFormOf + meaning: dcite:IsOriginalFormOf + dcite:IsIdenticalTo: + text: dcite:IsIdenticalTo + meaning: dcite:IsIdenticalTo + dcite:IsReviewedBy: + text: dcite:IsReviewedBy + meaning: dcite:IsReviewedBy + dcite:Reviews: + text: dcite:Reviews + meaning: dcite:Reviews + dcite:IsDerivedFrom: + text: dcite:IsDerivedFrom + meaning: dcite:IsDerivedFrom + dcite:IsSourceOf: + text: dcite:IsSourceOf + meaning: dcite:IsSourceOf + dcite:IsRequiredBy: + text: dcite:IsRequiredBy + meaning: dcite:IsRequiredBy + dcite:Requires: + text: dcite:Requires + meaning: dcite:Requires + dcite:Obsoletes: + text: dcite:Obsoletes + meaning: dcite:Obsoletes + dcite:IsObsoletedBy: + text: dcite:IsObsoletedBy + meaning: dcite:IsObsoletedBy + dcite:IsPublishedIn: + text: dcite:IsPublishedIn + meaning: dcite:IsPublishedIn + ResourceType: + name: ResourceType + description: An enumeration of resource types + permissible_values: + dcite:Audiovisual: + text: dcite:Audiovisual + meaning: dcite:Audiovisual + dcite:Book: + text: dcite:Book + meaning: dcite:Book + dcite:BookChapter: + text: dcite:BookChapter + meaning: dcite:BookChapter + dcite:Collection: + text: dcite:Collection + meaning: dcite:Collection + dcite:ComputationalNotebook: + text: dcite:ComputationalNotebook + meaning: dcite:ComputationalNotebook + dcite:ConferencePaper: + text: dcite:ConferencePaper + meaning: dcite:ConferencePaper + dcite:ConferenceProceeding: + text: dcite:ConferenceProceeding + meaning: dcite:ConferenceProceeding + dcite:DataPaper: + text: dcite:DataPaper + meaning: dcite:DataPaper + dcite:Dataset: + text: dcite:Dataset + meaning: dcite:Dataset + dcite:Dissertation: + text: dcite:Dissertation + meaning: dcite:Dissertation + dcite:Event: + text: dcite:Event + meaning: dcite:Event + dcite:Image: + text: dcite:Image + meaning: dcite:Image + dcite:Instrument: + text: dcite:Instrument + meaning: dcite:Instrument + dcite:InteractiveResource: + text: dcite:InteractiveResource + meaning: dcite:InteractiveResource + dcite:Journal: + text: dcite:Journal + meaning: dcite:Journal + dcite:JournalArticle: + text: dcite:JournalArticle + meaning: dcite:JournalArticle + dcite:Model: + text: dcite:Model + meaning: dcite:Model + dcite:OutputManagementPlan: + text: dcite:OutputManagementPlan + meaning: dcite:OutputManagementPlan + dcite:PeerReview: + text: dcite:PeerReview + meaning: dcite:PeerReview + dcite:PhysicalObject: + text: dcite:PhysicalObject + meaning: dcite:PhysicalObject + dcite:Preprint: + text: dcite:Preprint + meaning: dcite:Preprint + dcite:Report: + text: dcite:Report + meaning: dcite:Report + dcite:Service: + text: dcite:Service + meaning: dcite:Service + dcite:Software: + text: dcite:Software + meaning: dcite:Software + dcite:Sound: + text: dcite:Sound + meaning: dcite:Sound + dcite:Standard: + text: dcite:Standard + meaning: dcite:Standard + dcite:StudyRegistration: + text: dcite:StudyRegistration + meaning: dcite:StudyRegistration + dcite:Text: + text: dcite:Text + meaning: dcite:Text + dcite:Workflow: + text: dcite:Workflow + meaning: dcite:Workflow + dcite:Other: + text: dcite:Other + meaning: dcite:Other + RoleType: + name: RoleType + description: An enumeration of roles + permissible_values: + dcite:Author: + text: dcite:Author + meaning: dcite:Author + dcite:Conceptualization: + text: dcite:Conceptualization + meaning: dcite:Conceptualization + dcite:ContactPerson: + text: dcite:ContactPerson + meaning: dcite:ContactPerson + dcite:DataCollector: + text: dcite:DataCollector + meaning: dcite:DataCollector + dcite:DataCurator: + text: dcite:DataCurator + meaning: dcite:DataCurator + dcite:DataManager: + text: dcite:DataManager + meaning: dcite:DataManager + dcite:FormalAnalysis: + text: dcite:FormalAnalysis + meaning: dcite:FormalAnalysis + dcite:FundingAcquisition: + text: dcite:FundingAcquisition + meaning: dcite:FundingAcquisition + dcite:Investigation: + text: dcite:Investigation + meaning: dcite:Investigation + dcite:Maintainer: + text: dcite:Maintainer + meaning: dcite:Maintainer + dcite:Methodology: + text: dcite:Methodology + meaning: dcite:Methodology + dcite:Producer: + text: dcite:Producer + meaning: dcite:Producer + dcite:ProjectLeader: + text: dcite:ProjectLeader + meaning: dcite:ProjectLeader + dcite:ProjectManager: + text: dcite:ProjectManager + meaning: dcite:ProjectManager + dcite:ProjectMember: + text: dcite:ProjectMember + meaning: dcite:ProjectMember + dcite:ProjectAdministration: + text: dcite:ProjectAdministration + meaning: dcite:ProjectAdministration + dcite:Researcher: + text: dcite:Researcher + meaning: dcite:Researcher + dcite:Resources: + text: dcite:Resources + meaning: dcite:Resources + dcite:Software: + text: dcite:Software + meaning: dcite:Software + dcite:Supervision: + text: dcite:Supervision + meaning: dcite:Supervision + dcite:Validation: + text: dcite:Validation + meaning: dcite:Validation + dcite:Visualization: + text: dcite:Visualization + meaning: dcite:Visualization + dcite:Funder: + text: dcite:Funder + meaning: dcite:Funder + dcite:Sponsor: + text: dcite:Sponsor + meaning: dcite:Sponsor + dcite:StudyParticipant: + text: dcite:StudyParticipant + meaning: dcite:StudyParticipant + dcite:Affiliation: + text: dcite:Affiliation + meaning: dcite:Affiliation + dcite:EthicsApproval: + text: dcite:EthicsApproval + meaning: dcite:EthicsApproval + dcite:Other: + text: dcite:Other + meaning: dcite:Other +slots: + about: + name: about + notes: + - 'pydantic2linkml: Warning: The translation is incomplete. Tagged union types + are yet to be supported.' + required: false + multivalued: true + access: + name: access + notes: + - 'pydantic2linkml: Unable to express the default factory, + at 0x7f8c96c35ea0>, in LinkML.' + - 'pydantic2linkml: Unable to translate the logic contained in the after validation + function, .' + range: AccessRequirements + required: false + multivalued: true + acknowledgement: + name: acknowledgement + range: string + required: false + affiliation: + name: affiliation + range: Affiliation + required: false + multivalued: true + age: + name: age + range: PropertyValue + required: false + alleles: + name: alleles + range: Allele + required: true + multivalued: true + alleleSymbol: + name: alleleSymbol + range: string + required: false + alleleType: + name: alleleType + range: string + required: false + altName: + name: altName + range: string + required: false + multivalued: true + anatomy: + name: anatomy + range: Anatomy + required: false + multivalued: true + approach: + name: approach + range: ApproachType + required: false + multivalued: true + assayType: + name: assayType + range: AssayType + required: false + multivalued: true + assetsSummary: + name: assetsSummary + range: AssetsSummary + required: true + awardNumber: + name: awardNumber + range: string + required: false + blobDateModified: + name: blobDateModified + notes: + - 'pydantic2linkml: Unable to express the microseconds precision constraint of + truncate. LinkML lacks direct support for this restriction.' + range: datetime + required: false + cellLine: + name: cellLine + range: string + required: false + citation: + name: citation + range: string + required: true + contactPoint: + name: contactPoint + range: ContactPoint + required: false + contentSize: + name: contentSize + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the after validation + function, >.' + - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema + contains a choice of type str. The choice type is yet to be supported. (core + schema: {''type'': ''union'', ''choices'': [{''type'': ''str'', ''pattern'': + ''^\\s*(\\d*\\.?\\d+)\\s*(\\w+)?''}, {''type'': ''int'', ''ge'': 0}], ''custom_error_type'': + ''byte_size'', ''custom_error_message'': ''could not parse value and unit from + byte string''}).' + required: true + contentUrl: + name: contentUrl + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation + function, .wrap_val + at 0x7f8c967983a0>.' + range: uri + required: true + multivalued: true + pattern: ^(?i:http|https)://[^\s]+$ + contributor: + name: contributor + notes: + - 'pydantic2linkml: Warning: The translation is incomplete. Tagged union types + are yet to be supported.' + required: false + multivalued: true + dataStandard: + name: dataStandard + range: StandardsType + required: false + multivalued: true + dataType: + name: dataType + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation + function, .wrap_val + at 0x7f8c96c370a0>.' + range: uri + required: false + pattern: ^(?i:http|https)://[^\s]+$ + dateCreated: + name: dateCreated + notes: + - 'pydantic2linkml: Unable to express the microseconds precision constraint of + truncate. LinkML lacks direct support for this restriction.' + range: datetime + required: false + dateModified: + name: dateModified + notes: + - 'pydantic2linkml: Unable to express the microseconds precision constraint of + truncate. LinkML lacks direct support for this restriction.' + range: datetime + required: false + datePublished: + name: datePublished + notes: + - 'pydantic2linkml: Unable to express the microseconds precision constraint of + truncate. LinkML lacks direct support for this restriction.' + range: datetime + required: true + description: + name: description + range: string + required: false + digest: + name: digest + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the after validation + function, >.' + - 'pydantic2linkml: Warning: The translation is incomplete. `dict` types are yet + to be supported.' + required: true + disorder: + name: disorder + range: Disorder + required: false + multivalued: true + doi: + name: doi + ifabsent: string() + range: string + required: false + pattern: ^(10\.\d{4,}/[a-z][-a-z]*\.\d{6}/\d+\.\d+\.\d+|)$ + dxdate: + name: dxdate + notes: + - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema + contains a choice of type date. The choice type is yet to be supported. (core + schema: {''type'': ''union'', ''choices'': [{''type'': ''date''}, {''type'': + ''datetime'', ''microseconds_precision'': ''truncate''}]}).' + required: false + multivalued: true + email: + name: email + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the after validation + function, >.' + range: string + required: false + embargoedUntil: + name: embargoedUntil + range: date + required: false + encodingFormat: + name: encodingFormat + notes: + - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema + contains a choice of type function-wrap. The choice type is yet to be supported. + (core schema: {''type'': ''union'', ''choices'': [{''type'': ''function-wrap'', + ''function'': {''type'': ''no-info'', ''function'': .wrap_val + at 0x7f8c96c372e0>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': + ''function-plain'', ''function'': >, ''info_arg'': True}}, {''type'': ''str''}]}).' + required: true + endDate: + name: endDate + notes: + - 'pydantic2linkml: Unable to express the microseconds precision constraint of + truncate. LinkML lacks direct support for this restriction.' + range: datetime + required: false + ethicsApproval: + name: ethicsApproval + range: EthicsApproval + required: false + multivalued: true + genotype: + name: genotype + notes: + - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema + contains a choice of type list. The choice type is yet to be supported. (core + schema: {''type'': ''union'', ''choices'': [{''type'': ''list'', ''items_schema'': + {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''GenotypeInfo'']}, ''type'': + ''function-after''}, ''default'': ''GenotypeInfo'', ''validate_default'': True}, + ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''locus'': {''type'': + ''model-field'', ''schema'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, ''schema'': + {''type'': ''literal'', ''expected'': [''Locus'']}, ''type'': ''function-after''}, + ''default'': ''Locus'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': + {''readOnly'': True}}}, ''identifier'': {''type'': ''model-field'', ''schema'': + {''type'': ''union'', ''choices'': [{''type'': ''str''}, {''type'': ''list'', + ''items_schema'': {''type'': ''str''}}]}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Identifier for genotyping locus.''}, ''pydantic_js_extra'': + {''nskey'': ''schema''}}}, ''locusType'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': + ''str''}}, ''default'': None}, ''metadata'': {}}}, ''model_name'': ''Locus'', + ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': + ''model_post_init'', ''config'': {''title'': ''Locus''}, ''ref'': ''dandischema.models.Locus:94399352651488'', + ''metadata'': {''pydantic_js_functions'': [>]}}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Locus at which information was extracted.''}}}, ''alleles'': + {''type'': ''model-field'', ''schema'': {''type'': ''list'', ''items_schema'': + {''type'': ''model'', ''cls'': , ''schema'': + {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Allele'']}, ''type'': ''function-after''}, + ''default'': ''Allele'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': + {''readOnly'': True}}}, ''identifier'': {''type'': ''model-field'', ''schema'': + {''type'': ''union'', ''choices'': [{''type'': ''str''}, {''type'': ''list'', + ''items_schema'': {''type'': ''str''}}]}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Identifier for genotyping allele.''}, ''pydantic_js_extra'': + {''nskey'': ''schema''}}}, ''alleleSymbol'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': + ''str''}}, ''default'': None}, ''metadata'': {}}, ''alleleType'': {''type'': + ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': + ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': + {}}}, ''model_name'': ''Allele'', ''computed_fields'': []}, ''custom_init'': + False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': + {''title'': ''Allele''}, ''ref'': ''dandischema.models.Allele:94399352775296'', + ''metadata'': {''pydantic_js_functions'': [>]}}}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Information about alleles at the locus.''}}}, ''wasGeneratedBy'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': + {''type'': ''model'', ''cls'': , ''schema'': + {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Session'']}, ''type'': + ''function-after''}, ''default'': ''Session'', ''validate_default'': True}, + ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, + ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''name'': {''type'': + ''model-field'', ''schema'': {''type'': ''str'', ''max_length'': 150}, ''metadata'': + {''pydantic_js_updates'': {''title'': ''Name of session'', ''description'': + ''The name of the logical session associated with the asset.''}, ''pydantic_js_extra'': + {''nskey'': ''schema''}}}, ''description'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': + ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': + ''A brief description of the session.''}, ''pydantic_js_extra'': {''nskey'': + ''schema''}}}, ''startDate'': {''type'': ''model-field'', ''schema'': {''type'': + ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''datetime'', + ''microseconds_precision'': ''truncate''}}, ''default'': None}, ''metadata'': + {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''endDate'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''datetime'', ''microseconds_precision'': ''truncate''}}, ''default'': + None}, ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''wasAssociatedWith'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': + {''type'': ''tagged-union'', ''choices'': {''Person'': {''function'': {''type'': + ''no-info'', ''function'': }, ''schema'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Person'']}, ''type'': ''function-after''}, + ''default'': ''Person'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': + {''readOnly'': True}}}, ''identifier'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': + ''str'', ''pattern'': ''^\\d{4}-\\d{4}-\\d{4}-(\\d{3}X|\\d{4})$''}}, ''default'': + None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''An ORCID identifier'', + ''description'': ''An ORCID (orcid.org) identifier for an individual.''}, ''pydantic_js_extra'': + {''nskey'': ''schema''}}}, ''name'': {''type'': ''model-field'', ''schema'': + {''type'': ''str'', ''pattern'': "^([\\w\\s\\-\\.'']+),\\s+([\\w\\s\\-\\.'']+)$"}, + ''metadata'': {''pydantic_js_updates'': {''title'': ''Use Last, First. Example: + Lovelace, Augusta Ada'', ''description'': ''Use the format: familyname, given + names ...''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''email'': {''type'': + ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': + ''nullable'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': + >}, + ''schema'': {''type'': ''str''}, ''metadata'': {''pydantic_js_functions'': [>]}, + ''type'': ''function-after''}}, ''default'': None}, ''metadata'': {''pydantic_js_extra'': + {''nskey'': ''schema''}}}, ''url'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': + ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val at 0x7f8c96c36320>}, + ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, + ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': + ''function-plain'', ''function'': >, ''info_arg'': True}}}, ''default'': None}, + ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''roleName'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': + {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models.RoleType:94399351385504''}}}, + ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''Role'', + ''description'': ''Role(s) of the contributor. Multiple roles can be selected.''}, + ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''includeInCitation'': {''type'': + ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': + ''bool''}, ''default'': True}, ''metadata'': {''pydantic_js_updates'': {''title'': + ''Include contributor in citation'', ''description'': ''A flag to indicate whether + a contributor should be included when generating a citation for the item.''}, + ''pydantic_js_extra'': {''nskey'': ''dandi''}}}, ''awardNumber'': {''type'': + ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': + ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': + {''pydantic_js_updates'': {''title'': ''Identifier for an award'', ''description'': + ''Identifier associated with a sponsored or gift award.''}, ''pydantic_js_extra'': + {''nskey'': ''dandi''}}}, ''affiliation'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': + ''list'', ''items_schema'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Affiliation'']}, ''type'': + ''function-after''}, ''default'': ''Affiliation'', ''validate_default'': True}, + ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''str'', ''pattern'': ''^https://ror.org/[a-z0-9]+$''}}, + ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''A + ror.org identifier'', ''description'': ''Use an ror.org identifier for institutions.''}, + ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''name'': {''type'': ''model-field'', + ''schema'': {''type'': ''str''}, ''metadata'': {''pydantic_js_updates'': {''description'': + ''Name of organization''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, + ''model_name'': ''Affiliation'', ''computed_fields'': []}, ''custom_init'': + False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': + {''title'': ''Affiliation''}, ''ref'': ''dandischema.models.Affiliation:94399351361968'', + ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': + {''pydantic_js_updates'': {''description'': ''An organization that this person + is affiliated with.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': + ''Person'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': + False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Person''}}, + ''ref'': ''dandischema.models.Person:94399351924672'', ''metadata'': {''pydantic_js_functions'': + [>]}, + ''type'': ''function-after''}, ''Organization'': {''type'': ''definition-ref'', + ''schema_ref'': ''dandischema.models.Organization:94399348768928''}, ''Software'': + {''type'': ''model'', ''cls'': , ''schema'': + {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Software'']}, ''type'': + ''function-after''}, ''default'': ''Software'', ''validate_default'': True}, + ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''str'', ''pattern'': ''^RRID:.*''}}, + ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''Research + resource identifier'', ''description'': ''RRID of the software from scicrunch.org.''}, + ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''name'': {''type'': ''model-field'', + ''schema'': {''type'': ''str''}, ''metadata'': {''pydantic_js_extra'': {''nskey'': + ''schema''}}}, ''version'': {''type'': ''model-field'', ''schema'': {''type'': + ''str''}, ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''url'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''function-wrap'', ''function'': + {''type'': ''no-info'', ''function'': .wrap_val + at 0x7f8c96c36a70>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': + ''function-plain'', ''function'': >, ''info_arg'': True}}}, ''default'': None}, + ''metadata'': {''pydantic_js_updates'': {''description'': ''Web page for the + software.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': + ''Software'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': + False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Software''}, + ''ref'': ''dandischema.models.Software:94399351823024'', ''metadata'': {''pydantic_js_functions'': + [>]}}, + ''Agent'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, ''schema'': + {''type'': ''literal'', ''expected'': [''Agent'']}, ''type'': ''function-after''}, + ''default'': ''Agent'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': + {''readOnly'': True}}}, ''identifier'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': + ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': + ''Identifier'', ''description'': ''Identifier for an agent.''}, ''pydantic_js_extra'': + {''nskey'': ''schema''}}}, ''name'': {''type'': ''model-field'', ''schema'': + {''type'': ''str''}, ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, + ''url'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''function-wrap'', ''function'': + {''type'': ''no-info'', ''function'': .wrap_val + at 0x7f8c96c368c0>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': + ''function-plain'', ''function'': >, ''info_arg'': True}}}, ''default'': None}, + ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': + ''Agent'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': + False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Agent''}, + ''ref'': ''dandischema.models.Agent:94399351861984'', ''metadata'': {''pydantic_js_functions'': + [>]}}}, + ''discriminator'': ''schemaKey'', ''strict'': False, ''from_attributes'': True, + ''metadata'': {}}}}, ''default'': None}, ''metadata'': {''pydantic_js_extra'': + {''nskey'': ''prov''}}}, ''used'': {''type'': ''model-field'', ''schema'': {''type'': + ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''list'', + ''items_schema'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Equipment'']}, ''type'': + ''function-after''}, ''default'': ''Equipment'', ''validate_default'': True}, + ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, + ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''name'': {''type'': + ''model-field'', ''schema'': {''type'': ''str'', ''max_length'': 150}, ''metadata'': + {''pydantic_js_updates'': {''title'': ''Title'', ''description'': ''A name for + the equipment.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''description'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, + ''metadata'': {''pydantic_js_updates'': {''description'': ''The description + of the equipment.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': + ''Equipment'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': + False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Equipment''}, + ''ref'': ''dandischema.models.Equipment:94399352248096'', ''metadata'': {''pydantic_js_functions'': + [>]}}}}, + ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': + ''A listing of equipment used for the activity.''}, ''pydantic_js_extra'': {''nskey'': + ''prov''}}}}, ''model_name'': ''Session'', ''computed_fields'': []}, ''custom_init'': + False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': + {''title'': ''Session''}, ''ref'': ''dandischema.models.Session:94399352644368'', + ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': + {''pydantic_js_updates'': {''description'': ''Information about session activity + used to determine genotype.''}, ''pydantic_js_extra'': {''nskey'': ''prov''}}}}, + ''model_name'': ''GenotypeInfo'', ''computed_fields'': []}, ''custom_init'': + False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': + {''title'': ''GenotypeInfo''}, ''ref'': ''dandischema.models.GenotypeInfo:94399353584960'', + ''metadata'': {''pydantic_js_functions'': [>]}}}, {''type'': ''str''}]}).' + required: false + hasMember: + name: hasMember + range: string + required: false + multivalued: true + id: + name: id + range: string + required: false + identifier: + name: identifier + includeInCitation: + name: includeInCitation + ifabsent: 'True' + range: boolean + required: false + keywords: + name: keywords + range: string + required: false + multivalued: true + license: + name: license + range: LicenseType + required: false + multivalued: true + locus: + name: locus + range: Locus + required: true + locusType: + name: locusType + range: string + required: false + manifestLocation: + name: manifestLocation + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation + function, .wrap_val + at 0x7f8c96c36830>.' + range: uri + required: true + multivalued: true + pattern: ^(?i:http|https)://[^\s]+$ + minimum_cardinality: 1 + maxValue: + name: maxValue + notes: + - 'pydantic2linkml: LinkML does not have support for `''+inf''`, `''-inf''`, and + `''NaN''` values. Support for these values is not translated.' + range: float + required: false + measurementTechnique: + name: measurementTechnique + range: MeasurementTechniqueType + required: false + multivalued: true + minValue: + name: minValue + notes: + - 'pydantic2linkml: LinkML does not have support for `''+inf''`, `''-inf''`, and + `''NaN''` values. Support for these values is not translated.' + range: float + required: false + name: + name: name + range: string + numberOfBytes: + name: numberOfBytes + range: integer + required: true + numberOfCells: + name: numberOfCells + range: integer + required: false + numberOfFiles: + name: numberOfFiles + range: integer + required: true + numberOfSamples: + name: numberOfSamples + range: integer + required: false + numberOfSubjects: + name: numberOfSubjects + range: integer + required: false + path: + name: path + range: string + required: true + propertyID: + name: propertyID + notes: + - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema + contains a choice of type definition-ref. The choice type is yet to be supported. + (core schema: {''type'': ''union'', ''choices'': [{''type'': ''definition-ref'', + ''schema_ref'': ''dandischema.models.IdentifierType:94399351374048''}, {''type'': + ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val at 0x7f8c96c17c70>}, + ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, + ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': + ''function-plain'', ''function'': >, ''info_arg'': True}}]}).' + required: false + protocol: + name: protocol + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation + function, .wrap_val + at 0x7f8c96c36f80>.' + range: uri + required: false + multivalued: true + pattern: ^(?i:http|https)://[^\s]+$ + publishedBy: + name: publishedBy + notes: + - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema + contains a choice of type function-wrap. The choice type is yet to be supported. + (core schema: {''type'': ''union'', ''choices'': [{''type'': ''function-wrap'', + ''function'': {''type'': ''no-info'', ''function'': .wrap_val + at 0x7f8c96c37a30>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': + ''function-plain'', ''function'': >, ''info_arg'': True}}, {''type'': ''model'', + ''cls'': , ''schema'': {''type'': + ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': + ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': + ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, + ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''PublishActivity'']}, ''type'': + ''function-after''}, ''default'': ''PublishActivity'', ''validate_default'': + True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, + ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''name'': {''type'': + ''model-field'', ''schema'': {''type'': ''str'', ''max_length'': 150}, ''metadata'': + {''pydantic_js_updates'': {''title'': ''Title'', ''description'': ''The name + of the activity.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''description'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, + ''metadata'': {''pydantic_js_updates'': {''description'': ''The description + of the activity.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''startDate'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''datetime'', ''microseconds_precision'': + ''truncate''}}, ''default'': None}, ''metadata'': {''pydantic_js_extra'': {''nskey'': + ''schema''}}}, ''endDate'': {''type'': ''model-field'', ''schema'': {''type'': + ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''datetime'', + ''microseconds_precision'': ''truncate''}}, ''default'': None}, ''metadata'': + {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''wasAssociatedWith'': {''type'': + ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': + ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': {''type'': + ''tagged-union'', ''choices'': {''Person'': {''function'': {''type'': ''no-info'', + ''function'': }, + ''schema'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Person'']}, ''type'': ''function-after''}, + ''default'': ''Person'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': + {''readOnly'': True}}}, ''identifier'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': + ''str'', ''pattern'': ''^\\d{4}-\\d{4}-\\d{4}-(\\d{3}X|\\d{4})$''}}, ''default'': + None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''An ORCID identifier'', + ''description'': ''An ORCID (orcid.org) identifier for an individual.''}, ''pydantic_js_extra'': + {''nskey'': ''schema''}}}, ''name'': {''type'': ''model-field'', ''schema'': + {''type'': ''str'', ''pattern'': "^([\\w\\s\\-\\.'']+),\\s+([\\w\\s\\-\\.'']+)$"}, + ''metadata'': {''pydantic_js_updates'': {''title'': ''Use Last, First. Example: + Lovelace, Augusta Ada'', ''description'': ''Use the format: familyname, given + names ...''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''email'': {''type'': + ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': + ''nullable'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': + >}, + ''schema'': {''type'': ''str''}, ''metadata'': {''pydantic_js_functions'': [>]}, + ''type'': ''function-after''}}, ''default'': None}, ''metadata'': {''pydantic_js_extra'': + {''nskey'': ''schema''}}}, ''url'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': + ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val at 0x7f8c96c36320>}, + ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, + ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': + ''function-plain'', ''function'': >, ''info_arg'': True}}}, ''default'': None}, + ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''roleName'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': + {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models.RoleType:94399351385504''}}}, + ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''Role'', + ''description'': ''Role(s) of the contributor. Multiple roles can be selected.''}, + ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''includeInCitation'': {''type'': + ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': + ''bool''}, ''default'': True}, ''metadata'': {''pydantic_js_updates'': {''title'': + ''Include contributor in citation'', ''description'': ''A flag to indicate whether + a contributor should be included when generating a citation for the item.''}, + ''pydantic_js_extra'': {''nskey'': ''dandi''}}}, ''awardNumber'': {''type'': + ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': + ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': + {''pydantic_js_updates'': {''title'': ''Identifier for an award'', ''description'': + ''Identifier associated with a sponsored or gift award.''}, ''pydantic_js_extra'': + {''nskey'': ''dandi''}}}, ''affiliation'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': + ''list'', ''items_schema'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Affiliation'']}, ''type'': + ''function-after''}, ''default'': ''Affiliation'', ''validate_default'': True}, + ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''str'', ''pattern'': ''^https://ror.org/[a-z0-9]+$''}}, + ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''A + ror.org identifier'', ''description'': ''Use an ror.org identifier for institutions.''}, + ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''name'': {''type'': ''model-field'', + ''schema'': {''type'': ''str''}, ''metadata'': {''pydantic_js_updates'': {''description'': + ''Name of organization''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, + ''model_name'': ''Affiliation'', ''computed_fields'': []}, ''custom_init'': + False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': + {''title'': ''Affiliation''}, ''ref'': ''dandischema.models.Affiliation:94399351361968'', + ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': + {''pydantic_js_updates'': {''description'': ''An organization that this person + is affiliated with.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': + ''Person'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': + False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Person''}}, + ''ref'': ''dandischema.models.Person:94399351924672'', ''metadata'': {''pydantic_js_functions'': + [>]}, + ''type'': ''function-after''}, ''Organization'': {''function'': {''type'': ''no-info'', + ''function'': }, + ''schema'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Organization'']}, ''type'': + ''function-after''}, ''default'': ''Organization'', ''validate_default'': True}, + ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''str'', ''pattern'': ''^https://ror.org/[a-z0-9]+$''}}, + ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''A + ror.org identifier'', ''description'': ''Use an ror.org identifier for institutions.''}, + ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''name'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_extra'': + {''nskey'': ''schema''}}}, ''email'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''function'': + {''type'': ''no-info'', ''function'': >}, ''schema'': {''type'': ''str''}, ''metadata'': + {''pydantic_js_functions'': [>]}, ''type'': ''function-after''}}, + ''default'': None}, ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, + ''url'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''function-wrap'', ''function'': + {''type'': ''no-info'', ''function'': .wrap_val + at 0x7f8c96c36560>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': + ''function-plain'', ''function'': >, ''info_arg'': True}}}, ''default'': None}, + ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''roleName'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': + {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models.RoleType:94399351385504''}}}, + ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''Role'', + ''description'': ''Role(s) of the contributor. Multiple roles can be selected.''}, + ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''includeInCitation'': {''type'': + ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': + ''bool''}, ''default'': False}, ''metadata'': {''pydantic_js_updates'': {''title'': + ''Include contributor in citation'', ''description'': ''A flag to indicate whether + a contributor should be included when generating a citation for the item''}, + ''pydantic_js_extra'': {''nskey'': ''dandi''}}}, ''awardNumber'': {''type'': + ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': + ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': + {''pydantic_js_updates'': {''title'': ''Identifier for an award'', ''description'': + ''Identifier associated with a sponsored or gift award.''}, ''pydantic_js_extra'': + {''nskey'': ''dandi''}}}, ''contactPoint'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': + ''list'', ''items_schema'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''ContactPoint'']}, ''type'': + ''function-after''}, ''default'': ''ContactPoint'', ''validate_default'': True}, + ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''email'': {''type'': + ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': + ''nullable'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': + >}, + ''schema'': {''type'': ''str''}, ''metadata'': {''pydantic_js_functions'': [>]}, + ''type'': ''function-after''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Email address of contact.''}, ''pydantic_js_extra'': {''nskey'': + ''schema''}}}, ''url'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''function-wrap'', + ''function'': {''type'': ''no-info'', ''function'': .wrap_val + at 0x7f8c96c34940>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': + ''function-plain'', ''function'': >, ''info_arg'': True}}}, ''default'': None}, + ''metadata'': {''pydantic_js_updates'': {''description'': ''A Web page to find + information on how to contact.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, + ''model_name'': ''ContactPoint'', ''computed_fields'': []}, ''custom_init'': + False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': + {''title'': ''ContactPoint''}, ''ref'': ''dandischema.models.ContactPoint:94399351740384'', + ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': + {''pydantic_js_updates'': {''title'': ''Organization contact information'', + ''description'': ''Contact for the organization''}, ''pydantic_js_extra'': {''nskey'': + ''schema''}}}}, ''model_name'': ''Organization'', ''computed_fields'': []}, + ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', + ''config'': {''title'': ''Organization''}}, ''ref'': ''dandischema.models.Organization:94399348768928'', + ''metadata'': {''pydantic_js_functions'': [>]}, ''type'': ''function-after''}, + ''Software'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Software'']}, ''type'': + ''function-after''}, ''default'': ''Software'', ''validate_default'': True}, + ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''str'', ''pattern'': ''^RRID:.*''}}, + ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''Research + resource identifier'', ''description'': ''RRID of the software from scicrunch.org.''}, + ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''name'': {''type'': ''model-field'', + ''schema'': {''type'': ''str''}, ''metadata'': {''pydantic_js_extra'': {''nskey'': + ''schema''}}}, ''version'': {''type'': ''model-field'', ''schema'': {''type'': + ''str''}, ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''url'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''function-wrap'', ''function'': + {''type'': ''no-info'', ''function'': .wrap_val + at 0x7f8c96c36a70>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': + ''function-plain'', ''function'': >, ''info_arg'': True}}}, ''default'': None}, + ''metadata'': {''pydantic_js_updates'': {''description'': ''Web page for the + software.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': + ''Software'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': + False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Software''}, + ''ref'': ''dandischema.models.Software:94399351823024'', ''metadata'': {''pydantic_js_functions'': + [>]}}, + ''Agent'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, ''schema'': + {''type'': ''literal'', ''expected'': [''Agent'']}, ''type'': ''function-after''}, + ''default'': ''Agent'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': + {''readOnly'': True}}}, ''identifier'': {''type'': ''model-field'', ''schema'': + {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': + ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': + ''Identifier'', ''description'': ''Identifier for an agent.''}, ''pydantic_js_extra'': + {''nskey'': ''schema''}}}, ''name'': {''type'': ''model-field'', ''schema'': + {''type'': ''str''}, ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, + ''url'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''function-wrap'', ''function'': + {''type'': ''no-info'', ''function'': .wrap_val + at 0x7f8c96c368c0>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': + ''function-plain'', ''function'': >, ''info_arg'': True}}}, ''default'': None}, + ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': + ''Agent'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': + False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Agent''}, + ''ref'': ''dandischema.models.Agent:94399351861984'', ''metadata'': {''pydantic_js_functions'': + [>]}}}, + ''discriminator'': ''schemaKey'', ''strict'': False, ''from_attributes'': True, + ''metadata'': {}}}}, ''default'': None}, ''metadata'': {''pydantic_js_extra'': + {''nskey'': ''prov''}}}, ''used'': {''type'': ''model-field'', ''schema'': {''type'': + ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''list'', + ''items_schema'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': + {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': + {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': + True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', + ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Equipment'']}, ''type'': + ''function-after''}, ''default'': ''Equipment'', ''validate_default'': True}, + ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, + ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''name'': {''type'': + ''model-field'', ''schema'': {''type'': ''str'', ''max_length'': 150}, ''metadata'': + {''pydantic_js_updates'': {''title'': ''Title'', ''description'': ''A name for + the equipment.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''description'': + {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': + {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, + ''metadata'': {''pydantic_js_updates'': {''description'': ''The description + of the equipment.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': + ''Equipment'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': + False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Equipment''}, + ''ref'': ''dandischema.models.Equipment:94399352248096'', ''metadata'': {''pydantic_js_functions'': + [>]}}}}, + ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': + ''A listing of equipment used for the activity.''}, ''pydantic_js_extra'': {''nskey'': + ''prov''}}}}, ''model_name'': ''PublishActivity'', ''computed_fields'': []}, + ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', + ''config'': {''title'': ''PublishActivity''}, ''ref'': ''dandischema.models.PublishActivity:94399352646832'', + ''metadata'': {''pydantic_js_functions'': [>]}}]}).' + required: true + relatedParticipant: + name: relatedParticipant + range: RelatedParticipant + required: false + multivalued: true + relatedResource: + name: relatedResource + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the after validation + function, .' + range: Resource + required: false + multivalued: true + relation: + name: relation + required: true + releaseNotes: + name: releaseNotes + range: string + required: false + repository: + name: repository + required: false + resourceType: + name: resourceType + range: ResourceType + required: false + roleName: + name: roleName + range: RoleType + required: false + multivalued: true + sameAs: + name: sameAs + required: false + multivalued: true + sampleType: + name: sampleType + range: SampleType + required: true + schemaKey: + name: schemaKey + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the after validation + function, >.' + ifabsent: string(DandiBaseModel) + range: string + required: false + schemaVersion: + name: schemaVersion + ifabsent: string(0.7.0) + range: string + required: false + sex: + name: sex + range: SexType + required: false + species: + name: species + range: SpeciesType + required: false + startDate: + name: startDate + notes: + - 'pydantic2linkml: Unable to express the microseconds precision constraint of + truncate. LinkML lacks direct support for this restriction.' + range: datetime + required: false + status: + name: status + range: AccessType + required: true + strain: + name: strain + range: StrainType + required: false + studyTarget: + name: studyTarget + range: string + required: false + multivalued: true + unitText: + name: unitText + range: string + required: false + url: + name: url + range: uri + required: false + pattern: ^(?i:http|https)://[^\s]+$ + used: + name: used + range: Equipment + required: false + multivalued: true + value: + name: value + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the after validation + function, >.' + - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema + contains a choice of type any. The choice type is yet to be supported. (core + schema: {''type'': ''union'', ''choices'': [{''type'': ''any''}, {''type'': + ''list'', ''items_schema'': {''type'': ''any''}}]}).' + required: false + valueReference: + name: valueReference + range: PropertyValue + required: false + variableMeasured: + name: variableMeasured + required: false + multivalued: true + vendor: + name: vendor + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the after validation + function, .' + range: Organization + required: false + version: + name: version + range: string + required: true + wasAssociatedWith: + name: wasAssociatedWith + notes: + - 'pydantic2linkml: Warning: The translation is incomplete. Tagged union types + are yet to be supported.' + required: false + multivalued: true + wasAttributedTo: + name: wasAttributedTo + range: Participant + required: false + multivalued: true + wasDerivedFrom: + name: wasDerivedFrom + range: BioSample + required: false + multivalued: true + wasGeneratedBy: + name: wasGeneratedBy + required: false + multivalued: true +classes: + Any: + name: Any + description: Any object + class_uri: linkml:Any + AccessRequirements: + name: AccessRequirements + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the AccessRequirements + Pydantic model has changes in value in meta slots: [''ifabsent'', ''notes'', + ''range''] .' + is_a: DandiBaseModel + slots: + - contactPoint + - description + - embargoedUntil + - status + Activity: + name: Activity + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Activity Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - description + - endDate + - identifier + - name + - startDate + - used + - wasAssociatedWith + slot_usage: + identifier: + name: identifier + range: string + required: false + name: + name: name + notes: + - 'pydantic2linkml: LinkML does not have direct support for max length constraints. + The max length constraint of 150 is incorporated into the pattern of the + slot.' + required: true + pattern: ^(?=.{,150}$) + Affiliation: + name: Affiliation + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Affiliation Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - identifier + - name + slot_usage: + identifier: + name: identifier + range: string + required: false + pattern: ^https://ror.org/[a-z0-9]+$ + name: + name: name + required: true + Agent: + name: Agent + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Agent Pydantic model + has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] .' + is_a: DandiBaseModel + slots: + - identifier + - name + - url + slot_usage: + identifier: + name: identifier + range: string + required: false + name: + name: name + required: true + url: + name: url + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation + function, .wrap_val + at 0x7f8c96c368c0>.' + Allele: + name: Allele + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Allele Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - alleleSymbol + - alleleType + - identifier + slot_usage: + identifier: + name: identifier + notes: + - 'pydantic2linkml: Warning: The translation is incomplete. The union core + schema contains a choice of type str. The choice type is yet to be supported. + (core schema: {''type'': ''union'', ''choices'': [{''type'': ''str''}, {''type'': + ''list'', ''items_schema'': {''type'': ''str''}}]}).' + required: true + Anatomy: + name: Anatomy + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Anatomy Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: BaseType + ApproachType: + name: ApproachType + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the ApproachType Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: BaseType + AssayType: + name: AssayType + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the AssayType Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: BaseType + Asset: + name: Asset + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the id slot. The + slot representation of the id field in the Asset Pydantic model has changes + in value in meta slots: [''required''] .' + is_a: BareAsset + slots: + - contentUrl + - identifier + slot_usage: + identifier: + name: identifier + range: string + required: true + pattern: ^(?:urn:uuid:)?[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?4[0-9a-fA-F]{3}-?[89abAB][0-9a-fA-F]{3}-?[0-9a-fA-F]{12}$ + AssetsSummary: + name: AssetsSummary + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the AssetsSummary Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - approach + - dataStandard + - measurementTechnique + - numberOfBytes + - numberOfCells + - numberOfFiles + - numberOfSamples + - numberOfSubjects + - species + - variableMeasured + slot_usage: + species: + name: species + multivalued: true + variableMeasured: + name: variableMeasured + range: string + BareAsset: + name: BareAsset + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the access slot. + The slot representation of the access field in the BareAsset Pydantic model + has changes in value in meta slots: [''notes''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the BareAsset Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the wasGeneratedBy + slot. The slot representation of the wasGeneratedBy field in the BareAsset Pydantic + model lacks meta slots: [''range''] .' + is_a: CommonModel + slots: + - approach + - blobDateModified + - contentSize + - dataType + - dateModified + - digest + - encodingFormat + - measurementTechnique + - path + - sameAs + - variableMeasured + - wasAttributedTo + - wasDerivedFrom + slot_usage: + sameAs: + name: sameAs + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation + function, .wrap_val + at 0x7f8c96c37ac0>.' + range: uri + pattern: ^(?i:http|https)://[^\s]+$ + variableMeasured: + name: variableMeasured + range: PropertyValue + BaseType: + name: BaseType + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the BaseType Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes''] .' + is_a: DandiBaseModel + slots: + - identifier + - name + slot_usage: + identifier: + name: identifier + notes: + - 'pydantic2linkml: Warning: The translation is incomplete. The union core + schema contains a choice of type function-wrap. The choice type is yet to + be supported. (core schema: {''type'': ''union'', ''choices'': [{''type'': + ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val at 0x7f8c96c15d80>}, + ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, + ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': + ''function-plain'', ''function'': >, ''info_arg'': True}}, {''type'': + ''str'', ''pattern'': ''^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$''}], ''mode'': + ''left_to_right'', ''metadata'': {}}).' + required: false + name: + name: name + notes: + - 'pydantic2linkml: LinkML does not have direct support for max length constraints. + The max length constraint of 150 is incorporated into the pattern of the + slot.' + required: false + pattern: ^(?=.{,150}$) + BioSample: + name: BioSample + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the BioSample Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - anatomy + - assayType + - hasMember + - identifier + - sameAs + - sampleType + - wasAttributedTo + - wasDerivedFrom + slot_usage: + identifier: + name: identifier + range: string + required: true + sameAs: + name: sameAs + range: string + CommonModel: + name: CommonModel + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the CommonModel Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes''] .' + is_a: DandiBaseModel + slots: + - about + - access + - acknowledgement + - contributor + - description + - ethicsApproval + - keywords + - license + - name + - protocol + - relatedResource + - repository + - schemaVersion + - studyTarget + - url + - wasGeneratedBy + slot_usage: + name: + name: name + notes: + - 'pydantic2linkml: LinkML does not have direct support for max length constraints. + The max length constraint of 150 is incorporated into the pattern of the + slot.' + required: false + pattern: ^(?=.{,150}$) + repository: + name: repository + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation + function, .wrap_val + at 0x7f8c96c369e0>.' + range: uri + pattern: ^(?i:http|https)://[^\s]+$ + url: + name: url + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation + function, .wrap_val + at 0x7f8c96c34a60>.' + wasGeneratedBy: + name: wasGeneratedBy + range: Activity + ContactPoint: + name: ContactPoint + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the ContactPoint Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - email + - url + slot_usage: + url: + name: url + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation + function, .wrap_val + at 0x7f8c96c34940>.' + Contributor: + name: Contributor + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Contributor Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - awardNumber + - email + - identifier + - includeInCitation + - name + - roleName + - url + slot_usage: + identifier: + name: identifier + range: string + required: false + name: + name: name + required: false + url: + name: url + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation + function, .wrap_val + at 0x7f8c96c35f30>.' + DandiBaseModel: + name: DandiBaseModel + slots: + - id + - schemaKey + Dandiset: + name: Dandiset + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the contributor + slot. The slot representation of the contributor field in the Dandiset Pydantic + model has changes in value in meta slots: [''notes'', ''required''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the id slot. The + slot representation of the id field in the Dandiset Pydantic model has changes + in value in meta slots: [''required''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the name slot. + The slot representation of the name field in the Dandiset Pydantic model has + changes in value in meta slots: [''required''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the license slot. + The slot representation of the license field in the Dandiset Pydantic model + has changes in value in meta slots: [''required''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the description + slot. The slot representation of the description field in the Dandiset Pydantic + model has changes in value in meta slots: [''required''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the wasGeneratedBy + slot. The slot representation of the wasGeneratedBy field in the Dandiset Pydantic + model has changes in value in meta slots: [''range''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Dandiset Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: CommonModel + slots: + - assetsSummary + - citation + - dateCreated + - dateModified + - identifier + - manifestLocation + - sameAs + - version + slot_usage: + identifier: + name: identifier + range: string + required: true + pattern: ^[A-Z][-A-Z]*:\d{6}$ + sameAs: + name: sameAs + range: string + pattern: ^dandi://[A-Z][-A-Z]*/\d{6}(@(draft|\d+\.\d+\.\d+))?(/\S+)?$ + Disorder: + name: Disorder + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Disorder Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: BaseType + slots: + - dxdate + Equipment: + name: Equipment + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Equipment Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - description + - identifier + - name + slot_usage: + identifier: + name: identifier + range: string + required: false + name: + name: name + notes: + - 'pydantic2linkml: LinkML does not have direct support for max length constraints. + The max length constraint of 150 is incorporated into the pattern of the + slot.' + required: true + pattern: ^(?=.{,150}$) + EthicsApproval: + name: EthicsApproval + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the EthicsApproval Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - contactPoint + - identifier + slot_usage: + identifier: + name: identifier + range: string + required: true + GenericType: + name: GenericType + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the GenericType Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: BaseType + GenotypeInfo: + name: GenotypeInfo + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the GenotypeInfo Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - alleles + - locus + - wasGeneratedBy + slot_usage: + wasGeneratedBy: + name: wasGeneratedBy + range: Session + Locus: + name: Locus + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Locus Pydantic model + has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] .' + is_a: DandiBaseModel + slots: + - identifier + - locusType + slot_usage: + identifier: + name: identifier + notes: + - 'pydantic2linkml: Warning: The translation is incomplete. The union core + schema contains a choice of type str. The choice type is yet to be supported. + (core schema: {''type'': ''union'', ''choices'': [{''type'': ''str''}, {''type'': + ''list'', ''items_schema'': {''type'': ''str''}}]}).' + required: true + MeasurementTechniqueType: + name: MeasurementTechniqueType + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the MeasurementTechniqueType + Pydantic model has changes in value in meta slots: [''ifabsent'', ''notes'', + ''range''] .' + is_a: BaseType + Organization: + name: Organization + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Organization Pydantic + model has changes in value in meta slots: [''any_of'', ''ifabsent'', ''notes''] + .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the includeInCitation + slot. The slot representation of the includeInCitation field in the Organization + Pydantic model has changes in value in meta slots: [''ifabsent''] .' + is_a: Contributor + slots: + - contactPoint + slot_usage: + contactPoint: + name: contactPoint + multivalued: true + identifier: + name: identifier + pattern: ^https://ror.org/[a-z0-9]+$ + Participant: + name: Participant + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Participant Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - age + - altName + - cellLine + - disorder + - genotype + - identifier + - relatedParticipant + - sameAs + - sex + - species + - strain + - vendor + slot_usage: + identifier: + name: identifier + range: string + required: true + sameAs: + name: sameAs + range: string + Person: + name: Person + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Person Pydantic + model has changes in value in meta slots: [''any_of'', ''ifabsent'', ''notes''] + .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the name slot. + The slot representation of the name field in the Person Pydantic model has changes + in value in meta slots: [''required''] .' + is_a: Contributor + slots: + - affiliation + slot_usage: + identifier: + name: identifier + pattern: ^\d{4}-\d{4}-\d{4}-(\d{3}X|\d{4})$ + Project: + name: Project + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Project Pydantic + model has changes in value in meta slots: [''any_of'', ''ifabsent'', ''notes''] + .' + is_a: Activity + PropertyValue: + name: PropertyValue + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the PropertyValue Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - maxValue + - minValue + - propertyID + - unitText + - value + - valueReference + Publishable: + name: Publishable + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Publishable Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - datePublished + - publishedBy + PublishActivity: + name: PublishActivity + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the PublishActivity + Pydantic model has changes in value in meta slots: [''any_of'', ''ifabsent'', + ''notes''] .' + is_a: Activity + PublishedAsset: + name: PublishedAsset + notes: + - 'pydantic2linkml: Warning: LinkML does not support multiple inheritance. Publishable + is not specified as a parent, through the `is_a` meta slot, but as a mixin.' + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the PublishedAsset Pydantic + model has changes in value in meta slots: [''notes''] .' + is_a: Asset + mixins: + - Publishable + slot_usage: + id: + name: id + pattern: ^dandiasset:[a-f0-9]{8}[-]*[a-f0-9]{4}[-]*[a-f0-9]{4}[-]*[a-f0-9]{4}[-]*[a-f0-9]{12}$ + PublishedDandiset: + name: PublishedDandiset + notes: + - 'pydantic2linkml: Warning: LinkML does not support multiple inheritance. Publishable + is not specified as a parent, through the `is_a` meta slot, but as a mixin.' + - 'pydantic2linkml: Impossible to generate slot usage entry for the id slot. The + slot representation of the id field in the PublishedDandiset Pydantic model + has changes in value in meta slots: [''pattern''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the PublishedDandiset + Pydantic model has changes in value in meta slots: [''notes''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the url slot. + The slot representation of the url field in the PublishedDandiset Pydantic model + has changes in value in meta slots: [''notes'', ''required''] .' + is_a: Dandiset + mixins: + - Publishable + slots: + - doi + - releaseNotes + RelatedParticipant: + name: RelatedParticipant + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the RelatedParticipant + Pydantic model has changes in value in meta slots: [''ifabsent'', ''notes'', + ''range''] .' + is_a: DandiBaseModel + slots: + - identifier + - name + - relation + - url + slot_usage: + identifier: + name: identifier + range: string + required: false + name: + name: name + required: false + relation: + name: relation + range: ParticipantRelationType + url: + name: url + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation + function, .wrap_val + at 0x7f8c96c376d0>.' + Resource: + name: Resource + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Resource Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - identifier + - name + - relation + - repository + - resourceType + - url + slot_usage: + identifier: + name: identifier + range: string + required: false + name: + name: name + required: false + relation: + name: relation + range: RelationType + repository: + name: repository + range: string + url: + name: url + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation + function, .wrap_val + at 0x7f8c96c34040>.' + SampleType: + name: SampleType + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the SampleType Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: BaseType + Session: + name: Session + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Session Pydantic + model has changes in value in meta slots: [''any_of'', ''ifabsent'', ''notes''] + .' + is_a: Activity + SexType: + name: SexType + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the SexType Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: BaseType + Software: + name: Software + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Software Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: DandiBaseModel + slots: + - identifier + - name + - url + - version + slot_usage: + identifier: + name: identifier + range: string + required: false + pattern: ^RRID:.* + name: + name: name + required: true + url: + name: url + notes: + - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation + function, .wrap_val + at 0x7f8c96c36a70>.' + SpeciesType: + name: SpeciesType + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the SpeciesType Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: BaseType + StandardsType: + name: StandardsType + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the StandardsType Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: BaseType + StrainType: + name: StrainType + notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the StrainType Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + is_a: BaseType From b5644c1a3558923707e5c2d4c08ab861876a6081 Mon Sep 17 00:00:00 2001 From: Isaac To Date: Tue, 10 Mar 2026 11:43:36 -0700 Subject: [PATCH 03/38] build(hatch-env): provide script to translate `dandischema.models` Provide script to translate `dandischema.models` in to a LinkML schema and overly it with definition provided by an overlay file. --- dandischema/models_overlay.yaml | 4 ++++ pyproject.toml | 2 ++ 2 files changed, 6 insertions(+) create mode 100644 dandischema/models_overlay.yaml diff --git a/dandischema/models_overlay.yaml b/dandischema/models_overlay.yaml new file mode 100644 index 00000000..69b1c3e2 --- /dev/null +++ b/dandischema/models_overlay.yaml @@ -0,0 +1,4 @@ +name: dandi-schema +id: https://schema.dandiarchive.org/s/dandi/v0.7 +version: 0.7.0 +status: eunal:concept-status/DRAFT diff --git a/pyproject.toml b/pyproject.toml index 1d534fcc..962caf07 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -67,6 +67,8 @@ python = "3.10" dependencies = [ "pydantic2linkml @ git+https://github.com/dandi/pydantic2linkml.git" ] +[tool.hatch.envs.linkml-auto-converted.scripts] +2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml -o dandischema/models.yaml dandischema.models" [tool.setuptools.packages.find] namespaces = true From f109ff48a6e4b5663f03f97a0080976d708172b2 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 16:42:59 -0400 Subject: [PATCH 04/38] Now we will sanitize the converted model addresses --- dandischema/models.yaml | 64 ++++++++++++++++++++--------------------- pyproject.toml | 2 +- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/dandischema/models.yaml b/dandischema/models.yaml index f4ee6540..f7ac15c7 100644 --- a/dandischema/models.yaml +++ b/dandischema/models.yaml @@ -410,9 +410,9 @@ slots: name: access notes: - 'pydantic2linkml: Unable to express the default factory, - at 0x7f8c96c35ea0>, in LinkML.' + at 0xADDRESS>, in LinkML.' - 'pydantic2linkml: Unable to translate the logic contained in the after validation - function, .' + function, .' range: AccessRequirements required: false multivalued: true @@ -506,7 +506,7 @@ slots: notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val - at 0x7f8c967983a0>.' + at 0xADDRESS>.' range: uri required: true multivalued: true @@ -528,7 +528,7 @@ slots: notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val - at 0x7f8c96c370a0>.' + at 0xADDRESS>.' range: uri required: false pattern: ^(?i:http|https)://[^\s]+$ @@ -603,7 +603,7 @@ slots: contains a choice of type function-wrap. The choice type is yet to be supported. (core schema: {''type'': ''union'', ''choices'': [{''type'': ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val - at 0x7f8c96c372e0>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + at 0xADDRESS>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': ''function-plain'', ''function'': }, ''schema'': {''type'': ''model'', ''cls'': , + at 0xADDRESS>}, ''schema'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': @@ -749,7 +749,7 @@ slots: {''nskey'': ''schema''}}}, ''url'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val at 0x7f8c96c36320>}, + _BaseUrl.__get_pydantic_core_schema__..wrap_val at 0xADDRESS>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': @@ -826,7 +826,7 @@ slots: {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val - at 0x7f8c96c36a70>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + at 0xADDRESS>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': ''function-plain'', ''function'': .wrap_val - at 0x7f8c96c368c0>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + at 0xADDRESS>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': ''function-plain'', ''function'': .wrap_val - at 0x7f8c96c36830>.' + at 0xADDRESS>.' range: uri required: true multivalued: true @@ -1009,7 +1009,7 @@ slots: (core schema: {''type'': ''union'', ''choices'': [{''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models.IdentifierType:94399351374048''}, {''type'': ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val at 0x7f8c96c17c70>}, + _BaseUrl.__get_pydantic_core_schema__..wrap_val at 0xADDRESS>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': @@ -1021,7 +1021,7 @@ slots: notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val - at 0x7f8c96c36f80>.' + at 0xADDRESS>.' range: uri required: false multivalued: true @@ -1033,7 +1033,7 @@ slots: contains a choice of type function-wrap. The choice type is yet to be supported. (core schema: {''type'': ''union'', ''choices'': [{''type'': ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val - at 0x7f8c96c37a30>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + at 0xADDRESS>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': ''function-plain'', ''function'': }, + ''function'': }, ''schema'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': @@ -1099,7 +1099,7 @@ slots: {''nskey'': ''schema''}}}, ''url'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val at 0x7f8c96c36320>}, + _BaseUrl.__get_pydantic_core_schema__..wrap_val at 0xADDRESS>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': @@ -1153,7 +1153,7 @@ slots: ''ref'': ''dandischema.models.Person:94399351924672'', ''metadata'': {''pydantic_js_functions'': [>]}, ''type'': ''function-after''}, ''Organization'': {''function'': {''type'': ''no-info'', - ''function'': }, + ''function'': }, ''schema'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': @@ -1182,7 +1182,7 @@ slots: ''url'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val - at 0x7f8c96c36560>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + at 0xADDRESS>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': ''function-plain'', ''function'': .wrap_val - at 0x7f8c96c34940>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + at 0xADDRESS>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': ''function-plain'', ''function'': .wrap_val - at 0x7f8c96c36a70>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + at 0xADDRESS>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': ''function-plain'', ''function'': .wrap_val - at 0x7f8c96c368c0>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', + at 0xADDRESS>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': ''function-plain'', ''function'': .' + function, .' range: Resource required: false multivalued: true @@ -1461,7 +1461,7 @@ slots: name: vendor notes: - 'pydantic2linkml: Unable to translate the logic contained in the after validation - function, .' + function, .' range: Organization required: false version: @@ -1580,7 +1580,7 @@ classes: notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val - at 0x7f8c96c368c0>.' + at 0xADDRESS>.' Allele: name: Allele notes: @@ -1702,7 +1702,7 @@ classes: notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val - at 0x7f8c96c37ac0>.' + at 0xADDRESS>.' range: uri pattern: ^(?i:http|https)://[^\s]+$ variableMeasured: @@ -1726,7 +1726,7 @@ classes: schema contains a choice of type function-wrap. The choice type is yet to be supported. (core schema: {''type'': ''union'', ''choices'': [{''type'': ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val at 0x7f8c96c15d80>}, + _BaseUrl.__get_pydantic_core_schema__..wrap_val at 0xADDRESS>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': @@ -1806,7 +1806,7 @@ classes: notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val - at 0x7f8c96c369e0>.' + at 0xADDRESS>.' range: uri pattern: ^(?i:http|https)://[^\s]+$ url: @@ -1814,7 +1814,7 @@ classes: notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val - at 0x7f8c96c34a60>.' + at 0xADDRESS>.' wasGeneratedBy: name: wasGeneratedBy range: Activity @@ -1835,7 +1835,7 @@ classes: notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val - at 0x7f8c96c34940>.' + at 0xADDRESS>.' Contributor: name: Contributor notes: @@ -1865,7 +1865,7 @@ classes: notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val - at 0x7f8c96c35f30>.' + at 0xADDRESS>.' DandiBaseModel: name: DandiBaseModel slots: @@ -2190,7 +2190,7 @@ classes: notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val - at 0x7f8c96c376d0>.' + at 0xADDRESS>.' Resource: name: Resource notes: @@ -2225,7 +2225,7 @@ classes: notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val - at 0x7f8c96c34040>.' + at 0xADDRESS>.' SampleType: name: SampleType notes: @@ -2277,7 +2277,7 @@ classes: notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val - at 0x7f8c96c36a70>.' + at 0xADDRESS>.' SpeciesType: name: SpeciesType notes: diff --git a/pyproject.toml b/pyproject.toml index d51e4a19..5d6dcd32 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,7 +69,7 @@ dependencies = [ "pydantic2linkml @ git+https://github.com/dandi/pydantic2linkml.git" ] [tool.hatch.envs.linkml-auto-converted.scripts] -2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml -o dandischema/models.yaml dandischema.models" +2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' > dandischema/models.yaml " 2pydantic = "gen-pydantic --black dandischema/models.yaml > dandischema/models.py" [tool.setuptools.packages.find] From cfe3beacadeb5923a32b82a7187f724c268390f5 Mon Sep 17 00:00:00 2001 From: Isaac To Date: Tue, 10 Mar 2026 12:22:13 -0700 Subject: [PATCH 05/38] build(hatch-env): provide script to translate `dandischema/models.yaml` Provide script to translate `dandischema/models.yaml` back to Pydantic models and store them in `dandischema/models.py` --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 962caf07..d51e4a19 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,10 +65,12 @@ python = "3.10" # Env for auto converting `dandischema.models` to LinkML schema and back to Pydantic models [tool.hatch.envs.linkml-auto-converted] dependencies = [ + "black", # This allows `gen-pydantic` to format the generated Pydantic models with Black formatting "pydantic2linkml @ git+https://github.com/dandi/pydantic2linkml.git" ] [tool.hatch.envs.linkml-auto-converted.scripts] 2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml -o dandischema/models.yaml dandischema.models" +2pydantic = "gen-pydantic --black dandischema/models.yaml > dandischema/models.py" [tool.setuptools.packages.find] namespaces = true From 7580f80ca01134d53a53f0747c3e8bec456de156 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 18:32:09 -0400 Subject: [PATCH 06/38] more sanitization --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5d6dcd32..1792f36e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,7 +69,7 @@ dependencies = [ "pydantic2linkml @ git+https://github.com/dandi/pydantic2linkml.git" ] [tool.hatch.envs.linkml-auto-converted.scripts] -2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' > dandischema/models.yaml " +2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' -e 's,\\(.\\+\\):[0-9]\\+,\\1:NUMBER,g' > dandischema/models.yaml" 2pydantic = "gen-pydantic --black dandischema/models.yaml > dandischema/models.py" [tool.setuptools.packages.find] From f130f4f3e2361129f7ed3e304fef5fff5c5b5f40 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 16:56:31 -0400 Subject: [PATCH 07/38] More Sanitization applied --- dandischema/models.yaml | 44 ++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/dandischema/models.yaml b/dandischema/models.yaml index f7ac15c7..b7aec10e 100644 --- a/dandischema/models.yaml +++ b/dandischema/models.yaml @@ -656,7 +656,7 @@ slots: {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {}}}, ''model_name'': ''Locus'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': - ''model_post_init'', ''config'': {''title'': ''Locus''}, ''ref'': ''dandischema.models.Locus:94399352651488'', + ''model_post_init'', ''config'': {''title'': ''Locus''}, ''ref'': ''dandischema.models.Locus:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Locus at which information was extracted.''}}}, ''alleles'': @@ -682,7 +682,7 @@ slots: ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {}}}, ''model_name'': ''Allele'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': - {''title'': ''Allele''}, ''ref'': ''dandischema.models.Allele:94399352775296'', + {''title'': ''Allele''}, ''ref'': ''dandischema.models.Allele:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Information about alleles at the locus.''}}}, ''wasGeneratedBy'': @@ -758,7 +758,7 @@ slots: ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''roleName'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': - {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models.RoleType:94399351385504''}}}, + {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models.RoleType:NUMBER''}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''Role'', ''description'': ''Role(s) of the contributor. Multiple roles can be selected.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''includeInCitation'': {''type'': @@ -793,17 +793,17 @@ slots: ''Name of organization''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Affiliation'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': - {''title'': ''Affiliation''}, ''ref'': ''dandischema.models.Affiliation:94399351361968'', + {''title'': ''Affiliation''}, ''ref'': ''dandischema.models.Affiliation:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''An organization that this person is affiliated with.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Person'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Person''}}, - ''ref'': ''dandischema.models.Person:94399351924672'', ''metadata'': {''pydantic_js_functions'': + ''ref'': ''dandischema.models.Person:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}, ''type'': ''function-after''}, ''Organization'': {''type'': ''definition-ref'', - ''schema_ref'': ''dandischema.models.Organization:94399348768928''}, ''Software'': + ''schema_ref'': ''dandischema.models.Organization:NUMBER''}, ''Software'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': @@ -835,7 +835,7 @@ slots: software.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Software'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Software''}, - ''ref'': ''dandischema.models.Software:94399351823024'', ''metadata'': {''pydantic_js_functions'': + ''ref'': ''dandischema.models.Software:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}, ''Agent'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', @@ -864,7 +864,7 @@ slots: ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Agent'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Agent''}, - ''ref'': ''dandischema.models.Agent:94399351861984'', ''metadata'': {''pydantic_js_functions'': + ''ref'': ''dandischema.models.Agent:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}, ''discriminator'': ''schemaKey'', ''strict'': False, ''from_attributes'': True, ''metadata'': {}}}}, ''default'': None}, ''metadata'': {''pydantic_js_extra'': @@ -893,20 +893,20 @@ slots: of the equipment.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Equipment'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Equipment''}, - ''ref'': ''dandischema.models.Equipment:94399352248096'', ''metadata'': {''pydantic_js_functions'': + ''ref'': ''dandischema.models.Equipment:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''A listing of equipment used for the activity.''}, ''pydantic_js_extra'': {''nskey'': ''prov''}}}}, ''model_name'': ''Session'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': - {''title'': ''Session''}, ''ref'': ''dandischema.models.Session:94399352644368'', + {''title'': ''Session''}, ''ref'': ''dandischema.models.Session:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Information about session activity used to determine genotype.''}, ''pydantic_js_extra'': {''nskey'': ''prov''}}}}, ''model_name'': ''GenotypeInfo'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': - {''title'': ''GenotypeInfo''}, ''ref'': ''dandischema.models.GenotypeInfo:94399353584960'', + {''title'': ''GenotypeInfo''}, ''ref'': ''dandischema.models.GenotypeInfo:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}, {''type'': ''str''}]}).' required: false @@ -1007,7 +1007,7 @@ slots: - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema contains a choice of type definition-ref. The choice type is yet to be supported. (core schema: {''type'': ''union'', ''choices'': [{''type'': ''definition-ref'', - ''schema_ref'': ''dandischema.models.IdentifierType:94399351374048''}, {''type'': + ''schema_ref'': ''dandischema.models.IdentifierType:NUMBER''}, {''type'': ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val at 0xADDRESS>}, ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, @@ -1108,7 +1108,7 @@ slots: ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''roleName'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': - {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models.RoleType:94399351385504''}}}, + {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models.RoleType:NUMBER''}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''Role'', ''description'': ''Role(s) of the contributor. Multiple roles can be selected.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''includeInCitation'': {''type'': @@ -1143,14 +1143,14 @@ slots: ''Name of organization''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Affiliation'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': - {''title'': ''Affiliation''}, ''ref'': ''dandischema.models.Affiliation:94399351361968'', + {''title'': ''Affiliation''}, ''ref'': ''dandischema.models.Affiliation:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''An organization that this person is affiliated with.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Person'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Person''}}, - ''ref'': ''dandischema.models.Person:94399351924672'', ''metadata'': {''pydantic_js_functions'': + ''ref'': ''dandischema.models.Person:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}, ''type'': ''function-after''}, ''Organization'': {''function'': {''type'': ''no-info'', ''function'': }, @@ -1190,7 +1190,7 @@ slots: ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''roleName'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': - {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models.RoleType:94399351385504''}}}, + {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models.RoleType:NUMBER''}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''Role'', ''description'': ''Role(s) of the contributor. Multiple roles can be selected.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''includeInCitation'': {''type'': @@ -1235,14 +1235,14 @@ slots: information on how to contact.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''ContactPoint'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': - {''title'': ''ContactPoint''}, ''ref'': ''dandischema.models.ContactPoint:94399351740384'', + {''title'': ''ContactPoint''}, ''ref'': ''dandischema.models.ContactPoint:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''Organization contact information'', ''description'': ''Contact for the organization''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Organization'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', - ''config'': {''title'': ''Organization''}}, ''ref'': ''dandischema.models.Organization:94399348768928'', + ''config'': {''title'': ''Organization''}}, ''ref'': ''dandischema.models.Organization:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}, ''type'': ''function-after''}, ''Software'': {''type'': ''model'', ''cls'': , @@ -1276,7 +1276,7 @@ slots: software.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Software'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Software''}, - ''ref'': ''dandischema.models.Software:94399351823024'', ''metadata'': {''pydantic_js_functions'': + ''ref'': ''dandischema.models.Software:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}, ''Agent'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', @@ -1305,7 +1305,7 @@ slots: ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Agent'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Agent''}, - ''ref'': ''dandischema.models.Agent:94399351861984'', ''metadata'': {''pydantic_js_functions'': + ''ref'': ''dandischema.models.Agent:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}, ''discriminator'': ''schemaKey'', ''strict'': False, ''from_attributes'': True, ''metadata'': {}}}}, ''default'': None}, ''metadata'': {''pydantic_js_extra'': @@ -1334,13 +1334,13 @@ slots: of the equipment.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Equipment'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Equipment''}, - ''ref'': ''dandischema.models.Equipment:94399352248096'', ''metadata'': {''pydantic_js_functions'': + ''ref'': ''dandischema.models.Equipment:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''A listing of equipment used for the activity.''}, ''pydantic_js_extra'': {''nskey'': ''prov''}}}}, ''model_name'': ''PublishActivity'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', - ''config'': {''title'': ''PublishActivity''}, ''ref'': ''dandischema.models.PublishActivity:94399352646832'', + ''config'': {''title'': ''PublishActivity''}, ''ref'': ''dandischema.models.PublishActivity:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}]}).' required: true From 0a8ef6b5535adadc415ef2695ee22bccc8ab2af4 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 17:00:21 -0400 Subject: [PATCH 08/38] Reextracted model (now less clutter and with spaces) --- dandischema/models.yaml | 369 +++++----------------------------------- 1 file changed, 45 insertions(+), 324 deletions(-) diff --git a/dandischema/models.yaml b/dandischema/models.yaml index b7aec10e..3c006b05 100644 --- a/dandischema/models.yaml +++ b/dandischema/models.yaml @@ -13,401 +13,276 @@ prefixes: prefix_reference: http://example.org/test-schema/ default_prefix: test_schema default_range: string + enums: AccessType: - name: AccessType description: An enumeration of access status options permissible_values: dandi:OpenAccess: - text: dandi:OpenAccess meaning: dandi:OpenAccess dandi:EmbargoedAccess: - text: dandi:EmbargoedAccess meaning: dandi:EmbargoedAccess AgeReferenceType: - name: AgeReferenceType description: An enumeration of age reference permissible_values: dandi:BirthReference: - text: dandi:BirthReference meaning: dandi:BirthReference dandi:GestationalReference: - text: dandi:GestationalReference meaning: dandi:GestationalReference DigestType: - name: DigestType description: An enumeration of checksum types permissible_values: dandi:md5: - text: dandi:md5 meaning: dandi:md5 dandi:sha1: - text: dandi:sha1 meaning: dandi:sha1 dandi:sha2-256: - text: dandi:sha2-256 meaning: dandi:sha2-256 dandi:sha3-256: - text: dandi:sha3-256 meaning: dandi:sha3-256 dandi:blake2b-256: - text: dandi:blake2b-256 meaning: dandi:blake2b-256 dandi:blake3: - text: dandi:blake3 meaning: dandi:blake3 dandi:dandi-etag: - text: dandi:dandi-etag meaning: dandi:dandi-etag dandi:dandi-zarr-checksum: - text: dandi:dandi-zarr-checksum meaning: dandi:dandi-zarr-checksum IdentifierType: - name: IdentifierType description: An enumeration of identifiers permissible_values: dandi:doi: - text: dandi:doi meaning: dandi:doi dandi:orcid: - text: dandi:orcid meaning: dandi:orcid dandi:ror: - text: dandi:ror meaning: dandi:ror dandi:dandi: - text: dandi:dandi meaning: dandi:dandi dandi:rrid: - text: dandi:rrid meaning: dandi:rrid LicenseType: - name: LicenseType description: An enumeration. permissible_values: spdx:CC0-1.0: - text: spdx:CC0-1.0 meaning: spdx:CC0-1.0 spdx:CC-BY-4.0: - text: spdx:CC-BY-4.0 meaning: spdx:CC-BY-4.0 ParticipantRelationType: - name: ParticipantRelationType description: An enumeration of participant relations permissible_values: dandi:isChildOf: - text: dandi:isChildOf meaning: dandi:isChildOf dandi:isParentOf: - text: dandi:isParentOf meaning: dandi:isParentOf dandi:isSiblingOf: - text: dandi:isSiblingOf meaning: dandi:isSiblingOf dandi:isMonozygoticTwinOf: - text: dandi:isMonozygoticTwinOf meaning: dandi:isMonozygoticTwinOf dandi:isDizygoticTwinOf: - text: dandi:isDizygoticTwinOf meaning: dandi:isDizygoticTwinOf RelationType: - name: RelationType description: An enumeration of resource relations permissible_values: dcite:IsCitedBy: - text: dcite:IsCitedBy meaning: dcite:IsCitedBy dcite:Cites: - text: dcite:Cites meaning: dcite:Cites dcite:IsSupplementTo: - text: dcite:IsSupplementTo meaning: dcite:IsSupplementTo dcite:IsSupplementedBy: - text: dcite:IsSupplementedBy meaning: dcite:IsSupplementedBy dcite:IsContinuedBy: - text: dcite:IsContinuedBy meaning: dcite:IsContinuedBy dcite:Continues: - text: dcite:Continues meaning: dcite:Continues dcite:Describes: - text: dcite:Describes meaning: dcite:Describes dcite:IsDescribedBy: - text: dcite:IsDescribedBy meaning: dcite:IsDescribedBy dcite:HasMetadata: - text: dcite:HasMetadata meaning: dcite:HasMetadata dcite:IsMetadataFor: - text: dcite:IsMetadataFor meaning: dcite:IsMetadataFor dcite:HasVersion: - text: dcite:HasVersion meaning: dcite:HasVersion dcite:IsVersionOf: - text: dcite:IsVersionOf meaning: dcite:IsVersionOf dcite:IsNewVersionOf: - text: dcite:IsNewVersionOf meaning: dcite:IsNewVersionOf dcite:IsPreviousVersionOf: - text: dcite:IsPreviousVersionOf meaning: dcite:IsPreviousVersionOf dcite:IsPartOf: - text: dcite:IsPartOf meaning: dcite:IsPartOf dcite:HasPart: - text: dcite:HasPart meaning: dcite:HasPart dcite:IsReferencedBy: - text: dcite:IsReferencedBy meaning: dcite:IsReferencedBy dcite:References: - text: dcite:References meaning: dcite:References dcite:IsDocumentedBy: - text: dcite:IsDocumentedBy meaning: dcite:IsDocumentedBy dcite:Documents: - text: dcite:Documents meaning: dcite:Documents dcite:IsCompiledBy: - text: dcite:IsCompiledBy meaning: dcite:IsCompiledBy dcite:Compiles: - text: dcite:Compiles meaning: dcite:Compiles dcite:IsVariantFormOf: - text: dcite:IsVariantFormOf meaning: dcite:IsVariantFormOf dcite:IsOriginalFormOf: - text: dcite:IsOriginalFormOf meaning: dcite:IsOriginalFormOf dcite:IsIdenticalTo: - text: dcite:IsIdenticalTo meaning: dcite:IsIdenticalTo dcite:IsReviewedBy: - text: dcite:IsReviewedBy meaning: dcite:IsReviewedBy dcite:Reviews: - text: dcite:Reviews meaning: dcite:Reviews dcite:IsDerivedFrom: - text: dcite:IsDerivedFrom meaning: dcite:IsDerivedFrom dcite:IsSourceOf: - text: dcite:IsSourceOf meaning: dcite:IsSourceOf dcite:IsRequiredBy: - text: dcite:IsRequiredBy meaning: dcite:IsRequiredBy dcite:Requires: - text: dcite:Requires meaning: dcite:Requires dcite:Obsoletes: - text: dcite:Obsoletes meaning: dcite:Obsoletes dcite:IsObsoletedBy: - text: dcite:IsObsoletedBy meaning: dcite:IsObsoletedBy dcite:IsPublishedIn: - text: dcite:IsPublishedIn meaning: dcite:IsPublishedIn ResourceType: - name: ResourceType description: An enumeration of resource types permissible_values: dcite:Audiovisual: - text: dcite:Audiovisual meaning: dcite:Audiovisual dcite:Book: - text: dcite:Book meaning: dcite:Book dcite:BookChapter: - text: dcite:BookChapter meaning: dcite:BookChapter dcite:Collection: - text: dcite:Collection meaning: dcite:Collection dcite:ComputationalNotebook: - text: dcite:ComputationalNotebook meaning: dcite:ComputationalNotebook dcite:ConferencePaper: - text: dcite:ConferencePaper meaning: dcite:ConferencePaper dcite:ConferenceProceeding: - text: dcite:ConferenceProceeding meaning: dcite:ConferenceProceeding dcite:DataPaper: - text: dcite:DataPaper meaning: dcite:DataPaper dcite:Dataset: - text: dcite:Dataset meaning: dcite:Dataset dcite:Dissertation: - text: dcite:Dissertation meaning: dcite:Dissertation dcite:Event: - text: dcite:Event meaning: dcite:Event dcite:Image: - text: dcite:Image meaning: dcite:Image dcite:Instrument: - text: dcite:Instrument meaning: dcite:Instrument dcite:InteractiveResource: - text: dcite:InteractiveResource meaning: dcite:InteractiveResource dcite:Journal: - text: dcite:Journal meaning: dcite:Journal dcite:JournalArticle: - text: dcite:JournalArticle meaning: dcite:JournalArticle dcite:Model: - text: dcite:Model meaning: dcite:Model dcite:OutputManagementPlan: - text: dcite:OutputManagementPlan meaning: dcite:OutputManagementPlan dcite:PeerReview: - text: dcite:PeerReview meaning: dcite:PeerReview dcite:PhysicalObject: - text: dcite:PhysicalObject meaning: dcite:PhysicalObject dcite:Preprint: - text: dcite:Preprint meaning: dcite:Preprint dcite:Report: - text: dcite:Report meaning: dcite:Report dcite:Service: - text: dcite:Service meaning: dcite:Service dcite:Software: - text: dcite:Software meaning: dcite:Software dcite:Sound: - text: dcite:Sound meaning: dcite:Sound dcite:Standard: - text: dcite:Standard meaning: dcite:Standard dcite:StudyRegistration: - text: dcite:StudyRegistration meaning: dcite:StudyRegistration dcite:Text: - text: dcite:Text meaning: dcite:Text dcite:Workflow: - text: dcite:Workflow meaning: dcite:Workflow dcite:Other: - text: dcite:Other meaning: dcite:Other RoleType: - name: RoleType description: An enumeration of roles permissible_values: dcite:Author: - text: dcite:Author meaning: dcite:Author dcite:Conceptualization: - text: dcite:Conceptualization meaning: dcite:Conceptualization dcite:ContactPerson: - text: dcite:ContactPerson meaning: dcite:ContactPerson dcite:DataCollector: - text: dcite:DataCollector meaning: dcite:DataCollector dcite:DataCurator: - text: dcite:DataCurator meaning: dcite:DataCurator dcite:DataManager: - text: dcite:DataManager meaning: dcite:DataManager dcite:FormalAnalysis: - text: dcite:FormalAnalysis meaning: dcite:FormalAnalysis dcite:FundingAcquisition: - text: dcite:FundingAcquisition meaning: dcite:FundingAcquisition dcite:Investigation: - text: dcite:Investigation meaning: dcite:Investigation dcite:Maintainer: - text: dcite:Maintainer meaning: dcite:Maintainer dcite:Methodology: - text: dcite:Methodology meaning: dcite:Methodology dcite:Producer: - text: dcite:Producer meaning: dcite:Producer dcite:ProjectLeader: - text: dcite:ProjectLeader meaning: dcite:ProjectLeader dcite:ProjectManager: - text: dcite:ProjectManager meaning: dcite:ProjectManager dcite:ProjectMember: - text: dcite:ProjectMember meaning: dcite:ProjectMember dcite:ProjectAdministration: - text: dcite:ProjectAdministration meaning: dcite:ProjectAdministration dcite:Researcher: - text: dcite:Researcher meaning: dcite:Researcher dcite:Resources: - text: dcite:Resources meaning: dcite:Resources dcite:Software: - text: dcite:Software meaning: dcite:Software dcite:Supervision: - text: dcite:Supervision meaning: dcite:Supervision dcite:Validation: - text: dcite:Validation meaning: dcite:Validation dcite:Visualization: - text: dcite:Visualization meaning: dcite:Visualization dcite:Funder: - text: dcite:Funder meaning: dcite:Funder dcite:Sponsor: - text: dcite:Sponsor meaning: dcite:Sponsor dcite:StudyParticipant: - text: dcite:StudyParticipant meaning: dcite:StudyParticipant dcite:Affiliation: - text: dcite:Affiliation meaning: dcite:Affiliation dcite:EthicsApproval: - text: dcite:EthicsApproval meaning: dcite:EthicsApproval dcite:Other: - text: dcite:Other meaning: dcite:Other + slots: about: - name: about notes: - 'pydantic2linkml: Warning: The translation is incomplete. Tagged union types are yet to be supported.' required: false multivalued: true access: - name: access notes: - 'pydantic2linkml: Unable to express the default factory, at 0xADDRESS>, in LinkML.' @@ -417,80 +292,63 @@ slots: required: false multivalued: true acknowledgement: - name: acknowledgement range: string required: false affiliation: - name: affiliation range: Affiliation required: false multivalued: true age: - name: age range: PropertyValue required: false alleles: - name: alleles range: Allele required: true multivalued: true alleleSymbol: - name: alleleSymbol range: string required: false alleleType: - name: alleleType range: string required: false altName: - name: altName range: string required: false multivalued: true anatomy: - name: anatomy range: Anatomy required: false multivalued: true approach: - name: approach range: ApproachType required: false multivalued: true assayType: - name: assayType range: AssayType required: false multivalued: true assetsSummary: - name: assetsSummary range: AssetsSummary required: true awardNumber: - name: awardNumber range: string required: false blobDateModified: - name: blobDateModified notes: - 'pydantic2linkml: Unable to express the microseconds precision constraint of truncate. LinkML lacks direct support for this restriction.' range: datetime required: false cellLine: - name: cellLine range: string required: false citation: - name: citation range: string required: true contactPoint: - name: contactPoint range: ContactPoint required: false contentSize: - name: contentSize notes: - 'pydantic2linkml: Unable to translate the logic contained in the after validation function, >.' @@ -502,7 +360,6 @@ slots: byte string''}).' required: true contentUrl: - name: contentUrl notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val @@ -512,19 +369,16 @@ slots: multivalued: true pattern: ^(?i:http|https)://[^\s]+$ contributor: - name: contributor notes: - 'pydantic2linkml: Warning: The translation is incomplete. Tagged union types are yet to be supported.' required: false multivalued: true dataStandard: - name: dataStandard range: StandardsType required: false multivalued: true dataType: - name: dataType notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val @@ -533,32 +387,27 @@ slots: required: false pattern: ^(?i:http|https)://[^\s]+$ dateCreated: - name: dateCreated notes: - 'pydantic2linkml: Unable to express the microseconds precision constraint of truncate. LinkML lacks direct support for this restriction.' range: datetime required: false dateModified: - name: dateModified notes: - 'pydantic2linkml: Unable to express the microseconds precision constraint of truncate. LinkML lacks direct support for this restriction.' range: datetime required: false datePublished: - name: datePublished notes: - 'pydantic2linkml: Unable to express the microseconds precision constraint of truncate. LinkML lacks direct support for this restriction.' range: datetime required: true description: - name: description range: string required: false digest: - name: digest notes: - 'pydantic2linkml: Unable to translate the logic contained in the after validation function, >.' @@ -566,18 +415,15 @@ slots: to be supported.' required: true disorder: - name: disorder range: Disorder required: false multivalued: true doi: - name: doi ifabsent: string() range: string required: false pattern: ^(10\.\d{4,}/[a-z][-a-z]*\.\d{6}/\d+\.\d+\.\d+|)$ dxdate: - name: dxdate notes: - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema contains a choice of type date. The choice type is yet to be supported. (core @@ -586,18 +432,15 @@ slots: required: false multivalued: true email: - name: email notes: - 'pydantic2linkml: Unable to translate the logic contained in the after validation function, >.' range: string required: false embargoedUntil: - name: embargoedUntil range: date required: false encodingFormat: - name: encodingFormat notes: - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema contains a choice of type function-wrap. The choice type is yet to be supported. @@ -610,19 +453,16 @@ slots: ''pydantic.networks.AnyHttpUrl''>>, ''info_arg'': True}}, {''type'': ''str''}]}).' required: true endDate: - name: endDate notes: - 'pydantic2linkml: Unable to express the microseconds precision constraint of truncate. LinkML lacks direct support for this restriction.' range: datetime required: false ethicsApproval: - name: ethicsApproval range: EthicsApproval required: false multivalued: true genotype: - name: genotype notes: - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema contains a choice of type list. The choice type is yet to be supported. (core @@ -911,41 +751,32 @@ slots: of >]}}}, {''type'': ''str''}]}).' required: false hasMember: - name: hasMember range: string required: false multivalued: true id: - name: id range: string required: false - identifier: - name: identifier + identifier: {} includeInCitation: - name: includeInCitation ifabsent: 'True' range: boolean required: false keywords: - name: keywords range: string required: false multivalued: true license: - name: license range: LicenseType required: false multivalued: true locus: - name: locus range: Locus required: true locusType: - name: locusType range: string required: false manifestLocation: - name: manifestLocation notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val @@ -956,53 +787,42 @@ slots: pattern: ^(?i:http|https)://[^\s]+$ minimum_cardinality: 1 maxValue: - name: maxValue notes: - 'pydantic2linkml: LinkML does not have support for `''+inf''`, `''-inf''`, and `''NaN''` values. Support for these values is not translated.' range: float required: false measurementTechnique: - name: measurementTechnique range: MeasurementTechniqueType required: false multivalued: true minValue: - name: minValue notes: - 'pydantic2linkml: LinkML does not have support for `''+inf''`, `''-inf''`, and `''NaN''` values. Support for these values is not translated.' range: float required: false name: - name: name range: string numberOfBytes: - name: numberOfBytes range: integer required: true numberOfCells: - name: numberOfCells range: integer required: false numberOfFiles: - name: numberOfFiles range: integer required: true numberOfSamples: - name: numberOfSamples range: integer required: false numberOfSubjects: - name: numberOfSubjects range: integer required: false path: - name: path range: string required: true propertyID: - name: propertyID notes: - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema contains a choice of type definition-ref. The choice type is yet to be supported. @@ -1017,7 +837,6 @@ slots: ''pydantic.networks.AnyHttpUrl''>>, ''info_arg'': True}}]}).' required: false protocol: - name: protocol notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val @@ -1027,7 +846,6 @@ slots: multivalued: true pattern: ^(?i:http|https)://[^\s]+$ publishedBy: - name: publishedBy notes: - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema contains a choice of type function-wrap. The choice type is yet to be supported. @@ -1345,12 +1163,10 @@ slots: of >]}}]}).' required: true relatedParticipant: - name: relatedParticipant range: RelatedParticipant required: false multivalued: true relatedResource: - name: relatedResource notes: - 'pydantic2linkml: Unable to translate the logic contained in the after validation function, .' @@ -1358,34 +1174,26 @@ slots: required: false multivalued: true relation: - name: relation required: true releaseNotes: - name: releaseNotes range: string required: false repository: - name: repository required: false resourceType: - name: resourceType range: ResourceType required: false roleName: - name: roleName range: RoleType required: false multivalued: true sameAs: - name: sameAs required: false multivalued: true sampleType: - name: sampleType range: SampleType required: true schemaKey: - name: schemaKey notes: - 'pydantic2linkml: Unable to translate the logic contained in the after validation function, >.' @@ -1393,54 +1201,43 @@ slots: range: string required: false schemaVersion: - name: schemaVersion ifabsent: string(0.7.0) range: string required: false sex: - name: sex range: SexType required: false species: - name: species range: SpeciesType required: false startDate: - name: startDate notes: - 'pydantic2linkml: Unable to express the microseconds precision constraint of truncate. LinkML lacks direct support for this restriction.' range: datetime required: false status: - name: status range: AccessType required: true strain: - name: strain range: StrainType required: false studyTarget: - name: studyTarget range: string required: false multivalued: true unitText: - name: unitText range: string required: false url: - name: url range: uri required: false pattern: ^(?i:http|https)://[^\s]+$ used: - name: used range: Equipment required: false multivalued: true value: - name: value notes: - 'pydantic2linkml: Unable to translate the logic contained in the after validation function, >.' @@ -1450,52 +1247,44 @@ slots: ''list'', ''items_schema'': {''type'': ''any''}}]}).' required: false valueReference: - name: valueReference range: PropertyValue required: false variableMeasured: - name: variableMeasured required: false multivalued: true vendor: - name: vendor notes: - 'pydantic2linkml: Unable to translate the logic contained in the after validation function, .' range: Organization required: false version: - name: version range: string required: true wasAssociatedWith: - name: wasAssociatedWith notes: - 'pydantic2linkml: Warning: The translation is incomplete. Tagged union types are yet to be supported.' required: false multivalued: true wasAttributedTo: - name: wasAttributedTo range: Participant required: false multivalued: true wasDerivedFrom: - name: wasDerivedFrom range: BioSample required: false multivalued: true wasGeneratedBy: - name: wasGeneratedBy required: false multivalued: true + classes: Any: - name: Any description: Any object class_uri: linkml:Any AccessRequirements: - name: AccessRequirements + description: Information about access options for the dataset notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the AccessRequirements @@ -1508,7 +1297,7 @@ classes: - embargoedUntil - status Activity: - name: Activity + description: Information about the Project activity notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Activity Pydantic @@ -1525,11 +1314,9 @@ classes: - wasAssociatedWith slot_usage: identifier: - name: identifier range: string required: false name: - name: name notes: - 'pydantic2linkml: LinkML does not have direct support for max length constraints. The max length constraint of 150 is incorporated into the pattern of the @@ -1537,7 +1324,6 @@ classes: required: true pattern: ^(?=.{,150}$) Affiliation: - name: Affiliation notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Affiliation Pydantic @@ -1549,15 +1335,12 @@ classes: - name slot_usage: identifier: - name: identifier range: string required: false pattern: ^https://ror.org/[a-z0-9]+$ name: - name: name required: true Agent: - name: Agent notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Agent Pydantic model @@ -1569,20 +1352,16 @@ classes: - url slot_usage: identifier: - name: identifier range: string required: false name: - name: name required: true url: - name: url notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val at 0xADDRESS>.' Allele: - name: Allele notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Allele Pydantic @@ -1595,7 +1374,6 @@ classes: - identifier slot_usage: identifier: - name: identifier notes: - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema contains a choice of type str. The choice type is yet to be supported. @@ -1603,7 +1381,7 @@ classes: ''list'', ''items_schema'': {''type'': ''str''}}]}).' required: true Anatomy: - name: Anatomy + description: UBERON or other identifier for anatomical part studied notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Anatomy Pydantic @@ -1611,7 +1389,7 @@ classes: .' is_a: BaseType ApproachType: - name: ApproachType + description: Identifier for approach used notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the ApproachType Pydantic @@ -1619,7 +1397,7 @@ classes: .' is_a: BaseType AssayType: - name: AssayType + description: OBI based identifier for the assay(s) used notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the AssayType Pydantic @@ -1627,7 +1405,7 @@ classes: .' is_a: BaseType Asset: - name: Asset + description: Metadata used to describe an asset on the server. notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the id slot. The slot representation of the id field in the Asset Pydantic model has changes @@ -1638,12 +1416,11 @@ classes: - identifier slot_usage: identifier: - name: identifier range: string required: true pattern: ^(?:urn:uuid:)?[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?4[0-9a-fA-F]{3}-?[89abAB][0-9a-fA-F]{3}-?[0-9a-fA-F]{12}$ AssetsSummary: - name: AssetsSummary + description: Summary over assets contained in a dandiset (published or not) notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the AssetsSummary Pydantic @@ -1663,21 +1440,20 @@ classes: - variableMeasured slot_usage: species: - name: species multivalued: true variableMeasured: - name: variableMeasured range: string BareAsset: - name: BareAsset + description: Metadata used to describe an asset anywhere (local or server). Derived + from C2M2 (Level 0 and 1) and schema.org notes: - - 'pydantic2linkml: Impossible to generate slot usage entry for the access slot. - The slot representation of the access field in the BareAsset Pydantic model - has changes in value in meta slots: [''notes''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the BareAsset Pydantic model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the access slot. + The slot representation of the access field in the BareAsset Pydantic model + has changes in value in meta slots: [''notes''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the wasGeneratedBy slot. The slot representation of the wasGeneratedBy field in the BareAsset Pydantic model lacks meta slots: [''range''] .' @@ -1698,7 +1474,6 @@ classes: - wasDerivedFrom slot_usage: sameAs: - name: sameAs notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val @@ -1706,10 +1481,9 @@ classes: range: uri pattern: ^(?i:http|https)://[^\s]+$ variableMeasured: - name: variableMeasured range: PropertyValue BaseType: - name: BaseType + description: Base class for enumerated types notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the BaseType Pydantic @@ -1720,7 +1494,6 @@ classes: - name slot_usage: identifier: - name: identifier notes: - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema contains a choice of type function-wrap. The choice type is yet to @@ -1736,7 +1509,6 @@ classes: ''left_to_right'', ''metadata'': {}}).' required: false name: - name: name notes: - 'pydantic2linkml: LinkML does not have direct support for max length constraints. The max length constraint of 150 is incorporated into the pattern of the @@ -1744,7 +1516,7 @@ classes: required: false pattern: ^(?=.{,150}$) BioSample: - name: BioSample + description: Description of the sample that was studied notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the BioSample Pydantic @@ -1762,14 +1534,11 @@ classes: - wasDerivedFrom slot_usage: identifier: - name: identifier range: string required: true sameAs: - name: sameAs range: string CommonModel: - name: CommonModel notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the CommonModel Pydantic @@ -1794,7 +1563,6 @@ classes: - wasGeneratedBy slot_usage: name: - name: name notes: - 'pydantic2linkml: LinkML does not have direct support for max length constraints. The max length constraint of 150 is incorporated into the pattern of the @@ -1802,7 +1570,6 @@ classes: required: false pattern: ^(?=.{,150}$) repository: - name: repository notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val @@ -1810,16 +1577,13 @@ classes: range: uri pattern: ^(?i:http|https)://[^\s]+$ url: - name: url notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val at 0xADDRESS>.' wasGeneratedBy: - name: wasGeneratedBy range: Activity ContactPoint: - name: ContactPoint notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the ContactPoint Pydantic @@ -1831,13 +1595,11 @@ classes: - url slot_usage: url: - name: url notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val at 0xADDRESS>.' Contributor: - name: Contributor notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Contributor Pydantic @@ -1854,48 +1616,44 @@ classes: - url slot_usage: identifier: - name: identifier range: string required: false name: - name: name required: false url: - name: url notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val at 0xADDRESS>.' DandiBaseModel: - name: DandiBaseModel slots: - id - schemaKey Dandiset: - name: Dandiset + description: A body of structured information describing a DANDI dataset. notes: - - 'pydantic2linkml: Impossible to generate slot usage entry for the contributor - slot. The slot representation of the contributor field in the Dandiset Pydantic - model has changes in value in meta slots: [''notes'', ''required''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the description + slot. The slot representation of the description field in the Dandiset Pydantic + model has changes in value in meta slots: [''required''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the id slot. The slot representation of the id field in the Dandiset Pydantic model has changes in value in meta slots: [''required''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey + slot. The slot representation of the schemaKey field in the Dandiset Pydantic + model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] + .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the contributor + slot. The slot representation of the contributor field in the Dandiset Pydantic + model has changes in value in meta slots: [''notes'', ''required''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the name slot. The slot representation of the name field in the Dandiset Pydantic model has changes in value in meta slots: [''required''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the license slot. The slot representation of the license field in the Dandiset Pydantic model has changes in value in meta slots: [''required''] .' - - 'pydantic2linkml: Impossible to generate slot usage entry for the description - slot. The slot representation of the description field in the Dandiset Pydantic - model has changes in value in meta slots: [''required''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the wasGeneratedBy slot. The slot representation of the wasGeneratedBy field in the Dandiset Pydantic model has changes in value in meta slots: [''range''] .' - - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey - slot. The slot representation of the schemaKey field in the Dandiset Pydantic - model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] - .' is_a: CommonModel slots: - assetsSummary @@ -1908,16 +1666,14 @@ classes: - version slot_usage: identifier: - name: identifier range: string required: true pattern: ^[A-Z][-A-Z]*:\d{6}$ sameAs: - name: sameAs range: string pattern: ^dandi://[A-Z][-A-Z]*/\d{6}(@(draft|\d+\.\d+\.\d+))?(/\S+)?$ Disorder: - name: Disorder + description: Biolink, SNOMED, or other identifier for disorder studied notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Disorder Pydantic @@ -1927,7 +1683,6 @@ classes: slots: - dxdate Equipment: - name: Equipment notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Equipment Pydantic @@ -1940,11 +1695,9 @@ classes: - name slot_usage: identifier: - name: identifier range: string required: false name: - name: name notes: - 'pydantic2linkml: LinkML does not have direct support for max length constraints. The max length constraint of 150 is incorporated into the pattern of the @@ -1952,7 +1705,7 @@ classes: required: true pattern: ^(?=.{,150}$) EthicsApproval: - name: EthicsApproval + description: Information about ethics committee approval for project notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the EthicsApproval Pydantic @@ -1964,11 +1717,10 @@ classes: - identifier slot_usage: identifier: - name: identifier range: string required: true GenericType: - name: GenericType + description: An object to capture any type for about notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the GenericType Pydantic @@ -1976,7 +1728,6 @@ classes: .' is_a: BaseType GenotypeInfo: - name: GenotypeInfo notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the GenotypeInfo Pydantic @@ -1989,10 +1740,8 @@ classes: - wasGeneratedBy slot_usage: wasGeneratedBy: - name: wasGeneratedBy range: Session Locus: - name: Locus notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Locus Pydantic model @@ -2003,7 +1752,6 @@ classes: - locusType slot_usage: identifier: - name: identifier notes: - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema contains a choice of type str. The choice type is yet to be supported. @@ -2011,7 +1759,7 @@ classes: ''list'', ''items_schema'': {''type'': ''str''}}]}).' required: true MeasurementTechniqueType: - name: MeasurementTechniqueType + description: Identifier for measurement technique used notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the MeasurementTechniqueType @@ -2019,27 +1767,27 @@ classes: ''range''] .' is_a: BaseType Organization: - name: Organization notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the includeInCitation + slot. The slot representation of the includeInCitation field in the Organization + Pydantic model has changes in value in meta slots: [''ifabsent''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Organization Pydantic model has changes in value in meta slots: [''any_of'', ''ifabsent'', ''notes''] .' - - 'pydantic2linkml: Impossible to generate slot usage entry for the includeInCitation - slot. The slot representation of the includeInCitation field in the Organization - Pydantic model has changes in value in meta slots: [''ifabsent''] .' is_a: Contributor slots: - contactPoint slot_usage: contactPoint: - name: contactPoint multivalued: true identifier: - name: identifier pattern: ^https://ror.org/[a-z0-9]+$ Participant: - name: Participant + description: Description about the Participant or Subject studied. The Participant + or Subject can be any individual or synthesized Agent. The properties of the + Participant or Subject refers to information at the timepoint when the Participant + or Subject engaged in the production of data being described. notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Participant Pydantic @@ -2061,14 +1809,11 @@ classes: - vendor slot_usage: identifier: - name: identifier range: string required: true sameAs: - name: sameAs range: string Person: - name: Person notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Person Pydantic @@ -2082,10 +1827,8 @@ classes: - affiliation slot_usage: identifier: - name: identifier pattern: ^\d{4}-\d{4}-\d{4}-(\d{3}X|\d{4})$ Project: - name: Project notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Project Pydantic @@ -2093,7 +1836,6 @@ classes: .' is_a: Activity PropertyValue: - name: PropertyValue notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the PropertyValue Pydantic @@ -2108,7 +1850,6 @@ classes: - value - valueReference Publishable: - name: Publishable notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Publishable Pydantic @@ -2119,7 +1860,6 @@ classes: - datePublished - publishedBy PublishActivity: - name: PublishActivity notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the PublishActivity @@ -2127,7 +1867,6 @@ classes: ''notes''] .' is_a: Activity PublishedAsset: - name: PublishedAsset notes: - 'pydantic2linkml: Warning: LinkML does not support multiple inheritance. Publishable is not specified as a parent, through the `is_a` meta slot, but as a mixin.' @@ -2139,10 +1878,8 @@ classes: - Publishable slot_usage: id: - name: id pattern: ^dandiasset:[a-f0-9]{8}[-]*[a-f0-9]{4}[-]*[a-f0-9]{4}[-]*[a-f0-9]{4}[-]*[a-f0-9]{12}$ PublishedDandiset: - name: PublishedDandiset notes: - 'pydantic2linkml: Warning: LinkML does not support multiple inheritance. Publishable is not specified as a parent, through the `is_a` meta slot, but as a mixin.' @@ -2162,7 +1899,6 @@ classes: - doi - releaseNotes RelatedParticipant: - name: RelatedParticipant notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the RelatedParticipant @@ -2176,23 +1912,18 @@ classes: - url slot_usage: identifier: - name: identifier range: string required: false name: - name: name required: false relation: - name: relation range: ParticipantRelationType url: - name: url notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val at 0xADDRESS>.' Resource: - name: Resource notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Resource Pydantic @@ -2208,26 +1939,21 @@ classes: - url slot_usage: identifier: - name: identifier range: string required: false name: - name: name required: false relation: - name: relation range: RelationType repository: - name: repository range: string url: - name: url notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val at 0xADDRESS>.' SampleType: - name: SampleType + description: OBI based identifier for the sample type used notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the SampleType Pydantic @@ -2235,7 +1961,6 @@ classes: .' is_a: BaseType Session: - name: Session notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Session Pydantic @@ -2243,7 +1968,7 @@ classes: .' is_a: Activity SexType: - name: SexType + description: Identifier for the sex of the sample notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the SexType Pydantic @@ -2251,7 +1976,6 @@ classes: .' is_a: BaseType Software: - name: Software notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Software Pydantic @@ -2265,21 +1989,18 @@ classes: - version slot_usage: identifier: - name: identifier range: string required: false pattern: ^RRID:.* name: - name: name required: true url: - name: url notes: - 'pydantic2linkml: Unable to translate the logic contained in the wrap validation function, .wrap_val at 0xADDRESS>.' SpeciesType: - name: SpeciesType + description: Identifier for species of the sample notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the SpeciesType Pydantic @@ -2287,7 +2008,7 @@ classes: .' is_a: BaseType StandardsType: - name: StandardsType + description: Identifier for data standard used notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the StandardsType Pydantic @@ -2295,7 +2016,7 @@ classes: .' is_a: BaseType StrainType: - name: StrainType + description: Identifier for the strain of the sample notes: - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the StrainType Pydantic From 63dd301bdcf7d828dcf56a8110cf671705caff2f Mon Sep 17 00:00:00 2001 From: Isaac To Date: Thu, 12 Mar 2026 20:07:21 -0700 Subject: [PATCH 09/38] feat: provide `prefixes` definition in the overlay file These prefixes are copied from https://github.com/dandi/schema/blob/master/releases/0.7.0/context.json --- dandischema/models_overlay.yaml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/dandischema/models_overlay.yaml b/dandischema/models_overlay.yaml index 69b1c3e2..f3e477bd 100644 --- a/dandischema/models_overlay.yaml +++ b/dandischema/models_overlay.yaml @@ -2,3 +2,27 @@ name: dandi-schema id: https://schema.dandiarchive.org/s/dandi/v0.7 version: 0.7.0 status: eunal:concept-status/DRAFT + +prefixes: + dandi: http://schema.dandiarchive.org/ + dcite: http://schema.dandiarchive.org/datacite/ + dandiasset: http://dandiarchive.org/asset/ + DANDI: http://dandiarchive.org/dandiset/ + dct: http://purl.org/dc/terms/ + owl: http://www.w3.org/2002/07/owl# + rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# + rdfa: http://www.w3.org/ns/rdfa# + rdfs: http://www.w3.org/2000/01/rdf-schema# + schema: http://schema.org/ + xsd: http://www.w3.org/2001/XMLSchema# + skos: http://www.w3.org/2004/02/skos/core# + prov: http://www.w3.org/ns/prov# + pav: http://purl.org/pav/ + nidm: http://purl.org/nidash/nidm# + uuid: http://uuid.repronim.org/ + rs: http://schema.repronim.org/ + RRID: "https://scicrunch.org/resolver/RRID:" + ORCID: https://orcid.org/ + ROR: https://ror.org/ + PATO: http://purl.obolibrary.org/obo/PATO_ + spdx: http://spdx.org/licenses/ From f8125d002711fd03a7f6dc6598da212b2895e8b5 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 17:05:48 -0400 Subject: [PATCH 10/38] Added linkml: prefix and sorted all the entries --- dandischema/models_overlay.yaml | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/dandischema/models_overlay.yaml b/dandischema/models_overlay.yaml index f3e477bd..d10006bc 100644 --- a/dandischema/models_overlay.yaml +++ b/dandischema/models_overlay.yaml @@ -4,25 +4,26 @@ version: 0.7.0 status: eunal:concept-status/DRAFT prefixes: - dandi: http://schema.dandiarchive.org/ - dcite: http://schema.dandiarchive.org/datacite/ dandiasset: http://dandiarchive.org/asset/ DANDI: http://dandiarchive.org/dandiset/ + dandi: http://schema.dandiarchive.org/ + dcite: http://schema.dandiarchive.org/datacite/ dct: http://purl.org/dc/terms/ + linkml: https://w3id.org/linkml/ + nidm: http://purl.org/nidash/nidm# + ORCID: https://orcid.org/ owl: http://www.w3.org/2002/07/owl# - rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# + PATO: http://purl.obolibrary.org/obo/PATO_ + pav: http://purl.org/pav/ + prov: http://www.w3.org/ns/prov# rdfa: http://www.w3.org/ns/rdfa# + rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# rdfs: http://www.w3.org/2000/01/rdf-schema# + ROR: https://ror.org/ + RRID: "https://scicrunch.org/resolver/RRID:" + rs: http://schema.repronim.org/ schema: http://schema.org/ - xsd: http://www.w3.org/2001/XMLSchema# skos: http://www.w3.org/2004/02/skos/core# - prov: http://www.w3.org/ns/prov# - pav: http://purl.org/pav/ - nidm: http://purl.org/nidash/nidm# - uuid: http://uuid.repronim.org/ - rs: http://schema.repronim.org/ - RRID: "https://scicrunch.org/resolver/RRID:" - ORCID: https://orcid.org/ - ROR: https://ror.org/ - PATO: http://purl.obolibrary.org/obo/PATO_ spdx: http://spdx.org/licenses/ + uuid: http://uuid.repronim.org/ + xsd: http://www.w3.org/2001/XMLSchema# From 7c5077aae32b599d57d47f30b22ed845d7bf03ad Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 17:08:12 -0400 Subject: [PATCH 11/38] Provide default prefix to be custom dandi_default --- dandischema/models_overlay.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dandischema/models_overlay.yaml b/dandischema/models_overlay.yaml index d10006bc..983cbaaf 100644 --- a/dandischema/models_overlay.yaml +++ b/dandischema/models_overlay.yaml @@ -27,3 +27,5 @@ prefixes: spdx: http://spdx.org/licenses/ uuid: http://uuid.repronim.org/ xsd: http://www.w3.org/2001/XMLSchema# + +default_prefix: dandi_default From 3485245f3097f958ddff81a4c419354da293f39c Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 17:17:41 -0400 Subject: [PATCH 12/38] Reextracted model (now with prefixes and deterministic order of notes) --- dandischema/models.yaml | 69 +++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/dandischema/models.yaml b/dandischema/models.yaml index 3c006b05..301a1a77 100644 --- a/dandischema/models.yaml +++ b/dandischema/models.yaml @@ -5,13 +5,30 @@ version: 0.7.0 imports: - linkml:types prefixes: - linkml: - prefix_prefix: linkml - prefix_reference: https://w3id.org/linkml/ - test_schema: - prefix_prefix: test_schema - prefix_reference: http://example.org/test-schema/ -default_prefix: test_schema + dandiasset: http://dandiarchive.org/asset/ + DANDI: http://dandiarchive.org/dandiset/ + dandi: http://schema.dandiarchive.org/ + dcite: http://schema.dandiarchive.org/datacite/ + dct: http://purl.org/dc/terms/ + linkml: https://w3id.org/linkml/ + nidm: http://purl.org/nidash/nidm# + ORCID: https://orcid.org/ + owl: http://www.w3.org/2002/07/owl# + PATO: http://purl.obolibrary.org/obo/PATO_ + pav: http://purl.org/pav/ + prov: http://www.w3.org/ns/prov# + rdfa: http://www.w3.org/ns/rdfa# + rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# + rdfs: http://www.w3.org/2000/01/rdf-schema# + ROR: https://ror.org/ + RRID: 'https://scicrunch.org/resolver/RRID:' + rs: http://schema.repronim.org/ + schema: http://schema.org/ + skos: http://www.w3.org/2004/02/skos/core# + spdx: http://spdx.org/licenses/ + uuid: http://uuid.repronim.org/ + xsd: http://www.w3.org/2001/XMLSchema# +default_prefix: dandi_default default_range: string enums: @@ -1447,13 +1464,13 @@ classes: description: Metadata used to describe an asset anywhere (local or server). Derived from C2M2 (Level 0 and 1) and schema.org notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the access slot. + The slot representation of the access field in the BareAsset Pydantic model + has changes in value in meta slots: [''notes''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the BareAsset Pydantic model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] .' - - 'pydantic2linkml: Impossible to generate slot usage entry for the access slot. - The slot representation of the access field in the BareAsset Pydantic model - has changes in value in meta slots: [''notes''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the wasGeneratedBy slot. The slot representation of the wasGeneratedBy field in the BareAsset Pydantic model lacks meta slots: [''range''] .' @@ -1632,25 +1649,25 @@ classes: Dandiset: description: A body of structured information describing a DANDI dataset. notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the contributor + slot. The slot representation of the contributor field in the Dandiset Pydantic + model has changes in value in meta slots: [''notes'', ''required''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the description slot. The slot representation of the description field in the Dandiset Pydantic model has changes in value in meta slots: [''required''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the id slot. The slot representation of the id field in the Dandiset Pydantic model has changes in value in meta slots: [''required''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the license slot. + The slot representation of the license field in the Dandiset Pydantic model + has changes in value in meta slots: [''required''] .' + - 'pydantic2linkml: Impossible to generate slot usage entry for the name slot. + The slot representation of the name field in the Dandiset Pydantic model has + changes in value in meta slots: [''required''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Dandiset Pydantic model has changes in value in meta slots: [''ifabsent'', ''notes'', ''range''] .' - - 'pydantic2linkml: Impossible to generate slot usage entry for the contributor - slot. The slot representation of the contributor field in the Dandiset Pydantic - model has changes in value in meta slots: [''notes'', ''required''] .' - - 'pydantic2linkml: Impossible to generate slot usage entry for the name slot. - The slot representation of the name field in the Dandiset Pydantic model has - changes in value in meta slots: [''required''] .' - - 'pydantic2linkml: Impossible to generate slot usage entry for the license slot. - The slot representation of the license field in the Dandiset Pydantic model - has changes in value in meta slots: [''required''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the wasGeneratedBy slot. The slot representation of the wasGeneratedBy field in the Dandiset Pydantic model has changes in value in meta slots: [''range''] .' @@ -1815,13 +1832,13 @@ classes: range: string Person: notes: + - 'pydantic2linkml: Impossible to generate slot usage entry for the name slot. + The slot representation of the name field in the Person Pydantic model has changes + in value in meta slots: [''required''] .' - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the Person Pydantic model has changes in value in meta slots: [''any_of'', ''ifabsent'', ''notes''] .' - - 'pydantic2linkml: Impossible to generate slot usage entry for the name slot. - The slot representation of the name field in the Person Pydantic model has changes - in value in meta slots: [''required''] .' is_a: Contributor slots: - affiliation @@ -1868,11 +1885,11 @@ classes: is_a: Activity PublishedAsset: notes: - - 'pydantic2linkml: Warning: LinkML does not support multiple inheritance. Publishable - is not specified as a parent, through the `is_a` meta slot, but as a mixin.' - 'pydantic2linkml: Impossible to generate slot usage entry for the schemaKey slot. The slot representation of the schemaKey field in the PublishedAsset Pydantic model has changes in value in meta slots: [''notes''] .' + - 'pydantic2linkml: Warning: LinkML does not support multiple inheritance. Publishable + is not specified as a parent, through the `is_a` meta slot, but as a mixin.' is_a: Asset mixins: - Publishable @@ -1881,8 +1898,6 @@ classes: pattern: ^dandiasset:[a-f0-9]{8}[-]*[a-f0-9]{4}[-]*[a-f0-9]{4}[-]*[a-f0-9]{4}[-]*[a-f0-9]{12}$ PublishedDandiset: notes: - - 'pydantic2linkml: Warning: LinkML does not support multiple inheritance. Publishable - is not specified as a parent, through the `is_a` meta slot, but as a mixin.' - 'pydantic2linkml: Impossible to generate slot usage entry for the id slot. The slot representation of the id field in the PublishedDandiset Pydantic model has changes in value in meta slots: [''pattern''] .' @@ -1892,6 +1907,8 @@ classes: - 'pydantic2linkml: Impossible to generate slot usage entry for the url slot. The slot representation of the url field in the PublishedDandiset Pydantic model has changes in value in meta slots: [''notes'', ''required''] .' + - 'pydantic2linkml: Warning: LinkML does not support multiple inheritance. Publishable + is not specified as a parent, through the `is_a` meta slot, but as a mixin.' is_a: Dandiset mixins: - Publishable From bff037c5939a9857d9e9607d2777bce6f6d731ea Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 18:18:09 -0400 Subject: [PATCH 13/38] rename original models into models_orig --- dandischema/{models.py => models_orig.py} | 0 pyproject.toml | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename dandischema/{models.py => models_orig.py} (100%) diff --git a/dandischema/models.py b/dandischema/models_orig.py similarity index 100% rename from dandischema/models.py rename to dandischema/models_orig.py diff --git a/pyproject.toml b/pyproject.toml index 1792f36e..2d5b9137 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,8 +69,8 @@ dependencies = [ "pydantic2linkml @ git+https://github.com/dandi/pydantic2linkml.git" ] [tool.hatch.envs.linkml-auto-converted.scripts] -2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' -e 's,\\(.\\+\\):[0-9]\\+,\\1:NUMBER,g' > dandischema/models.yaml" -2pydantic = "gen-pydantic --black dandischema/models.yaml > dandischema/models.py" +2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models_orig | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' -e 's,\\(.\\+\\):[0-9]\\+,\\1:NUMBER,g' > dandischema/models.yaml" +2pydantic = "gen-pydantic --black dandischema/models.yaml > dandischema/models_linkml.py" [tool.setuptools.packages.find] namespaces = true From 6bb4b52668a0b97d63c8b194db9ccccb93e7336b Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 18:22:41 -0400 Subject: [PATCH 14/38] Adding models.py back to import from converted and some symbols from _orig for now --- dandischema/models.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 dandischema/models.py diff --git a/dandischema/models.py b/dandischema/models.py new file mode 100644 index 00000000..6815ca49 --- /dev/null +++ b/dandischema/models.py @@ -0,0 +1,9 @@ +from .models_linkml import * # noqa: F401,F403 +from .models_orig import DANDI_INSTANCE_URL_PATTERN # noqa: F401 + +# TODO: temporary imports of consts etc which might need to be 'redone' +# so we do not duplicate them + + +# TODO: do the extra tune ups like linking extra validations etc, +# potentially copied from models_orig.py From 725e957fad7404d5aeaf212b1b7ce89fc7c9f416 Mon Sep 17 00:00:00 2001 From: Isaac To Date: Sun, 15 Mar 2026 22:40:23 -0700 Subject: [PATCH 15/38] Expand comment for linkml-auto-converted hatch env with usage instructions Co-Authored-By: Claude Sonnet 4.6 --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 2d5b9137..686a9566 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,6 +63,9 @@ installer = "uv" python = "3.10" # Env for auto converting `dandischema.models` to LinkML schema and back to Pydantic models +# To invoke conversion scripts provided by the environment, execute the following respective commands: +# `hatch run linkml-auto-converted:2linkml` # Convert dandischema.models_orig -> dandischema/models.yaml +# `hatch run linkml-auto-converted:2pydantic` # Convert dandischema/models.yaml -> dandischema/models_linkml.py [tool.hatch.envs.linkml-auto-converted] dependencies = [ "black", # This allows `gen-pydantic` to format the generated Pydantic models with Black formatting From a2324fa3353ff5fcd132d593220658d3527586d1 Mon Sep 17 00:00:00 2001 From: Isaac To Date: Mon, 16 Mar 2026 16:57:13 -0700 Subject: [PATCH 16/38] fix: correct `default_prefix` to `dandi` There is no prefix defined as `dandi_default`. The intended default prefix is `dandi` --- dandischema/models_overlay.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dandischema/models_overlay.yaml b/dandischema/models_overlay.yaml index 983cbaaf..6bcb0144 100644 --- a/dandischema/models_overlay.yaml +++ b/dandischema/models_overlay.yaml @@ -28,4 +28,4 @@ prefixes: uuid: http://uuid.repronim.org/ xsd: http://www.w3.org/2001/XMLSchema# -default_prefix: dandi_default +default_prefix: dandi From 21fa6826cde3a3bcc5d53cf5f7723feb615fd628 Mon Sep 17 00:00:00 2001 From: Isaac To Date: Mon, 16 Mar 2026 22:57:53 -0700 Subject: [PATCH 17/38] fix: use portable ERE sed pattern for normalizing memory addresses in models.yaml The previous BRE pattern used `\+` (GNU sed extension) which silently fails on macOS BSD sed. Switch to `-E` (extended regex) with POSIX character class `[^[:space:]]` instead of `\S` (also unsupported by BSD sed), making the normalization work on both macOS and Linux. Co-Authored-By: Claude Sonnet 4.6 --- dandischema/models.yaml | 213 ++++++++++++++++++++-------------------- pyproject.toml | 2 +- 2 files changed, 108 insertions(+), 107 deletions(-) diff --git a/dandischema/models.yaml b/dandischema/models.yaml index 301a1a77..eb3678dc 100644 --- a/dandischema/models.yaml +++ b/dandischema/models.yaml @@ -28,7 +28,7 @@ prefixes: spdx: http://spdx.org/licenses/ uuid: http://uuid.repronim.org/ xsd: http://www.w3.org/2001/XMLSchema# -default_prefix: dandi_default +default_prefix: dandi default_range: string enums: @@ -81,10 +81,10 @@ enums: LicenseType: description: An enumeration. permissible_values: - spdx:CC0-1.0: - meaning: spdx:CC0-1.0 spdx:CC-BY-4.0: meaning: spdx:CC-BY-4.0 + spdx:CC0-1.0: + meaning: spdx:CC0-1.0 ParticipantRelationType: description: An enumeration of participant relations permissible_values: @@ -427,7 +427,7 @@ slots: digest: notes: - 'pydantic2linkml: Unable to translate the logic contained in the after validation - function, >.' + function, >.' - 'pydantic2linkml: Warning: The translation is incomplete. `dict` types are yet to be supported.' required: true @@ -484,26 +484,26 @@ slots: - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema contains a choice of type list. The choice type is yet to be supported. (core schema: {''type'': ''union'', ''choices'': [{''type'': ''list'', ''items_schema'': - {''type'': ''model'', ''cls'': , + {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''GenotypeInfo'']}, ''type'': ''function-after''}, ''default'': ''GenotypeInfo'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''locus'': {''type'': - ''model-field'', ''schema'': {''type'': ''model'', ''cls'': , + ''model-field'', ''schema'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, ''schema'': - {''type'': ''literal'', ''expected'': [''Locus'']}, ''type'': ''function-after''}, + DandiBaseModel.ensure_schemakey of >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Locus'']}, ''type'': ''function-after''}, ''default'': ''Locus'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': {''type'': ''model-field'', ''schema'': {''type'': ''union'', ''choices'': [{''type'': ''str''}, {''type'': ''list'', @@ -513,19 +513,19 @@ slots: {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {}}}, ''model_name'': ''Locus'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': - ''model_post_init'', ''config'': {''title'': ''Locus''}, ''ref'': ''dandischema.models.Locus:NUMBER'', + ''model_post_init'', ''config'': {''title'': ''Locus''}, ''ref'': ''dandischema.models_orig.Locus:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}, ''metadata'': {''pydantic_js_updates'': + of >]}}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Locus at which information was extracted.''}}}, ''alleles'': {''type'': ''model-field'', ''schema'': {''type'': ''list'', ''items_schema'': - {''type'': ''model'', ''cls'': , ''schema'': + {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''Allele'']}, ''type'': ''function-after''}, ''default'': ''Allele'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': {''type'': ''model-field'', ''schema'': @@ -539,20 +539,20 @@ slots: ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {}}}, ''model_name'': ''Allele'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': - {''title'': ''Allele''}, ''ref'': ''dandischema.models.Allele:NUMBER'', + {''title'': ''Allele''}, ''ref'': ''dandischema.models_orig.Allele:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}, ''metadata'': {''pydantic_js_updates'': + of >]}}}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Information about alleles at the locus.''}}}, ''wasGeneratedBy'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': - {''type'': ''model'', ''cls'': , ''schema'': - {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''Session'']}, ''type'': ''function-after''}, ''default'': ''Session'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': @@ -577,14 +577,14 @@ slots: {''type'': ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': {''type'': ''tagged-union'', ''choices'': {''Person'': {''function'': {''type'': ''no-info'', ''function'': }, ''schema'': {''type'': ''model'', ''cls'': , + at 0xADDRESS>}, ''schema'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''Person'']}, ''type'': ''function-after''}, ''default'': ''Person'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': {''type'': ''model-field'', ''schema'': @@ -606,16 +606,16 @@ slots: {''nskey'': ''schema''}}}, ''url'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val at 0xADDRESS>}, - ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, - ''metadata'': {''pydantic_js_functions'': [.wrap_val at 0xADDRESS>}, ''schema'': + {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': + {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': ''function-plain'', ''function'': >, ''info_arg'': True}}}, ''default'': None}, ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''roleName'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': - {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models.RoleType:NUMBER''}}}, + {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models_orig.RoleType:NUMBER''}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''Role'', ''description'': ''Role(s) of the contributor. Multiple roles can be selected.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''includeInCitation'': {''type'': @@ -630,14 +630,14 @@ slots: ''Identifier associated with a sponsored or gift award.''}, ''pydantic_js_extra'': {''nskey'': ''dandi''}}}, ''affiliation'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': - ''list'', ''items_schema'': {''type'': ''model'', ''cls'': , + ''list'', ''items_schema'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''Affiliation'']}, ''type'': ''function-after''}, ''default'': ''Affiliation'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': @@ -650,25 +650,25 @@ slots: ''Name of organization''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Affiliation'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': - {''title'': ''Affiliation''}, ''ref'': ''dandischema.models.Affiliation:NUMBER'', + {''title'': ''Affiliation''}, ''ref'': ''dandischema.models_orig.Affiliation:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': - {''pydantic_js_updates'': {''description'': ''An organization that this person - is affiliated with.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': - ''Person'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': - False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Person''}}, - ''ref'': ''dandischema.models.Person:NUMBER'', ''metadata'': {''pydantic_js_functions'': - [>]}, - ''type'': ''function-after''}, ''Organization'': {''type'': ''definition-ref'', - ''schema_ref'': ''dandischema.models.Organization:NUMBER''}, ''Software'': - {''type'': ''model'', ''cls'': , ''schema'': - {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + of >]}}}}, ''default'': None}, + ''metadata'': {''pydantic_js_updates'': {''description'': ''An organization + that this person is affiliated with.''}, ''pydantic_js_extra'': {''nskey'': + ''schema''}}}}, ''model_name'': ''Person'', ''computed_fields'': []}, ''custom_init'': + False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': + {''title'': ''Person''}}, ''ref'': ''dandischema.models_orig.Person:NUMBER'', + ''metadata'': {''pydantic_js_functions'': [>]}, ''type'': ''function-after''}, + ''Organization'': {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models_orig.Organization:NUMBER''}, + ''Software'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''Software'']}, ''type'': ''function-after''}, ''default'': ''Software'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': @@ -692,17 +692,17 @@ slots: software.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Software'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Software''}, - ''ref'': ''dandischema.models.Software:NUMBER'', ''metadata'': {''pydantic_js_functions'': - [>]}}, - ''Agent'': {''type'': ''model'', ''cls'': , + ''ref'': ''dandischema.models_orig.Software:NUMBER'', ''metadata'': {''pydantic_js_functions'': + [>]}}, + ''Agent'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, ''schema'': - {''type'': ''literal'', ''expected'': [''Agent'']}, ''type'': ''function-after''}, + DandiBaseModel.ensure_schemakey of >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Agent'']}, ''type'': ''function-after''}, ''default'': ''Agent'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': @@ -721,20 +721,20 @@ slots: ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Agent'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Agent''}, - ''ref'': ''dandischema.models.Agent:NUMBER'', ''metadata'': {''pydantic_js_functions'': - [>]}}}, + ''ref'': ''dandischema.models_orig.Agent:NUMBER'', ''metadata'': {''pydantic_js_functions'': + [>]}}}, ''discriminator'': ''schemaKey'', ''strict'': False, ''from_attributes'': True, ''metadata'': {}}}}, ''default'': None}, ''metadata'': {''pydantic_js_extra'': {''nskey'': ''prov''}}}, ''used'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''list'', - ''items_schema'': {''type'': ''model'', ''cls'': , + ''items_schema'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''Equipment'']}, ''type'': ''function-after''}, ''default'': ''Equipment'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': @@ -750,22 +750,22 @@ slots: of the equipment.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Equipment'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Equipment''}, - ''ref'': ''dandischema.models.Equipment:NUMBER'', ''metadata'': {''pydantic_js_functions'': - [>]}}}}, + ''ref'': ''dandischema.models_orig.Equipment:NUMBER'', ''metadata'': {''pydantic_js_functions'': + [>]}}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''A listing of equipment used for the activity.''}, ''pydantic_js_extra'': {''nskey'': ''prov''}}}}, ''model_name'': ''Session'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': - {''title'': ''Session''}, ''ref'': ''dandischema.models.Session:NUMBER'', + {''title'': ''Session''}, ''ref'': ''dandischema.models_orig.Session:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': + of >]}}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Information about session activity used to determine genotype.''}, ''pydantic_js_extra'': {''nskey'': ''prov''}}}}, ''model_name'': ''GenotypeInfo'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': - {''title'': ''GenotypeInfo''}, ''ref'': ''dandischema.models.GenotypeInfo:NUMBER'', + {''title'': ''GenotypeInfo''}, ''ref'': ''dandischema.models_orig.GenotypeInfo:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}, {''type'': ''str''}]}).' + of >]}}}, {''type'': ''str''}]}).' required: false hasMember: range: string @@ -844,11 +844,11 @@ slots: - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema contains a choice of type definition-ref. The choice type is yet to be supported. (core schema: {''type'': ''union'', ''choices'': [{''type'': ''definition-ref'', - ''schema_ref'': ''dandischema.models.IdentifierType:NUMBER''}, {''type'': + ''schema_ref'': ''dandischema.models_orig.IdentifierType:NUMBER''}, {''type'': ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val at 0xADDRESS>}, - ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, - ''metadata'': {''pydantic_js_functions'': [.wrap_val at 0xADDRESS>}, ''schema'': + {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': + {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': ''function-plain'', ''function'': >, ''info_arg'': True}}]}).' @@ -873,14 +873,14 @@ slots: of >]}, ''serialization'': {''type'': ''function-plain'', ''function'': >, ''info_arg'': True}}, {''type'': ''model'', - ''cls'': , ''schema'': {''type'': + ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''PublishActivity'']}, ''type'': ''function-after''}, ''default'': ''PublishActivity'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': @@ -905,14 +905,14 @@ slots: ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': {''type'': ''tagged-union'', ''choices'': {''Person'': {''function'': {''type'': ''no-info'', ''function'': }, - ''schema'': {''type'': ''model'', ''cls'': , + ''schema'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''Person'']}, ''type'': ''function-after''}, ''default'': ''Person'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': {''type'': ''model-field'', ''schema'': @@ -934,16 +934,16 @@ slots: {''nskey'': ''schema''}}}, ''url'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''function-wrap'', ''function'': {''type'': ''no-info'', ''function'': .wrap_val at 0xADDRESS>}, - ''schema'': {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, - ''metadata'': {''pydantic_js_functions'': [.wrap_val at 0xADDRESS>}, ''schema'': + {''type'': ''url'', ''allowed_schemes'': [''http'', ''https'']}, ''metadata'': + {''pydantic_js_functions'': [>]}, ''serialization'': {''type'': ''function-plain'', ''function'': >, ''info_arg'': True}}}, ''default'': None}, ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''roleName'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': - {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models.RoleType:NUMBER''}}}, + {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models_orig.RoleType:NUMBER''}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''Role'', ''description'': ''Role(s) of the contributor. Multiple roles can be selected.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''includeInCitation'': {''type'': @@ -958,14 +958,14 @@ slots: ''Identifier associated with a sponsored or gift award.''}, ''pydantic_js_extra'': {''nskey'': ''dandi''}}}, ''affiliation'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': - ''list'', ''items_schema'': {''type'': ''model'', ''cls'': , + ''list'', ''items_schema'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''Affiliation'']}, ''type'': ''function-after''}, ''default'': ''Affiliation'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': @@ -978,25 +978,26 @@ slots: ''Name of organization''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Affiliation'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': - {''title'': ''Affiliation''}, ''ref'': ''dandischema.models.Affiliation:NUMBER'', + {''title'': ''Affiliation''}, ''ref'': ''dandischema.models_orig.Affiliation:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': - {''pydantic_js_updates'': {''description'': ''An organization that this person - is affiliated with.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': - ''Person'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': - False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Person''}}, - ''ref'': ''dandischema.models.Person:NUMBER'', ''metadata'': {''pydantic_js_functions'': - [>]}, - ''type'': ''function-after''}, ''Organization'': {''function'': {''type'': ''no-info'', - ''function'': }, - ''schema'': {''type'': ''model'', ''cls'': , - ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', + of >]}}}}, ''default'': None}, + ''metadata'': {''pydantic_js_updates'': {''description'': ''An organization + that this person is affiliated with.''}, ''pydantic_js_extra'': {''nskey'': + ''schema''}}}}, ''model_name'': ''Person'', ''computed_fields'': []}, ''custom_init'': + False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': + {''title'': ''Person''}}, ''ref'': ''dandischema.models_orig.Person:NUMBER'', + ''metadata'': {''pydantic_js_functions'': [>]}, ''type'': ''function-after''}, + ''Organization'': {''function'': {''type'': ''no-info'', ''function'': }, ''schema'': {''type'': + ''model'', ''cls'': , ''schema'': + {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''Organization'']}, ''type'': ''function-after''}, ''default'': ''Organization'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': @@ -1025,7 +1026,7 @@ slots: ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''roleName'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''list'', ''items_schema'': - {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models.RoleType:NUMBER''}}}, + {''type'': ''definition-ref'', ''schema_ref'': ''dandischema.models_orig.RoleType:NUMBER''}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''title'': ''Role'', ''description'': ''Role(s) of the contributor. Multiple roles can be selected.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}, ''includeInCitation'': {''type'': @@ -1040,14 +1041,14 @@ slots: ''Identifier associated with a sponsored or gift award.''}, ''pydantic_js_extra'': {''nskey'': ''dandi''}}}, ''contactPoint'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': - ''list'', ''items_schema'': {''type'': ''model'', ''cls'': , + ''list'', ''items_schema'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''ContactPoint'']}, ''type'': ''function-after''}, ''default'': ''ContactPoint'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''email'': {''type'': @@ -1070,24 +1071,24 @@ slots: information on how to contact.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''ContactPoint'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': - {''title'': ''ContactPoint''}, ''ref'': ''dandischema.models.ContactPoint:NUMBER'', + {''title'': ''ContactPoint''}, ''ref'': ''dandischema.models_orig.ContactPoint:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}}}, ''default'': None}, ''metadata'': - {''pydantic_js_updates'': {''title'': ''Organization contact information'', + of >]}}}}, ''default'': None}, + ''metadata'': {''pydantic_js_updates'': {''title'': ''Organization contact information'', ''description'': ''Contact for the organization''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Organization'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', - ''config'': {''title'': ''Organization''}}, ''ref'': ''dandischema.models.Organization:NUMBER'', + ''config'': {''title'': ''Organization''}}, ''ref'': ''dandischema.models_orig.Organization:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}, ''type'': ''function-after''}, - ''Software'': {''type'': ''model'', ''cls'': , + of >]}, ''type'': ''function-after''}, + ''Software'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''Software'']}, ''type'': ''function-after''}, ''default'': ''Software'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': @@ -1111,17 +1112,17 @@ slots: software.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Software'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Software''}, - ''ref'': ''dandischema.models.Software:NUMBER'', ''metadata'': {''pydantic_js_functions'': - [>]}}, - ''Agent'': {''type'': ''model'', ''cls'': , + ''ref'': ''dandischema.models_orig.Software:NUMBER'', ''metadata'': {''pydantic_js_functions'': + [>]}}, + ''Agent'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, ''schema'': - {''type'': ''literal'', ''expected'': [''Agent'']}, ''type'': ''function-after''}, + DandiBaseModel.ensure_schemakey of >}, + ''schema'': {''type'': ''literal'', ''expected'': [''Agent'']}, ''type'': ''function-after''}, ''default'': ''Agent'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': @@ -1140,20 +1141,20 @@ slots: ''metadata'': {''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Agent'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Agent''}, - ''ref'': ''dandischema.models.Agent:NUMBER'', ''metadata'': {''pydantic_js_functions'': - [>]}}}, + ''ref'': ''dandischema.models_orig.Agent:NUMBER'', ''metadata'': {''pydantic_js_functions'': + [>]}}}, ''discriminator'': ''schemaKey'', ''strict'': False, ''from_attributes'': True, ''metadata'': {}}}}, ''default'': None}, ''metadata'': {''pydantic_js_extra'': {''nskey'': ''prov''}}}, ''used'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''list'', - ''items_schema'': {''type'': ''model'', ''cls'': , + ''items_schema'': {''type'': ''model'', ''cls'': , ''schema'': {''type'': ''model-fields'', ''fields'': {''id'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''type'': ''nullable'', ''schema'': {''type'': ''str''}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''Uniform resource identifier''}, ''pydantic_js_extra'': {''readOnly'': True}}}, ''schemaKey'': {''type'': ''model-field'', ''schema'': {''type'': ''default'', ''schema'': {''function'': {''type'': ''no-info'', ''function'': >}, + DandiBaseModel.ensure_schemakey of >}, ''schema'': {''type'': ''literal'', ''expected'': [''Equipment'']}, ''type'': ''function-after''}, ''default'': ''Equipment'', ''validate_default'': True}, ''metadata'': {''pydantic_js_extra'': {''readOnly'': True}}}, ''identifier'': @@ -1169,15 +1170,15 @@ slots: of the equipment.''}, ''pydantic_js_extra'': {''nskey'': ''schema''}}}}, ''model_name'': ''Equipment'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', ''config'': {''title'': ''Equipment''}, - ''ref'': ''dandischema.models.Equipment:NUMBER'', ''metadata'': {''pydantic_js_functions'': - [>]}}}}, + ''ref'': ''dandischema.models_orig.Equipment:NUMBER'', ''metadata'': {''pydantic_js_functions'': + [>]}}}}, ''default'': None}, ''metadata'': {''pydantic_js_updates'': {''description'': ''A listing of equipment used for the activity.''}, ''pydantic_js_extra'': {''nskey'': ''prov''}}}}, ''model_name'': ''PublishActivity'', ''computed_fields'': []}, ''custom_init'': False, ''root_model'': False, ''post_init'': ''model_post_init'', - ''config'': {''title'': ''PublishActivity''}, ''ref'': ''dandischema.models.PublishActivity:NUMBER'', + ''config'': {''title'': ''PublishActivity''}, ''ref'': ''dandischema.models_orig.PublishActivity:NUMBER'', ''metadata'': {''pydantic_js_functions'': [>]}}]}).' + of >]}}]}).' required: true relatedParticipant: range: RelatedParticipant @@ -1213,7 +1214,7 @@ slots: schemaKey: notes: - 'pydantic2linkml: Unable to translate the logic contained in the after validation - function, >.' + function, >.' ifabsent: string(DandiBaseModel) range: string required: false @@ -1257,7 +1258,7 @@ slots: value: notes: - 'pydantic2linkml: Unable to translate the logic contained in the after validation - function, >.' + function, >.' - 'pydantic2linkml: Warning: The translation is incomplete. The union core schema contains a choice of type any. The choice type is yet to be supported. (core schema: {''type'': ''union'', ''choices'': [{''type'': ''any''}, {''type'': diff --git a/pyproject.toml b/pyproject.toml index 686a9566..2bc8fc04 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -72,7 +72,7 @@ dependencies = [ "pydantic2linkml @ git+https://github.com/dandi/pydantic2linkml.git" ] [tool.hatch.envs.linkml-auto-converted.scripts] -2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models_orig | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' -e 's,\\(.\\+\\):[0-9]\\+,\\1:NUMBER,g' > dandischema/models.yaml" +2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models_orig | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' -E -e 's,([^[:space:]]+):[0-9]+,\\1:NUMBER,g' > dandischema/models.yaml" 2pydantic = "gen-pydantic --black dandischema/models.yaml > dandischema/models_linkml.py" [tool.setuptools.packages.find] From 73c46b6a4690ce492282b407c44d8052d69082e7 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 16:42:59 -0400 Subject: [PATCH 18/38] Now we will sanitize the converted model addresses --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d51e4a19..5d6dcd32 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,7 +69,7 @@ dependencies = [ "pydantic2linkml @ git+https://github.com/dandi/pydantic2linkml.git" ] [tool.hatch.envs.linkml-auto-converted.scripts] -2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml -o dandischema/models.yaml dandischema.models" +2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' > dandischema/models.yaml " 2pydantic = "gen-pydantic --black dandischema/models.yaml > dandischema/models.py" [tool.setuptools.packages.find] From c79b1e2694c3d86b0813f84fca4455c37b9e58e0 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 18:32:09 -0400 Subject: [PATCH 19/38] more sanitization --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5d6dcd32..1792f36e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,7 +69,7 @@ dependencies = [ "pydantic2linkml @ git+https://github.com/dandi/pydantic2linkml.git" ] [tool.hatch.envs.linkml-auto-converted.scripts] -2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' > dandischema/models.yaml " +2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' -e 's,\\(.\\+\\):[0-9]\\+,\\1:NUMBER,g' > dandischema/models.yaml" 2pydantic = "gen-pydantic --black dandischema/models.yaml > dandischema/models.py" [tool.setuptools.packages.find] From 0b2b51dff340539dfea196319bf8c526d17ec71b Mon Sep 17 00:00:00 2001 From: Isaac To Date: Thu, 12 Mar 2026 20:07:21 -0700 Subject: [PATCH 20/38] feat: provide `prefixes` definition in the overlay file These prefixes are copied from https://github.com/dandi/schema/blob/master/releases/0.7.0/context.json --- dandischema/models_overlay.yaml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/dandischema/models_overlay.yaml b/dandischema/models_overlay.yaml index 69b1c3e2..f3e477bd 100644 --- a/dandischema/models_overlay.yaml +++ b/dandischema/models_overlay.yaml @@ -2,3 +2,27 @@ name: dandi-schema id: https://schema.dandiarchive.org/s/dandi/v0.7 version: 0.7.0 status: eunal:concept-status/DRAFT + +prefixes: + dandi: http://schema.dandiarchive.org/ + dcite: http://schema.dandiarchive.org/datacite/ + dandiasset: http://dandiarchive.org/asset/ + DANDI: http://dandiarchive.org/dandiset/ + dct: http://purl.org/dc/terms/ + owl: http://www.w3.org/2002/07/owl# + rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# + rdfa: http://www.w3.org/ns/rdfa# + rdfs: http://www.w3.org/2000/01/rdf-schema# + schema: http://schema.org/ + xsd: http://www.w3.org/2001/XMLSchema# + skos: http://www.w3.org/2004/02/skos/core# + prov: http://www.w3.org/ns/prov# + pav: http://purl.org/pav/ + nidm: http://purl.org/nidash/nidm# + uuid: http://uuid.repronim.org/ + rs: http://schema.repronim.org/ + RRID: "https://scicrunch.org/resolver/RRID:" + ORCID: https://orcid.org/ + ROR: https://ror.org/ + PATO: http://purl.obolibrary.org/obo/PATO_ + spdx: http://spdx.org/licenses/ From 6cb2f826c6c011d72ce7f7d9d91a985417da19ff Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 17:05:48 -0400 Subject: [PATCH 21/38] Added linkml: prefix and sorted all the entries --- dandischema/models_overlay.yaml | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/dandischema/models_overlay.yaml b/dandischema/models_overlay.yaml index f3e477bd..d10006bc 100644 --- a/dandischema/models_overlay.yaml +++ b/dandischema/models_overlay.yaml @@ -4,25 +4,26 @@ version: 0.7.0 status: eunal:concept-status/DRAFT prefixes: - dandi: http://schema.dandiarchive.org/ - dcite: http://schema.dandiarchive.org/datacite/ dandiasset: http://dandiarchive.org/asset/ DANDI: http://dandiarchive.org/dandiset/ + dandi: http://schema.dandiarchive.org/ + dcite: http://schema.dandiarchive.org/datacite/ dct: http://purl.org/dc/terms/ + linkml: https://w3id.org/linkml/ + nidm: http://purl.org/nidash/nidm# + ORCID: https://orcid.org/ owl: http://www.w3.org/2002/07/owl# - rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# + PATO: http://purl.obolibrary.org/obo/PATO_ + pav: http://purl.org/pav/ + prov: http://www.w3.org/ns/prov# rdfa: http://www.w3.org/ns/rdfa# + rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# rdfs: http://www.w3.org/2000/01/rdf-schema# + ROR: https://ror.org/ + RRID: "https://scicrunch.org/resolver/RRID:" + rs: http://schema.repronim.org/ schema: http://schema.org/ - xsd: http://www.w3.org/2001/XMLSchema# skos: http://www.w3.org/2004/02/skos/core# - prov: http://www.w3.org/ns/prov# - pav: http://purl.org/pav/ - nidm: http://purl.org/nidash/nidm# - uuid: http://uuid.repronim.org/ - rs: http://schema.repronim.org/ - RRID: "https://scicrunch.org/resolver/RRID:" - ORCID: https://orcid.org/ - ROR: https://ror.org/ - PATO: http://purl.obolibrary.org/obo/PATO_ spdx: http://spdx.org/licenses/ + uuid: http://uuid.repronim.org/ + xsd: http://www.w3.org/2001/XMLSchema# From 76526a9d49c2d591b57d1927bb7f6b271e318888 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 17:08:12 -0400 Subject: [PATCH 22/38] Provide default prefix to be custom dandi_default --- dandischema/models_overlay.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dandischema/models_overlay.yaml b/dandischema/models_overlay.yaml index d10006bc..983cbaaf 100644 --- a/dandischema/models_overlay.yaml +++ b/dandischema/models_overlay.yaml @@ -27,3 +27,5 @@ prefixes: spdx: http://spdx.org/licenses/ uuid: http://uuid.repronim.org/ xsd: http://www.w3.org/2001/XMLSchema# + +default_prefix: dandi_default From 7fa95c24c88d614c156a91d1ef2b955b500b7241 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 18:18:09 -0400 Subject: [PATCH 23/38] use portable ERE sed pattern for normalizing memory addresses The previous BRE pattern used `\+` (GNU sed extension) which silently fails on macOS BSD sed. Switch to `-E` (extended regex) with POSIX character class `[^[:space:]]` instead of `\S` (also unsupported by BSD sed), making the normalization work on both macOS and Linux. Co-Authored-By: Claude Sonnet 4.6 Expand comment for linkml-auto-converted hatch env with usage instructions Co-Authored-By: Claude Sonnet 4.6 --- pyproject.toml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1792f36e..316c271e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,14 +63,17 @@ installer = "uv" python = "3.10" # Env for auto converting `dandischema.models` to LinkML schema and back to Pydantic models +# To invoke conversion scripts provided by the environment, execute the following respective commands: +# `hatch run linkml-auto-converted:2linkml` # Convert dandischema.models -> dandischema/models.yaml +# `hatch run linkml-auto-converted:2pydantic` # Convert dandischema/models.yaml -> dandischema/models_linkml.py [tool.hatch.envs.linkml-auto-converted] dependencies = [ "black", # This allows `gen-pydantic` to format the generated Pydantic models with Black formatting "pydantic2linkml @ git+https://github.com/dandi/pydantic2linkml.git" ] [tool.hatch.envs.linkml-auto-converted.scripts] -2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' -e 's,\\(.\\+\\):[0-9]\\+,\\1:NUMBER,g' > dandischema/models.yaml" -2pydantic = "gen-pydantic --black dandischema/models.yaml > dandischema/models.py" +2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' -E -e 's,([^[:space:]]+):[0-9]+,\\1:NUMBER,g' > dandischema/models.yaml" +2pydantic = "gen-pydantic --black dandischema/models.yaml > dandischema/models_linkml.py" [tool.setuptools.packages.find] namespaces = true From fad68793ea7408dba05467fb74b7e12996206b7c Mon Sep 17 00:00:00 2001 From: Isaac To Date: Mon, 16 Mar 2026 16:57:13 -0700 Subject: [PATCH 24/38] fix: correct `default_prefix` to `dandi` There is no prefix defined as `dandi_default`. The intended default prefix is `dandi` --- dandischema/models_overlay.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dandischema/models_overlay.yaml b/dandischema/models_overlay.yaml index 983cbaaf..6bcb0144 100644 --- a/dandischema/models_overlay.yaml +++ b/dandischema/models_overlay.yaml @@ -28,4 +28,4 @@ prefixes: uuid: http://uuid.repronim.org/ xsd: http://www.w3.org/2001/XMLSchema# -default_prefix: dandi_default +default_prefix: dandi From 5f78b87873728bccddc2c4ea469469d1c9003095 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 13 Mar 2026 18:22:41 -0400 Subject: [PATCH 25/38] Adding models_importstab.py so we could use it to import from converted and some symbols from _orig for now we do it so it does not overlay models.py since then git is unable to track renames --- dandischema/models_importstab.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 dandischema/models_importstab.py diff --git a/dandischema/models_importstab.py b/dandischema/models_importstab.py new file mode 100644 index 00000000..6815ca49 --- /dev/null +++ b/dandischema/models_importstab.py @@ -0,0 +1,9 @@ +from .models_linkml import * # noqa: F401,F403 +from .models_orig import DANDI_INSTANCE_URL_PATTERN # noqa: F401 + +# TODO: temporary imports of consts etc which might need to be 'redone' +# so we do not duplicate them + + +# TODO: do the extra tune ups like linking extra validations etc, +# potentially copied from models_orig.py From 0208c9c6eed6c6e4431f33e5d6dfb7b6fba3bffe Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 20 Mar 2026 17:13:26 -0400 Subject: [PATCH 26/38] Adding the tool to assist in establishing "merges" with regeneration into linkml-auto-converted --- tools/linkml_conversion | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100755 tools/linkml_conversion diff --git a/tools/linkml_conversion b/tools/linkml_conversion new file mode 100755 index 00000000..c34e803c --- /dev/null +++ b/tools/linkml_conversion @@ -0,0 +1,28 @@ +#!/bin/bash +# +# Script which will force us to apply the changes we have +# + +set -eu + +ver=$(git describe linkml-conversion) + +# ensure we are clean to no side effects and are in +test -z "$(git status --porcelain)" || { echo "Git tree is dirty, aborting."; exit 1; } + +git checkout linkml-auto-converted + +git merge -s ours --no-commit linkml-conversion + +git read-tree -m -u linkml-conversion + +hatch run linkml-auto-converted:2linkml +hatch run linkml-auto-converted:2pydantic + +# add (re)generated files +git add dandischema/models_linkml.py dandischema/models.yaml + +# add our stab +git mv dandischema/models_importstab.py dandischema/models.py + +git commit -m '"Merged" with reconversion linkml-conversion $ver' -a From 488e2e94f74b2101e36c0ab74ed4c79d234e1721 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 20 Mar 2026 17:18:02 -0400 Subject: [PATCH 27/38] We are doomed to use --no-verify for now as converted python code has flake8 issues --- tools/linkml_conversion | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/linkml_conversion b/tools/linkml_conversion index c34e803c..282d0565 100755 --- a/tools/linkml_conversion +++ b/tools/linkml_conversion @@ -25,4 +25,4 @@ git add dandischema/models_linkml.py dandischema/models.yaml # add our stab git mv dandischema/models_importstab.py dandischema/models.py -git commit -m '"Merged" with reconversion linkml-conversion $ver' -a +git commit -m '"Merged" with reconversion linkml-conversion $ver' -a --no-verify From 0ba5ad757e265992da110424ab3c2b83b3398bb7 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 20 Mar 2026 17:22:05 -0400 Subject: [PATCH 28/38] BF the commit version specification --- tools/linkml_conversion | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/linkml_conversion b/tools/linkml_conversion index 282d0565..21e74f09 100755 --- a/tools/linkml_conversion +++ b/tools/linkml_conversion @@ -25,4 +25,4 @@ git add dandischema/models_linkml.py dandischema/models.yaml # add our stab git mv dandischema/models_importstab.py dandischema/models.py -git commit -m '"Merged" with reconversion linkml-conversion $ver' -a --no-verify +git commit -m "'Merged' with reconversion linkml-conversion $ver" -a --no-verify From 2faf932ae562cd09ea0544810c9454812e58e3e1 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 20 Mar 2026 17:38:34 -0400 Subject: [PATCH 29/38] Implement poor man patch queue --- tools/linkml_conversion | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tools/linkml_conversion b/tools/linkml_conversion index 21e74f09..abdb9f26 100755 --- a/tools/linkml_conversion +++ b/tools/linkml_conversion @@ -16,6 +16,19 @@ git merge -s ours --no-commit linkml-conversion git read-tree -m -u linkml-conversion +# Poor man patch queue implementation +# Edit this list if you want to merge or drop PRs branches to be patched with. +# Order matters +branches_to_merge=( remove-discriminated-unions ) + +# determine remote name based on what remote linkml-conversion is +# tracked from which should correspond to our main repo! +remote=$(git config branch.linkml-conversion.remote) + +for b in $"{branches_to_merge[@]}"; do + git diff "$remote"/master...$b | patch -p1 +done + hatch run linkml-auto-converted:2linkml hatch run linkml-auto-converted:2pydantic @@ -25,4 +38,7 @@ git add dandischema/models_linkml.py dandischema/models.yaml # add our stab git mv dandischema/models_importstab.py dandischema/models.py -git commit -m "'Merged' with reconversion linkml-conversion $ver" -a --no-verify +git commit -m "'Merged' with linkml-conversion $ver and ${#branches_to_merge[@]} branches + +branches merged: ${branches_to_merge[@]} +" -a --no-verify From c177479760b4ebb4d555cb427473dfcb708adfa5 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 20 Mar 2026 17:49:35 -0400 Subject: [PATCH 30/38] reflect that I rewritten how we handle patching we had to maintain original filename for models.py to apply patches easily --- tools/linkml_conversion | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/linkml_conversion b/tools/linkml_conversion index abdb9f26..c600b1df 100755 --- a/tools/linkml_conversion +++ b/tools/linkml_conversion @@ -35,7 +35,8 @@ hatch run linkml-auto-converted:2pydantic # add (re)generated files git add dandischema/models_linkml.py dandischema/models.yaml -# add our stab +# add our stab and rename original models.py +git mv dandischema/models.py dandischema/models_orig.py git mv dandischema/models_importstab.py dandischema/models.py git commit -m "'Merged' with linkml-conversion $ver and ${#branches_to_merge[@]} branches From 54cf276ede8a9da021395715e7d0935e101fc722 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 20 Mar 2026 17:52:23 -0400 Subject: [PATCH 31/38] Inform on what we are doing --- tools/linkml_conversion | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/linkml_conversion b/tools/linkml_conversion index c600b1df..bd80abd0 100755 --- a/tools/linkml_conversion +++ b/tools/linkml_conversion @@ -25,8 +25,12 @@ branches_to_merge=( remove-discriminated-unions ) # tracked from which should correspond to our main repo! remote=$(git config branch.linkml-conversion.remote) -for b in $"{branches_to_merge[@]}"; do - git diff "$remote"/master...$b | patch -p1 +for b in ${branches_to_merge[@]}; do + b_ver=$(git describe "$remote"/$b) + echo "Applying branch $b with following differences" + git diff --stat "$remote"/master..."$remote"/$b + + git diff "$remote"/master..."$remote"/$b | patch -p1 done hatch run linkml-auto-converted:2linkml From 5eb4a91f695af0b2dbb948335e4e8bc9671d5f13 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 20 Mar 2026 18:08:21 -0400 Subject: [PATCH 32/38] Now do patch diff of master in as well for good measure --- tools/linkml_conversion | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/tools/linkml_conversion b/tools/linkml_conversion index bd80abd0..f2b8175b 100755 --- a/tools/linkml_conversion +++ b/tools/linkml_conversion @@ -5,11 +5,21 @@ set -eu -ver=$(git describe linkml-conversion) - # ensure we are clean to no side effects and are in test -z "$(git status --porcelain)" || { echo "Git tree is dirty, aborting."; exit 1; } +# determine remote name based on what remote linkml-conversion is +# tracked from which should correspond to our main repo! +remote=$(git config branch.linkml-conversion.remote) + +git checkout linkml-conversion +# ensure up to date! +git pull --ff-only + +ver=$(git describe linkml-conversion) + +master_mergebase=$(git merge-base $remote/master linkml-conversion) + git checkout linkml-auto-converted git merge -s ours --no-commit linkml-conversion @@ -19,18 +29,19 @@ git read-tree -m -u linkml-conversion # Poor man patch queue implementation # Edit this list if you want to merge or drop PRs branches to be patched with. # Order matters -branches_to_merge=( remove-discriminated-unions ) +branches_to_merge=( + master + remove-discriminated-unions +) -# determine remote name based on what remote linkml-conversion is -# tracked from which should correspond to our main repo! -remote=$(git config branch.linkml-conversion.remote) +echo "Applying patches from base $master_mergebase" for b in ${branches_to_merge[@]}; do b_ver=$(git describe "$remote"/$b) - echo "Applying branch $b with following differences" - git diff --stat "$remote"/master..."$remote"/$b + echo "Applying branch $b patch with following differences" + git diff --stat "$master_mergebase"..."$remote"/$b - git diff "$remote"/master..."$remote"/$b | patch -p1 + git diff "$master_mergebase"..."$remote"/$b | patch -p1 done hatch run linkml-auto-converted:2linkml From 76a9d771eacdf3da85a849d8f3951bdc12dc2844 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 20 Mar 2026 18:12:13 -0400 Subject: [PATCH 33/38] Removing reporting branches - did not work --- tools/linkml_conversion | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tools/linkml_conversion b/tools/linkml_conversion index f2b8175b..cd94ea86 100755 --- a/tools/linkml_conversion +++ b/tools/linkml_conversion @@ -54,7 +54,4 @@ git add dandischema/models_linkml.py dandischema/models.yaml git mv dandischema/models.py dandischema/models_orig.py git mv dandischema/models_importstab.py dandischema/models.py -git commit -m "'Merged' with linkml-conversion $ver and ${#branches_to_merge[@]} branches - -branches merged: ${branches_to_merge[@]} -" -a --no-verify +git commit -m "'Merged' with linkml-conversion $ver and ${#branches_to_merge[@]} branches" -a --no-verify From 78d6899f97fe4fb94f62c5142e9335abda8e86c9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 22:13:16 +0000 Subject: [PATCH 34/38] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- dandischema/models_linkml.py | 1263 +++++++++++++++++++++++++--------- 1 file changed, 945 insertions(+), 318 deletions(-) diff --git a/dandischema/models_linkml.py b/dandischema/models_linkml.py index 2a01d944..84bbe315 100644 --- a/dandischema/models_linkml.py +++ b/dandischema/models_linkml.py @@ -1,10 +1,10 @@ from __future__ import annotations -import re -import sys from datetime import date, datetime, time from decimal import Decimal from enum import Enum +import re +import sys from typing import Any, ClassVar, Literal, Optional, Union from pydantic import ( @@ -60,29 +60,92 @@ def __contains__(self, key: str) -> bool: "imports": ["linkml:types"], "name": "dandi-schema", "prefixes": { - "DANDI": {"prefix_prefix": "DANDI", "prefix_reference": "http://dandiarchive.org/dandiset/"}, - "ORCID": {"prefix_prefix": "ORCID", "prefix_reference": "https://orcid.org/"}, - "PATO": {"prefix_prefix": "PATO", "prefix_reference": "http://purl.obolibrary.org/obo/PATO_"}, + "DANDI": { + "prefix_prefix": "DANDI", + "prefix_reference": "http://dandiarchive.org/dandiset/", + }, + "ORCID": { + "prefix_prefix": "ORCID", + "prefix_reference": "https://orcid.org/", + }, + "PATO": { + "prefix_prefix": "PATO", + "prefix_reference": "http://purl.obolibrary.org/obo/PATO_", + }, "ROR": {"prefix_prefix": "ROR", "prefix_reference": "https://ror.org/"}, - "RRID": {"prefix_prefix": "RRID", "prefix_reference": "https://scicrunch.org/resolver/RRID:"}, - "dandi": {"prefix_prefix": "dandi", "prefix_reference": "http://schema.dandiarchive.org/"}, - "dandiasset": {"prefix_prefix": "dandiasset", "prefix_reference": "http://dandiarchive.org/asset/"}, - "dcite": {"prefix_prefix": "dcite", "prefix_reference": "http://schema.dandiarchive.org/datacite/"}, - "dct": {"prefix_prefix": "dct", "prefix_reference": "http://purl.org/dc/terms/"}, - "linkml": {"prefix_prefix": "linkml", "prefix_reference": "https://w3id.org/linkml/"}, - "nidm": {"prefix_prefix": "nidm", "prefix_reference": "http://purl.org/nidash/nidm#"}, - "owl": {"prefix_prefix": "owl", "prefix_reference": "http://www.w3.org/2002/07/owl#"}, + "RRID": { + "prefix_prefix": "RRID", + "prefix_reference": "https://scicrunch.org/resolver/RRID:", + }, + "dandi": { + "prefix_prefix": "dandi", + "prefix_reference": "http://schema.dandiarchive.org/", + }, + "dandiasset": { + "prefix_prefix": "dandiasset", + "prefix_reference": "http://dandiarchive.org/asset/", + }, + "dcite": { + "prefix_prefix": "dcite", + "prefix_reference": "http://schema.dandiarchive.org/datacite/", + }, + "dct": { + "prefix_prefix": "dct", + "prefix_reference": "http://purl.org/dc/terms/", + }, + "linkml": { + "prefix_prefix": "linkml", + "prefix_reference": "https://w3id.org/linkml/", + }, + "nidm": { + "prefix_prefix": "nidm", + "prefix_reference": "http://purl.org/nidash/nidm#", + }, + "owl": { + "prefix_prefix": "owl", + "prefix_reference": "http://www.w3.org/2002/07/owl#", + }, "pav": {"prefix_prefix": "pav", "prefix_reference": "http://purl.org/pav/"}, - "prov": {"prefix_prefix": "prov", "prefix_reference": "http://www.w3.org/ns/prov#"}, - "rdf": {"prefix_prefix": "rdf", "prefix_reference": "http://www.w3.org/1999/02/22-rdf-syntax-ns#"}, - "rdfa": {"prefix_prefix": "rdfa", "prefix_reference": "http://www.w3.org/ns/rdfa#"}, - "rdfs": {"prefix_prefix": "rdfs", "prefix_reference": "http://www.w3.org/2000/01/rdf-schema#"}, - "rs": {"prefix_prefix": "rs", "prefix_reference": "http://schema.repronim.org/"}, - "schema": {"prefix_prefix": "schema", "prefix_reference": "http://schema.org/"}, - "skos": {"prefix_prefix": "skos", "prefix_reference": "http://www.w3.org/2004/02/skos/core#"}, - "spdx": {"prefix_prefix": "spdx", "prefix_reference": "http://spdx.org/licenses/"}, - "uuid": {"prefix_prefix": "uuid", "prefix_reference": "http://uuid.repronim.org/"}, - "xsd": {"prefix_prefix": "xsd", "prefix_reference": "http://www.w3.org/2001/XMLSchema#"}, + "prov": { + "prefix_prefix": "prov", + "prefix_reference": "http://www.w3.org/ns/prov#", + }, + "rdf": { + "prefix_prefix": "rdf", + "prefix_reference": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + }, + "rdfa": { + "prefix_prefix": "rdfa", + "prefix_reference": "http://www.w3.org/ns/rdfa#", + }, + "rdfs": { + "prefix_prefix": "rdfs", + "prefix_reference": "http://www.w3.org/2000/01/rdf-schema#", + }, + "rs": { + "prefix_prefix": "rs", + "prefix_reference": "http://schema.repronim.org/", + }, + "schema": { + "prefix_prefix": "schema", + "prefix_reference": "http://schema.org/", + }, + "skos": { + "prefix_prefix": "skos", + "prefix_reference": "http://www.w3.org/2004/02/skos/core#", + }, + "spdx": { + "prefix_prefix": "spdx", + "prefix_reference": "http://spdx.org/licenses/", + }, + "uuid": { + "prefix_prefix": "uuid", + "prefix_reference": "http://uuid.repronim.org/", + }, + "xsd": { + "prefix_prefix": "xsd", + "prefix_reference": "http://www.w3.org/2001/XMLSchema#", + }, }, "source_file": "dandischema/models.yaml", "status": "eunal:concept-status/DRAFT", @@ -270,9 +333,14 @@ class RoleType(str, Enum): class DandiBaseModel(ConfiguredBaseModel): - linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "https://schema.dandiarchive.org/s/dandi/v0.7"}) + linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta( + {"from_schema": "https://schema.dandiarchive.org/s/dandi/v0.7"} + ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -309,19 +377,37 @@ class AccessRequirements(DandiBaseModel): contactPoint: Optional[ContactPoint] = Field( default=None, - json_schema_extra={"linkml_meta": {"domain_of": ["AccessRequirements", "EthicsApproval", "Organization"]}}, + json_schema_extra={ + "linkml_meta": { + "domain_of": ["AccessRequirements", "EthicsApproval", "Organization"] + } + }, ) description: Optional[str] = Field( default=None, json_schema_extra={ - "linkml_meta": {"domain_of": ["AccessRequirements", "Activity", "CommonModel", "Equipment"]} + "linkml_meta": { + "domain_of": [ + "AccessRequirements", + "Activity", + "CommonModel", + "Equipment", + ] + } }, ) embargoedUntil: Optional[date] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AccessRequirements"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["AccessRequirements"]}}, + ) + status: AccessType = Field( + default=..., + json_schema_extra={"linkml_meta": {"domain_of": ["AccessRequirements"]}}, + ) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - status: AccessType = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["AccessRequirements"]}}) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -354,7 +440,11 @@ class Activity(DandiBaseModel): "['ifabsent', 'notes', 'range'] ." ], "slot_usage": { - "identifier": {"name": "identifier", "range": "string", "required": False}, + "identifier": { + "name": "identifier", + "range": "string", + "required": False, + }, "name": { "name": "name", "notes": [ @@ -374,7 +464,14 @@ class Activity(DandiBaseModel): description: Optional[str] = Field( default=None, json_schema_extra={ - "linkml_meta": {"domain_of": ["AccessRequirements", "Activity", "CommonModel", "Equipment"]} + "linkml_meta": { + "domain_of": [ + "AccessRequirements", + "Activity", + "CommonModel", + "Equipment", + ] + } }, ) endDate: Optional[datetime] = Field( @@ -455,37 +552,42 @@ class Activity(DandiBaseModel): used: Optional[list[Equipment]] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Activity"]}} ) - wasAssociatedWith: Optional[list[Union[Agent, Organization, Person, Software]]] = Field( + wasAssociatedWith: Optional[list[Union[Agent, Organization, Person, Software]]] = ( + Field( + default=None, + json_schema_extra={ + "linkml_meta": { + "any_of": [ + { + "notes": [ + "pydantic2linkml: Unable to translate the logic " + "contained in the after validation function, ." + ], + "range": "Person", + }, + { + "notes": [ + "pydantic2linkml: Unable to translate the logic " + "contained in the after validation function, ." + ], + "range": "Organization", + }, + {"range": "Software"}, + {"range": "Agent"}, + ], + "domain_of": ["Activity"], + } + }, + ) + ) + id: Optional[str] = Field( default=None, - json_schema_extra={ - "linkml_meta": { - "any_of": [ - { - "notes": [ - "pydantic2linkml: Unable to translate the logic " - "contained in the after validation function, ." - ], - "range": "Person", - }, - { - "notes": [ - "pydantic2linkml: Unable to translate the logic " - "contained in the after validation function, ." - ], - "range": "Organization", - }, - {"range": "Software"}, - {"range": "Agent"}, - ], - "domain_of": ["Activity"], - } - }, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -582,7 +684,10 @@ class Affiliation(DandiBaseModel): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -624,7 +729,11 @@ class Agent(DandiBaseModel): "['ifabsent', 'notes', 'range'] ." ], "slot_usage": { - "identifier": {"name": "identifier", "range": "string", "required": False}, + "identifier": { + "name": "identifier", + "range": "string", + "required": False, + }, "name": {"name": "name", "required": True}, "url": { "name": "url", @@ -706,7 +815,10 @@ class Agent(DandiBaseModel): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -749,7 +861,10 @@ class Allele(DandiBaseModel): ], "slot_usage": { "identifier": { - "any_of": [{"range": "string"}, {"multivalued": True, "range": "string"}], + "any_of": [ + {"range": "string"}, + {"multivalued": True, "range": "string"}, + ], "name": "identifier", "range": "Any", "required": True, @@ -758,13 +873,20 @@ class Allele(DandiBaseModel): } ) - alleleSymbol: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Allele"]}}) - alleleType: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Allele"]}}) + alleleSymbol: Optional[str] = Field( + default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Allele"]}} + ) + alleleType: Optional[str] = Field( + default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Allele"]}} + ) identifier: str = Field( default=..., json_schema_extra={ "linkml_meta": { - "any_of": [{"range": "string"}, {"multivalued": True, "range": "string"}], + "any_of": [ + {"range": "string"}, + {"multivalued": True, "range": "string"}, + ], "domain_of": [ "Activity", "Affiliation", @@ -786,7 +908,10 @@ class Allele(DandiBaseModel): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -826,32 +951,55 @@ class AssetsSummary(DandiBaseModel): ) approach: Optional[list[ApproachType]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]} + }, ) dataStandard: Optional[list[StandardsType]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary"]}}, ) measurementTechnique: Optional[list[MeasurementTechniqueType]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]} + }, + ) + numberOfBytes: int = Field( + default=..., json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary"]}} ) - numberOfBytes: int = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary"]}}) numberOfCells: Optional[int] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary"]}}, + ) + numberOfFiles: int = Field( + default=..., json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary"]}} ) - numberOfFiles: int = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary"]}}) numberOfSamples: Optional[int] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary"]}}, ) numberOfSubjects: Optional[int] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary"]}}, ) species: Optional[list[SpeciesType]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "Participant"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "Participant"]} + }, ) variableMeasured: Optional[list[str]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]} + }, + ) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -899,7 +1047,10 @@ class BaseType(DandiBaseModel): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - {"pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", "range": "string"}, + { + "pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", + "range": "string", + }, ], "name": "identifier", "range": "Any", @@ -936,7 +1087,10 @@ class BaseType(DandiBaseModel): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - {"pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", "range": "string"}, + { + "pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", + "range": "string", + }, ], "domain_of": [ "Activity", @@ -983,7 +1137,10 @@ class BaseType(DandiBaseModel): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -1046,7 +1203,10 @@ class Anatomy(BaseType): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - {"pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", "range": "string"}, + { + "pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", + "range": "string", + }, ], "domain_of": [ "Activity", @@ -1093,7 +1253,10 @@ class Anatomy(BaseType): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -1156,7 +1319,10 @@ class ApproachType(BaseType): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - {"pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", "range": "string"}, + { + "pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", + "range": "string", + }, ], "domain_of": [ "Activity", @@ -1203,7 +1369,10 @@ class ApproachType(BaseType): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -1266,7 +1435,10 @@ class AssayType(BaseType): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - {"pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", "range": "string"}, + { + "pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", + "range": "string", + }, ], "domain_of": [ "Activity", @@ -1313,7 +1485,10 @@ class AssayType(BaseType): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -1359,7 +1534,11 @@ class BioSample(DandiBaseModel): "['ifabsent', 'notes', 'range'] ." ], "slot_usage": { - "identifier": {"name": "identifier", "range": "string", "required": True}, + "identifier": { + "name": "identifier", + "range": "string", + "required": True, + }, "sameAs": {"name": "sameAs", "range": "string"}, }, } @@ -1401,16 +1580,27 @@ class BioSample(DandiBaseModel): ) sameAs: Optional[list[str]] = Field( default=None, - json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample", "Dandiset", "Participant"]}}, + json_schema_extra={ + "linkml_meta": { + "domain_of": ["BareAsset", "BioSample", "Dandiset", "Participant"] + } + }, + ) + sampleType: SampleType = Field( + default=..., json_schema_extra={"linkml_meta": {"domain_of": ["BioSample"]}} ) - sampleType: SampleType = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["BioSample"]}}) wasAttributedTo: Optional[list[Participant]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}}, ) wasDerivedFrom: Optional[list[BioSample]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}}, + ) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -1482,7 +1672,11 @@ class CommonModel(DandiBaseModel): default=None, json_schema_extra={ "linkml_meta": { - "any_of": [{"range": "Disorder"}, {"range": "Anatomy"}, {"range": "GenericType"}], + "any_of": [ + {"range": "Disorder"}, + {"range": "Anatomy"}, + {"range": "GenericType"}, + ], "domain_of": ["CommonModel"], } }, @@ -1536,7 +1730,14 @@ class CommonModel(DandiBaseModel): description: Optional[str] = Field( default=None, json_schema_extra={ - "linkml_meta": {"domain_of": ["AccessRequirements", "Activity", "CommonModel", "Equipment"]} + "linkml_meta": { + "domain_of": [ + "AccessRequirements", + "Activity", + "CommonModel", + "Equipment", + ] + } }, ) ethicsApproval: Optional[list[EthicsApproval]] = Field( @@ -1614,7 +1815,10 @@ class CommonModel(DandiBaseModel): }, ) schemaVersion: Optional[str] = Field( - default="0.7.0", json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel"], "ifabsent": "string(0.7.0)"}} + default="0.7.0", + json_schema_extra={ + "linkml_meta": {"domain_of": ["CommonModel"], "ifabsent": "string(0.7.0)"} + }, ) studyTarget: Optional[list[str]] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel"]}} @@ -1642,9 +1846,15 @@ class CommonModel(DandiBaseModel): }, ) wasGeneratedBy: Optional[list[Activity]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]} + }, + ) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -1749,13 +1959,19 @@ class BareAsset(CommonModel): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - "variableMeasured": {"name": "variableMeasured", "range": "PropertyValue"}, + "variableMeasured": { + "name": "variableMeasured", + "range": "PropertyValue", + }, }, } ) approach: Optional[list[ApproachType]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]} + }, ) blobDateModified: Optional[datetime] = Field( default=None, @@ -1823,7 +2039,8 @@ class BareAsset(CommonModel): "pydantic2linkml: Unable to translate the logic contained in the " "after validation function, >.", - "pydantic2linkml: Warning: The translation is incomplete. `dict` " "types are yet to be supported.", + "pydantic2linkml: Warning: The translation is incomplete. `dict` " + "types are yet to be supported.", ], } }, @@ -1850,9 +2067,14 @@ class BareAsset(CommonModel): }, ) measurementTechnique: Optional[list[MeasurementTechniqueType]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]} + }, + ) + path: str = Field( + default=..., json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset"]}} ) - path: str = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset"]}}) sameAs: Optional[list[str]] = Field( default=None, json_schema_extra={ @@ -1868,19 +2090,28 @@ class BareAsset(CommonModel): }, ) variableMeasured: Optional[list[PropertyValue]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]} + }, ) wasAttributedTo: Optional[list[Participant]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}}, ) wasDerivedFrom: Optional[list[BioSample]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}}, ) about: Optional[list[Union[Anatomy, Disorder, GenericType]]] = Field( default=None, json_schema_extra={ "linkml_meta": { - "any_of": [{"range": "Disorder"}, {"range": "Anatomy"}, {"range": "GenericType"}], + "any_of": [ + {"range": "Disorder"}, + {"range": "Anatomy"}, + {"range": "GenericType"}, + ], "domain_of": ["CommonModel"], } }, @@ -1934,7 +2165,14 @@ class BareAsset(CommonModel): description: Optional[str] = Field( default=None, json_schema_extra={ - "linkml_meta": {"domain_of": ["AccessRequirements", "Activity", "CommonModel", "Equipment"]} + "linkml_meta": { + "domain_of": [ + "AccessRequirements", + "Activity", + "CommonModel", + "Equipment", + ] + } }, ) ethicsApproval: Optional[list[EthicsApproval]] = Field( @@ -2012,7 +2250,10 @@ class BareAsset(CommonModel): }, ) schemaVersion: Optional[str] = Field( - default="0.7.0", json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel"], "ifabsent": "string(0.7.0)"}} + default="0.7.0", + json_schema_extra={ + "linkml_meta": {"domain_of": ["CommonModel"], "ifabsent": "string(0.7.0)"} + }, ) studyTarget: Optional[list[str]] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel"]}} @@ -2040,9 +2281,15 @@ class BareAsset(CommonModel): }, ) wasGeneratedBy: Optional[list[Activity]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]} + }, + ) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -2202,7 +2449,10 @@ class Asset(BareAsset): }, ) approach: Optional[list[ApproachType]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]} + }, ) blobDateModified: Optional[datetime] = Field( default=None, @@ -2270,7 +2520,8 @@ class Asset(BareAsset): "pydantic2linkml: Unable to translate the logic contained in the " "after validation function, >.", - "pydantic2linkml: Warning: The translation is incomplete. `dict` " "types are yet to be supported.", + "pydantic2linkml: Warning: The translation is incomplete. `dict` " + "types are yet to be supported.", ], } }, @@ -2297,9 +2548,14 @@ class Asset(BareAsset): }, ) measurementTechnique: Optional[list[MeasurementTechniqueType]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]} + }, + ) + path: str = Field( + default=..., json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset"]}} ) - path: str = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset"]}}) sameAs: Optional[list[str]] = Field( default=None, json_schema_extra={ @@ -2315,19 +2571,28 @@ class Asset(BareAsset): }, ) variableMeasured: Optional[list[PropertyValue]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]} + }, ) wasAttributedTo: Optional[list[Participant]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}}, ) wasDerivedFrom: Optional[list[BioSample]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}}, ) about: Optional[list[Union[Anatomy, Disorder, GenericType]]] = Field( default=None, json_schema_extra={ "linkml_meta": { - "any_of": [{"range": "Disorder"}, {"range": "Anatomy"}, {"range": "GenericType"}], + "any_of": [ + {"range": "Disorder"}, + {"range": "Anatomy"}, + {"range": "GenericType"}, + ], "domain_of": ["CommonModel"], } }, @@ -2381,7 +2646,14 @@ class Asset(BareAsset): description: Optional[str] = Field( default=None, json_schema_extra={ - "linkml_meta": {"domain_of": ["AccessRequirements", "Activity", "CommonModel", "Equipment"]} + "linkml_meta": { + "domain_of": [ + "AccessRequirements", + "Activity", + "CommonModel", + "Equipment", + ] + } }, ) ethicsApproval: Optional[list[EthicsApproval]] = Field( @@ -2459,7 +2731,10 @@ class Asset(BareAsset): }, ) schemaVersion: Optional[str] = Field( - default="0.7.0", json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel"], "ifabsent": "string(0.7.0)"}} + default="0.7.0", + json_schema_extra={ + "linkml_meta": {"domain_of": ["CommonModel"], "ifabsent": "string(0.7.0)"} + }, ) studyTarget: Optional[list[str]] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel"]}} @@ -2487,9 +2762,15 @@ class Asset(BareAsset): }, ) wasGeneratedBy: Optional[list[Activity]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]} + }, + ) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -2673,7 +2954,10 @@ class ContactPoint(DandiBaseModel): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -2715,7 +2999,11 @@ class Contributor(DandiBaseModel): "['ifabsent', 'notes', 'range'] ." ], "slot_usage": { - "identifier": {"name": "identifier", "range": "string", "required": False}, + "identifier": { + "name": "identifier", + "range": "string", + "required": False, + }, "name": {"name": "name", "required": False}, "url": { "name": "url", @@ -2731,7 +3019,9 @@ class Contributor(DandiBaseModel): } ) - awardNumber: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Contributor"]}}) + awardNumber: Optional[str] = Field( + default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Contributor"]}} + ) email: Optional[str] = Field( default=None, json_schema_extra={ @@ -2771,7 +3061,10 @@ class Contributor(DandiBaseModel): }, ) includeInCitation: Optional[bool] = Field( - default=True, json_schema_extra={"linkml_meta": {"domain_of": ["Contributor"], "ifabsent": "True"}} + default=True, + json_schema_extra={ + "linkml_meta": {"domain_of": ["Contributor"], "ifabsent": "True"} + }, ) name: Optional[str] = Field( default=None, @@ -2817,7 +3110,10 @@ class Contributor(DandiBaseModel): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -2901,8 +3197,12 @@ class Dandiset(CommonModel): } ) - assetsSummary: AssetsSummary = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset"]}}) - citation: str = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset"]}}) + assetsSummary: AssetsSummary = Field( + default=..., json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset"]}} + ) + citation: str = Field( + default=..., json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset"]}} + ) dateCreated: Optional[datetime] = Field( default=None, json_schema_extra={ @@ -2971,14 +3271,25 @@ class Dandiset(CommonModel): ) sameAs: Optional[list[str]] = Field( default=None, - json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample", "Dandiset", "Participant"]}}, - ) - version: str = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset", "Software"]}}) - about: Optional[list[Union[Anatomy, Disorder, GenericType]]] = Field( + json_schema_extra={ + "linkml_meta": { + "domain_of": ["BareAsset", "BioSample", "Dandiset", "Participant"] + } + }, + ) + version: str = Field( + default=..., + json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset", "Software"]}}, + ) + about: Optional[list[Union[Anatomy, Disorder, GenericType]]] = Field( default=None, json_schema_extra={ "linkml_meta": { - "any_of": [{"range": "Disorder"}, {"range": "Anatomy"}, {"range": "GenericType"}], + "any_of": [ + {"range": "Disorder"}, + {"range": "Anatomy"}, + {"range": "GenericType"}, + ], "domain_of": ["CommonModel"], } }, @@ -3032,7 +3343,14 @@ class Dandiset(CommonModel): description: Optional[str] = Field( default=None, json_schema_extra={ - "linkml_meta": {"domain_of": ["AccessRequirements", "Activity", "CommonModel", "Equipment"]} + "linkml_meta": { + "domain_of": [ + "AccessRequirements", + "Activity", + "CommonModel", + "Equipment", + ] + } }, ) ethicsApproval: Optional[list[EthicsApproval]] = Field( @@ -3110,7 +3428,10 @@ class Dandiset(CommonModel): }, ) schemaVersion: Optional[str] = Field( - default="0.7.0", json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel"], "ifabsent": "string(0.7.0)"}} + default="0.7.0", + json_schema_extra={ + "linkml_meta": {"domain_of": ["CommonModel"], "ifabsent": "string(0.7.0)"} + }, ) studyTarget: Optional[list[str]] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel"]}} @@ -3138,9 +3459,15 @@ class Dandiset(CommonModel): }, ) wasGeneratedBy: Optional[list[Activity]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]} + }, + ) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -3185,7 +3512,9 @@ def pattern_manifestLocation(cls, v): @field_validator("sameAs") def pattern_sameAs(cls, v): - pattern = re.compile(r"^dandi://[A-Z][-A-Z]*/\d{6}(@(draft|\d+\.\d+\.\d+))?(/\S+)?$") + pattern = re.compile( + r"^dandi://[A-Z][-A-Z]*/\d{6}(@(draft|\d+\.\d+\.\d+))?(/\S+)?$" + ) if isinstance(v, list): for element in v: if isinstance(element, str) and not pattern.match(element): @@ -3300,7 +3629,10 @@ class Disorder(BaseType): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - {"pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", "range": "string"}, + { + "pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", + "range": "string", + }, ], "domain_of": [ "Activity", @@ -3347,7 +3679,10 @@ class Disorder(BaseType): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -3389,7 +3724,11 @@ class Equipment(DandiBaseModel): "['ifabsent', 'notes', 'range'] ." ], "slot_usage": { - "identifier": {"name": "identifier", "range": "string", "required": False}, + "identifier": { + "name": "identifier", + "range": "string", + "required": False, + }, "name": { "name": "name", "notes": [ @@ -3409,7 +3748,14 @@ class Equipment(DandiBaseModel): description: Optional[str] = Field( default=None, json_schema_extra={ - "linkml_meta": {"domain_of": ["AccessRequirements", "Activity", "CommonModel", "Equipment"]} + "linkml_meta": { + "domain_of": [ + "AccessRequirements", + "Activity", + "CommonModel", + "Equipment", + ] + } }, ) identifier: Optional[str] = Field( @@ -3461,7 +3807,10 @@ class Equipment(DandiBaseModel): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -3506,13 +3855,23 @@ class EthicsApproval(DandiBaseModel): "the EthicsApproval Pydantic model has changes in value in meta " "slots: ['ifabsent', 'notes', 'range'] ." ], - "slot_usage": {"identifier": {"name": "identifier", "range": "string", "required": True}}, + "slot_usage": { + "identifier": { + "name": "identifier", + "range": "string", + "required": True, + } + }, } ) contactPoint: Optional[ContactPoint] = Field( default=None, - json_schema_extra={"linkml_meta": {"domain_of": ["AccessRequirements", "EthicsApproval", "Organization"]}}, + json_schema_extra={ + "linkml_meta": { + "domain_of": ["AccessRequirements", "EthicsApproval", "Organization"] + } + }, ) identifier: str = Field( default=..., @@ -3539,7 +3898,10 @@ class EthicsApproval(DandiBaseModel): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -3589,7 +3951,10 @@ class GenericType(BaseType): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - {"pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", "range": "string"}, + { + "pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", + "range": "string", + }, ], "domain_of": [ "Activity", @@ -3636,7 +4001,10 @@ class GenericType(BaseType): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -3677,16 +4045,28 @@ class GenotypeInfo(DandiBaseModel): "the GenotypeInfo Pydantic model has changes in value in meta " "slots: ['ifabsent', 'notes', 'range'] ." ], - "slot_usage": {"wasGeneratedBy": {"name": "wasGeneratedBy", "range": "Session"}}, + "slot_usage": { + "wasGeneratedBy": {"name": "wasGeneratedBy", "range": "Session"} + }, } ) - alleles: list[Allele] = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["GenotypeInfo"]}}) - locus: Locus = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["GenotypeInfo"]}}) + alleles: list[Allele] = Field( + default=..., json_schema_extra={"linkml_meta": {"domain_of": ["GenotypeInfo"]}} + ) + locus: Locus = Field( + default=..., json_schema_extra={"linkml_meta": {"domain_of": ["GenotypeInfo"]}} + ) wasGeneratedBy: Optional[list[Session]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]} + }, + ) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -3716,7 +4096,10 @@ class Locus(DandiBaseModel): ], "slot_usage": { "identifier": { - "any_of": [{"range": "string"}, {"multivalued": True, "range": "string"}], + "any_of": [ + {"range": "string"}, + {"multivalued": True, "range": "string"}, + ], "name": "identifier", "range": "Any", "required": True, @@ -3729,7 +4112,10 @@ class Locus(DandiBaseModel): default=..., json_schema_extra={ "linkml_meta": { - "any_of": [{"range": "string"}, {"multivalued": True, "range": "string"}], + "any_of": [ + {"range": "string"}, + {"multivalued": True, "range": "string"}, + ], "domain_of": [ "Activity", "Affiliation", @@ -3751,8 +4137,13 @@ class Locus(DandiBaseModel): } }, ) - locusType: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Locus"]}}) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + locusType: Optional[str] = Field( + default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Locus"]}} + ) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -3802,7 +4193,10 @@ class MeasurementTechniqueType(BaseType): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - {"pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", "range": "string"}, + { + "pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", + "range": "string", + }, ], "domain_of": [ "Activity", @@ -3849,7 +4243,10 @@ class MeasurementTechniqueType(BaseType): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -3896,16 +4293,25 @@ class Organization(Contributor): ], "slot_usage": { "contactPoint": {"multivalued": True, "name": "contactPoint"}, - "identifier": {"name": "identifier", "pattern": "^https://ror.org/[a-z0-9]+$"}, + "identifier": { + "name": "identifier", + "pattern": "^https://ror.org/[a-z0-9]+$", + }, }, } ) contactPoint: Optional[list[ContactPoint]] = Field( default=None, - json_schema_extra={"linkml_meta": {"domain_of": ["AccessRequirements", "EthicsApproval", "Organization"]}}, + json_schema_extra={ + "linkml_meta": { + "domain_of": ["AccessRequirements", "EthicsApproval", "Organization"] + } + }, + ) + awardNumber: Optional[str] = Field( + default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Contributor"]}} ) - awardNumber: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Contributor"]}}) email: Optional[str] = Field( default=None, json_schema_extra={ @@ -3945,7 +4351,10 @@ class Organization(Contributor): }, ) includeInCitation: Optional[bool] = Field( - default=True, json_schema_extra={"linkml_meta": {"domain_of": ["Contributor"], "ifabsent": "True"}} + default=True, + json_schema_extra={ + "linkml_meta": {"domain_of": ["Contributor"], "ifabsent": "True"} + }, ) name: Optional[str] = Field( default=None, @@ -3991,7 +4400,10 @@ class Organization(Contributor): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -4050,7 +4462,11 @@ class Participant(DandiBaseModel): "['ifabsent', 'notes', 'range'] ." ], "slot_usage": { - "identifier": {"name": "identifier", "range": "string", "required": True}, + "identifier": { + "name": "identifier", + "range": "string", + "required": True, + }, "sameAs": {"name": "sameAs", "range": "string"}, }, } @@ -4062,7 +4478,9 @@ class Participant(DandiBaseModel): altName: Optional[list[str]] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Participant"]}} ) - cellLine: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Participant"]}}) + cellLine: Optional[str] = Field( + default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Participant"]}} + ) disorder: Optional[list[Disorder]] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Participant"]}} ) @@ -4070,7 +4488,10 @@ class Participant(DandiBaseModel): default=None, json_schema_extra={ "linkml_meta": { - "any_of": [{"multivalued": True, "range": "GenotypeInfo"}, {"range": "string"}], + "any_of": [ + {"multivalued": True, "range": "GenotypeInfo"}, + {"range": "string"}, + ], "domain_of": ["Participant"], } }, @@ -4105,11 +4526,20 @@ class Participant(DandiBaseModel): ) sameAs: Optional[list[str]] = Field( default=None, - json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample", "Dandiset", "Participant"]}}, + json_schema_extra={ + "linkml_meta": { + "domain_of": ["BareAsset", "BioSample", "Dandiset", "Participant"] + } + }, + ) + sex: Optional[SexType] = Field( + default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Participant"]}} ) - sex: Optional[SexType] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Participant"]}}) species: Optional[SpeciesType] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "Participant"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "Participant"]} + }, ) strain: Optional[StrainType] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Participant"]}} @@ -4127,7 +4557,10 @@ class Participant(DandiBaseModel): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -4158,14 +4591,21 @@ class Person(Contributor): "the Person Pydantic model has changes in value in meta slots: " "['any_of', 'ifabsent', 'notes'] .", ], - "slot_usage": {"identifier": {"name": "identifier", "pattern": "^\\d{4}-\\d{4}-\\d{4}-(\\d{3}X|\\d{4})$"}}, + "slot_usage": { + "identifier": { + "name": "identifier", + "pattern": "^\\d{4}-\\d{4}-\\d{4}-(\\d{3}X|\\d{4})$", + } + }, } ) affiliation: Optional[list[Affiliation]] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Person"]}} ) - awardNumber: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Contributor"]}}) + awardNumber: Optional[str] = Field( + default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Contributor"]}} + ) email: Optional[str] = Field( default=None, json_schema_extra={ @@ -4205,7 +4645,10 @@ class Person(Contributor): }, ) includeInCitation: Optional[bool] = Field( - default=True, json_schema_extra={"linkml_meta": {"domain_of": ["Contributor"], "ifabsent": "True"}} + default=True, + json_schema_extra={ + "linkml_meta": {"domain_of": ["Contributor"], "ifabsent": "True"} + }, ) name: Optional[str] = Field( default=None, @@ -4251,7 +4694,10 @@ class Person(Contributor): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -4311,7 +4757,14 @@ class Project(Activity): description: Optional[str] = Field( default=None, json_schema_extra={ - "linkml_meta": {"domain_of": ["AccessRequirements", "Activity", "CommonModel", "Equipment"]} + "linkml_meta": { + "domain_of": [ + "AccessRequirements", + "Activity", + "CommonModel", + "Equipment", + ] + } }, ) endDate: Optional[datetime] = Field( @@ -4392,37 +4845,42 @@ class Project(Activity): used: Optional[list[Equipment]] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Activity"]}} ) - wasAssociatedWith: Optional[list[Union[Agent, Organization, Person, Software]]] = Field( + wasAssociatedWith: Optional[list[Union[Agent, Organization, Person, Software]]] = ( + Field( + default=None, + json_schema_extra={ + "linkml_meta": { + "any_of": [ + { + "notes": [ + "pydantic2linkml: Unable to translate the logic " + "contained in the after validation function, ." + ], + "range": "Person", + }, + { + "notes": [ + "pydantic2linkml: Unable to translate the logic " + "contained in the after validation function, ." + ], + "range": "Organization", + }, + {"range": "Software"}, + {"range": "Agent"}, + ], + "domain_of": ["Activity"], + } + }, + ) + ) + id: Optional[str] = Field( default=None, - json_schema_extra={ - "linkml_meta": { - "any_of": [ - { - "notes": [ - "pydantic2linkml: Unable to translate the logic " - "contained in the after validation function, ." - ], - "range": "Person", - }, - { - "notes": [ - "pydantic2linkml: Unable to translate the logic " - "contained in the after validation function, ." - ], - "range": "Organization", - }, - {"range": "Software"}, - {"range": "Agent"}, - ], - "domain_of": ["Activity"], - } - }, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -4513,7 +4971,10 @@ class PropertyValue(DandiBaseModel): } }, ) - unitText: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["PropertyValue"]}}) + unitText: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["PropertyValue"]}}, + ) value: Optional[Any] = Field( default=None, json_schema_extra={ @@ -4530,9 +4991,13 @@ class PropertyValue(DandiBaseModel): }, ) valueReference: Optional[PropertyValue] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["PropertyValue"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["PropertyValue"]}}, + ) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -4597,7 +5062,10 @@ class Publishable(DandiBaseModel): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -4631,7 +5099,14 @@ class PublishActivity(Activity): description: Optional[str] = Field( default=None, json_schema_extra={ - "linkml_meta": {"domain_of": ["AccessRequirements", "Activity", "CommonModel", "Equipment"]} + "linkml_meta": { + "domain_of": [ + "AccessRequirements", + "Activity", + "CommonModel", + "Equipment", + ] + } }, ) endDate: Optional[datetime] = Field( @@ -4712,37 +5187,42 @@ class PublishActivity(Activity): used: Optional[list[Equipment]] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Activity"]}} ) - wasAssociatedWith: Optional[list[Union[Agent, Organization, Person, Software]]] = Field( + wasAssociatedWith: Optional[list[Union[Agent, Organization, Person, Software]]] = ( + Field( + default=None, + json_schema_extra={ + "linkml_meta": { + "any_of": [ + { + "notes": [ + "pydantic2linkml: Unable to translate the logic " + "contained in the after validation function, ." + ], + "range": "Person", + }, + { + "notes": [ + "pydantic2linkml: Unable to translate the logic " + "contained in the after validation function, ." + ], + "range": "Organization", + }, + {"range": "Software"}, + {"range": "Agent"}, + ], + "domain_of": ["Activity"], + } + }, + ) + ) + id: Optional[str] = Field( default=None, - json_schema_extra={ - "linkml_meta": { - "any_of": [ - { - "notes": [ - "pydantic2linkml: Unable to translate the logic " - "contained in the after validation function, ." - ], - "range": "Person", - }, - { - "notes": [ - "pydantic2linkml: Unable to translate the logic " - "contained in the after validation function, ." - ], - "range": "Organization", - }, - {"range": "Software"}, - {"range": "Agent"}, - ], - "domain_of": ["Activity"], - } - }, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -4870,7 +5350,10 @@ class PublishedAsset(Publishable, Asset): }, ) approach: Optional[list[ApproachType]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]} + }, ) blobDateModified: Optional[datetime] = Field( default=None, @@ -4938,7 +5421,8 @@ class PublishedAsset(Publishable, Asset): "pydantic2linkml: Unable to translate the logic contained in the " "after validation function, >.", - "pydantic2linkml: Warning: The translation is incomplete. `dict` " "types are yet to be supported.", + "pydantic2linkml: Warning: The translation is incomplete. `dict` " + "types are yet to be supported.", ], } }, @@ -4965,9 +5449,14 @@ class PublishedAsset(Publishable, Asset): }, ) measurementTechnique: Optional[list[MeasurementTechniqueType]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]} + }, + ) + path: str = Field( + default=..., json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset"]}} ) - path: str = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset"]}}) sameAs: Optional[list[str]] = Field( default=None, json_schema_extra={ @@ -4983,19 +5472,28 @@ class PublishedAsset(Publishable, Asset): }, ) variableMeasured: Optional[list[PropertyValue]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["AssetsSummary", "BareAsset"]} + }, ) wasAttributedTo: Optional[list[Participant]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}}, ) wasDerivedFrom: Optional[list[BioSample]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample"]}}, ) about: Optional[list[Union[Anatomy, Disorder, GenericType]]] = Field( default=None, json_schema_extra={ "linkml_meta": { - "any_of": [{"range": "Disorder"}, {"range": "Anatomy"}, {"range": "GenericType"}], + "any_of": [ + {"range": "Disorder"}, + {"range": "Anatomy"}, + {"range": "GenericType"}, + ], "domain_of": ["CommonModel"], } }, @@ -5049,7 +5547,14 @@ class PublishedAsset(Publishable, Asset): description: Optional[str] = Field( default=None, json_schema_extra={ - "linkml_meta": {"domain_of": ["AccessRequirements", "Activity", "CommonModel", "Equipment"]} + "linkml_meta": { + "domain_of": [ + "AccessRequirements", + "Activity", + "CommonModel", + "Equipment", + ] + } }, ) ethicsApproval: Optional[list[EthicsApproval]] = Field( @@ -5127,7 +5632,10 @@ class PublishedAsset(Publishable, Asset): }, ) schemaVersion: Optional[str] = Field( - default="0.7.0", json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel"], "ifabsent": "string(0.7.0)"}} + default="0.7.0", + json_schema_extra={ + "linkml_meta": {"domain_of": ["CommonModel"], "ifabsent": "string(0.7.0)"} + }, ) studyTarget: Optional[list[str]] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel"]}} @@ -5155,9 +5663,15 @@ class PublishedAsset(Publishable, Asset): }, ) wasGeneratedBy: Optional[list[Activity]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]} + }, + ) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -5282,7 +5796,9 @@ def pattern_url(cls, v): @field_validator("id") def pattern_id(cls, v): - pattern = re.compile(r"^dandiasset:[a-f0-9]{8}[-]*[a-f0-9]{4}[-]*[a-f0-9]{4}[-]*[a-f0-9]{4}[-]*[a-f0-9]{12}$") + pattern = re.compile( + r"^dandiasset:[a-f0-9]{8}[-]*[a-f0-9]{4}[-]*[a-f0-9]{4}[-]*[a-f0-9]{4}[-]*[a-f0-9]{12}$" + ) if isinstance(v, list): for element in v: if isinstance(element, str) and not pattern.match(element): @@ -5320,10 +5836,14 @@ class PublishedDandiset(Publishable, Dandiset): ) doi: Optional[str] = Field( - default="", json_schema_extra={"linkml_meta": {"domain_of": ["PublishedDandiset"], "ifabsent": "string()"}} + default="", + json_schema_extra={ + "linkml_meta": {"domain_of": ["PublishedDandiset"], "ifabsent": "string()"} + }, ) releaseNotes: Optional[str] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["PublishedDandiset"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["PublishedDandiset"]}}, ) datePublished: datetime = Field( default=..., @@ -5359,8 +5879,12 @@ class PublishedDandiset(Publishable, Dandiset): } }, ) - assetsSummary: AssetsSummary = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset"]}}) - citation: str = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset"]}}) + assetsSummary: AssetsSummary = Field( + default=..., json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset"]}} + ) + citation: str = Field( + default=..., json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset"]}} + ) dateCreated: Optional[datetime] = Field( default=None, json_schema_extra={ @@ -5429,14 +5953,25 @@ class PublishedDandiset(Publishable, Dandiset): ) sameAs: Optional[list[str]] = Field( default=None, - json_schema_extra={"linkml_meta": {"domain_of": ["BareAsset", "BioSample", "Dandiset", "Participant"]}}, + json_schema_extra={ + "linkml_meta": { + "domain_of": ["BareAsset", "BioSample", "Dandiset", "Participant"] + } + }, + ) + version: str = Field( + default=..., + json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset", "Software"]}}, ) - version: str = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset", "Software"]}}) about: Optional[list[Union[Anatomy, Disorder, GenericType]]] = Field( default=None, json_schema_extra={ "linkml_meta": { - "any_of": [{"range": "Disorder"}, {"range": "Anatomy"}, {"range": "GenericType"}], + "any_of": [ + {"range": "Disorder"}, + {"range": "Anatomy"}, + {"range": "GenericType"}, + ], "domain_of": ["CommonModel"], } }, @@ -5490,7 +6025,14 @@ class PublishedDandiset(Publishable, Dandiset): description: Optional[str] = Field( default=None, json_schema_extra={ - "linkml_meta": {"domain_of": ["AccessRequirements", "Activity", "CommonModel", "Equipment"]} + "linkml_meta": { + "domain_of": [ + "AccessRequirements", + "Activity", + "CommonModel", + "Equipment", + ] + } }, ) ethicsApproval: Optional[list[EthicsApproval]] = Field( @@ -5568,7 +6110,10 @@ class PublishedDandiset(Publishable, Dandiset): }, ) schemaVersion: Optional[str] = Field( - default="0.7.0", json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel"], "ifabsent": "string(0.7.0)"}} + default="0.7.0", + json_schema_extra={ + "linkml_meta": {"domain_of": ["CommonModel"], "ifabsent": "string(0.7.0)"} + }, ) studyTarget: Optional[list[str]] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel"]}} @@ -5596,9 +6141,15 @@ class PublishedDandiset(Publishable, Dandiset): }, ) wasGeneratedBy: Optional[list[Activity]] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]}} + default=None, + json_schema_extra={ + "linkml_meta": {"domain_of": ["CommonModel", "GenotypeInfo"]} + }, + ) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -5656,7 +6207,9 @@ def pattern_manifestLocation(cls, v): @field_validator("sameAs") def pattern_sameAs(cls, v): - pattern = re.compile(r"^dandi://[A-Z][-A-Z]*/\d{6}(@(draft|\d+\.\d+\.\d+))?(/\S+)?$") + pattern = re.compile( + r"^dandi://[A-Z][-A-Z]*/\d{6}(@(draft|\d+\.\d+\.\d+))?(/\S+)?$" + ) if isinstance(v, list): for element in v: if isinstance(element, str) and not pattern.match(element): @@ -5731,7 +6284,11 @@ class RelatedParticipant(DandiBaseModel): "slots: ['ifabsent', 'notes', 'range'] ." ], "slot_usage": { - "identifier": {"name": "identifier", "range": "string", "required": False}, + "identifier": { + "name": "identifier", + "range": "string", + "required": False, + }, "name": {"name": "name", "required": False}, "relation": {"name": "relation", "range": "ParticipantRelationType"}, "url": { @@ -5793,7 +6350,10 @@ class RelatedParticipant(DandiBaseModel): }, ) relation: ParticipantRelationType = Field( - default=..., json_schema_extra={"linkml_meta": {"domain_of": ["RelatedParticipant", "Resource"]}} + default=..., + json_schema_extra={ + "linkml_meta": {"domain_of": ["RelatedParticipant", "Resource"]} + }, ) url: Optional[str] = Field( default=None, @@ -5817,7 +6377,10 @@ class RelatedParticipant(DandiBaseModel): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -5859,7 +6422,11 @@ class Resource(DandiBaseModel): "['ifabsent', 'notes', 'range'] ." ], "slot_usage": { - "identifier": {"name": "identifier", "range": "string", "required": False}, + "identifier": { + "name": "identifier", + "range": "string", + "required": False, + }, "name": {"name": "name", "required": False}, "relation": {"name": "relation", "range": "RelationType"}, "repository": {"name": "repository", "range": "string"}, @@ -5922,10 +6489,14 @@ class Resource(DandiBaseModel): }, ) relation: RelationType = Field( - default=..., json_schema_extra={"linkml_meta": {"domain_of": ["RelatedParticipant", "Resource"]}} + default=..., + json_schema_extra={ + "linkml_meta": {"domain_of": ["RelatedParticipant", "Resource"]} + }, ) repository: Optional[str] = Field( - default=None, json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel", "Resource"]}} + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["CommonModel", "Resource"]}}, ) resourceType: Optional[ResourceType] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Resource"]}} @@ -5952,7 +6523,10 @@ class Resource(DandiBaseModel): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -6015,7 +6589,10 @@ class SampleType(BaseType): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - {"pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", "range": "string"}, + { + "pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", + "range": "string", + }, ], "domain_of": [ "Activity", @@ -6062,7 +6639,10 @@ class SampleType(BaseType): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -6109,7 +6689,14 @@ class Session(Activity): description: Optional[str] = Field( default=None, json_schema_extra={ - "linkml_meta": {"domain_of": ["AccessRequirements", "Activity", "CommonModel", "Equipment"]} + "linkml_meta": { + "domain_of": [ + "AccessRequirements", + "Activity", + "CommonModel", + "Equipment", + ] + } }, ) endDate: Optional[datetime] = Field( @@ -6190,37 +6777,42 @@ class Session(Activity): used: Optional[list[Equipment]] = Field( default=None, json_schema_extra={"linkml_meta": {"domain_of": ["Activity"]}} ) - wasAssociatedWith: Optional[list[Union[Agent, Organization, Person, Software]]] = Field( + wasAssociatedWith: Optional[list[Union[Agent, Organization, Person, Software]]] = ( + Field( + default=None, + json_schema_extra={ + "linkml_meta": { + "any_of": [ + { + "notes": [ + "pydantic2linkml: Unable to translate the logic " + "contained in the after validation function, ." + ], + "range": "Person", + }, + { + "notes": [ + "pydantic2linkml: Unable to translate the logic " + "contained in the after validation function, ." + ], + "range": "Organization", + }, + {"range": "Software"}, + {"range": "Agent"}, + ], + "domain_of": ["Activity"], + } + }, + ) + ) + id: Optional[str] = Field( default=None, - json_schema_extra={ - "linkml_meta": { - "any_of": [ - { - "notes": [ - "pydantic2linkml: Unable to translate the logic " - "contained in the after validation function, ." - ], - "range": "Person", - }, - { - "notes": [ - "pydantic2linkml: Unable to translate the logic " - "contained in the after validation function, ." - ], - "range": "Organization", - }, - {"range": "Software"}, - {"range": "Agent"}, - ], - "domain_of": ["Activity"], - } - }, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -6283,7 +6875,10 @@ class SexType(BaseType): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - {"pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", "range": "string"}, + { + "pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", + "range": "string", + }, ], "domain_of": [ "Activity", @@ -6330,7 +6925,10 @@ class SexType(BaseType): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -6372,7 +6970,12 @@ class Software(DandiBaseModel): "['ifabsent', 'notes', 'range'] ." ], "slot_usage": { - "identifier": {"name": "identifier", "pattern": "^RRID:.*", "range": "string", "required": False}, + "identifier": { + "name": "identifier", + "pattern": "^RRID:.*", + "range": "string", + "required": False, + }, "name": {"name": "name", "required": True}, "url": { "name": "url", @@ -6454,8 +7057,14 @@ class Software(DandiBaseModel): } }, ) - version: str = Field(default=..., json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset", "Software"]}}) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + version: str = Field( + default=..., + json_schema_extra={"linkml_meta": {"domain_of": ["Dandiset", "Software"]}}, + ) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -6531,7 +7140,10 @@ class SpeciesType(BaseType): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - {"pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", "range": "string"}, + { + "pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", + "range": "string", + }, ], "domain_of": [ "Activity", @@ -6578,7 +7190,10 @@ class SpeciesType(BaseType): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -6641,7 +7256,10 @@ class StandardsType(BaseType): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - {"pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", "range": "string"}, + { + "pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", + "range": "string", + }, ], "domain_of": [ "Activity", @@ -6688,7 +7306,10 @@ class StandardsType(BaseType): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ @@ -6751,7 +7372,10 @@ class StrainType(BaseType): "pattern": "^(?i:http|https)://[^\\s]+$", "range": "uri", }, - {"pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", "range": "string"}, + { + "pattern": "^[a-zA-Z0-9-]+:[a-zA-Z0-9-/\\._]+$", + "range": "string", + }, ], "domain_of": [ "Activity", @@ -6798,7 +7422,10 @@ class StrainType(BaseType): } }, ) - id: Optional[str] = Field(default=None, json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}) + id: Optional[str] = Field( + default=None, + json_schema_extra={"linkml_meta": {"domain_of": ["DandiBaseModel"]}}, + ) schemaKey: Optional[str] = Field( default="DandiBaseModel", json_schema_extra={ From c6172c4a7acdf0db4663d4a90663dc635d321a4f Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 20 Mar 2026 18:25:27 -0400 Subject: [PATCH 35/38] ENH: patch converted to pydantic model to strip dciteCOLO --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 316c271e..009ed3c9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -73,7 +73,7 @@ dependencies = [ ] [tool.hatch.envs.linkml-auto-converted.scripts] 2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' -E -e 's,([^[:space:]]+):[0-9]+,\\1:NUMBER,g' > dandischema/models.yaml" -2pydantic = "gen-pydantic --black dandischema/models.yaml > dandischema/models_linkml.py" +2pydantic = "gen-pydantic --black dandischema/models.yaml | sed -e 's,dciteCOLON,,g' > dandischema/models_linkml.py" [tool.setuptools.packages.find] namespaces = true From e2d124cb93b9e2a046747be357d5d435d48c7813 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Fri, 20 Mar 2026 18:29:08 -0400 Subject: [PATCH 36/38] do pre-commit --- tools/linkml_conversion | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/linkml_conversion b/tools/linkml_conversion index cd94ea86..47cf02e1 100755 --- a/tools/linkml_conversion +++ b/tools/linkml_conversion @@ -54,4 +54,7 @@ git add dandischema/models_linkml.py dandischema/models.yaml git mv dandischema/models.py dandischema/models_orig.py git mv dandischema/models_importstab.py dandischema/models.py +# because we have pre-commit.ci doing that behind our back too! +pre-commit run --all || : + git commit -m "'Merged' with linkml-conversion $ver and ${#branches_to_merge[@]} branches" -a --no-verify From d8b1bea323a7c604cfe478a348f6fe1cd866a710 Mon Sep 17 00:00:00 2001 From: Isaac To Date: Thu, 26 Mar 2026 11:56:49 -0700 Subject: [PATCH 37/38] feat: provide partial schema Provide a partial schema to be merged with the generated schema --- dandischema/models_merge.yaml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 dandischema/models_merge.yaml diff --git a/dandischema/models_merge.yaml b/dandischema/models_merge.yaml new file mode 100644 index 00000000..17afaa9c --- /dev/null +++ b/dandischema/models_merge.yaml @@ -0,0 +1,7 @@ +# This file specifies a partial schema to be merged with the auto LinkML translation +# `dandischema.models`. It is a place to specify elements of the target dandischema +# LinkML schema that are not translatable from or not available in `dandischema.models` + +slots: + schemaKey: + designates_type: true From c0fbd02b95918d4aba4e593a4752689bb7f79cf4 Mon Sep 17 00:00:00 2001 From: Isaac To Date: Thu, 26 Mar 2026 12:08:01 -0700 Subject: [PATCH 38/38] feat: enable `2linkml` to merge partial schema in `models_merge.yaml` --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 009ed3c9..c73d200a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -72,7 +72,7 @@ dependencies = [ "pydantic2linkml @ git+https://github.com/dandi/pydantic2linkml.git" ] [tool.hatch.envs.linkml-auto-converted.scripts] -2linkml = "pydantic2linkml -l INFO -O dandischema/models_overlay.yaml dandischema.models | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' -E -e 's,([^[:space:]]+):[0-9]+,\\1:NUMBER,g' > dandischema/models.yaml" +2linkml = "pydantic2linkml -l INFO -M dandischema/models_merge.yaml -O dandischema/models_overlay.yaml dandischema.models | sed -e 's,0x[0-9a-ef]*,0xADDRESS,g' -E -e 's,([^[:space:]]+):[0-9]+,\\1:NUMBER,g' > dandischema/models.yaml" 2pydantic = "gen-pydantic --black dandischema/models.yaml | sed -e 's,dciteCOLON,,g' > dandischema/models_linkml.py" [tool.setuptools.packages.find]