mhd-model 0.1.44__py3-none-any.whl → 0.1.46__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. mhd_model/__init__.py +1 -1
  2. mhd_model/convertors/announcement/v0_1/legacy/mhd2announce.py +50 -9
  3. mhd_model/convertors/sdrf/mhd2sdrf.py +8 -4
  4. mhd_model/model/v0_1/announcement/profiles/base/profile.py +2 -2
  5. mhd_model/model/v0_1/announcement/profiles/ms/fields.py +2 -2
  6. mhd_model/model/v0_1/announcement/profiles/ms/profile.py +2 -2
  7. mhd_model/model/v0_1/dataset/profiles/legacy/graph_validation.py +28 -28
  8. mhd_model/model/v0_1/dataset/profiles/ms/graph_validation.py +2 -2
  9. mhd_model/model/v0_1/dataset/validation/utils.py +1 -1
  10. mhd_model/model/v0_1/dataset/validation/validator.py +3 -0
  11. mhd_model/model/v0_1/rules/managed_cv_terms.py +39 -7
  12. mhd_model/schemas/mhd/announcement-v0.1.legacy-profile.json +16 -8
  13. mhd_model/schemas/mhd/announcement-v0.1.ms-profile.json +26 -12
  14. mhd_model/schemas/mhd/announcement-v0.1.schema.json +12 -4
  15. mhd_model/schemas/mhd/common-data-model-v0.1.legacy-profile.json +12 -0
  16. mhd_model/schemas/mhd/common-data-model-v0.1.ms-profile.json +12 -0
  17. mhd_model/schemas/mhd/common-data-model-v0.1.schema.json +12 -0
  18. {mhd_model-0.1.44.dist-info → mhd_model-0.1.46.dist-info}/METADATA +1 -1
  19. {mhd_model-0.1.44.dist-info → mhd_model-0.1.46.dist-info}/RECORD +23 -23
  20. {mhd_model-0.1.44.dist-info → mhd_model-0.1.46.dist-info}/WHEEL +0 -0
  21. {mhd_model-0.1.44.dist-info → mhd_model-0.1.46.dist-info}/entry_points.txt +0 -0
  22. {mhd_model-0.1.44.dist-info → mhd_model-0.1.46.dist-info}/licenses/LICENSE +0 -0
  23. {mhd_model-0.1.44.dist-info → mhd_model-0.1.46.dist-info}/top_level.txt +0 -0
mhd_model/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import pathlib
2
2
  import sys
3
3
 
4
- __version__ = "v0.1.44"
4
+ __version__ = "v0.1.46"
5
5
 
6
6
  application_root_path = pathlib.Path(__file__).parent.parent
7
7
 
@@ -36,7 +36,7 @@ from mhd_model.model.v0_1.rules.cv_definitions import (
36
36
  )
37
37
  from mhd_model.model.v0_1.rules.managed_cv_terms import (
38
38
  COMMON_ASSAY_TYPES,
39
- COMMON_MEASUREMENT_TYPES,
39
+ COMMON_MEASUREMENT_TYPES_MAP,
40
40
  COMMON_OMICS_TYPES,
41
41
  COMMON_TECHNOLOGY_TYPES,
42
42
  MISSING_PUBLICATION_REASON,
@@ -339,7 +339,11 @@ def create_announcement_file(
339
339
  characteristic_values = get_characteristic_values(all_nodes_map, relationships_map)
340
340
 
341
341
  if not mhd_file_url:
342
- http = [str(x) for x in study.dataset_url_list if str(x).startswith("http://")]
342
+ http = [
343
+ str(x)
344
+ for x in study.dataset_url_list
345
+ if str(x).startswith("http://") or str(x).startswith("https://")
346
+ ]
343
347
  if http:
344
348
  mhd_file_url = f"{http[0]}/{study.repository_identifier}.mhd.json"
345
349
 
@@ -481,7 +485,7 @@ def get_main_assay_descriptors(
481
485
  item.technology_type_ref
482
486
  ]
483
487
  if measurement_type.accession not in measurement_types:
484
- term = COMMON_MEASUREMENT_TYPES.get(measurement_type.accession)
488
+ term = COMMON_MEASUREMENT_TYPES_MAP.get(measurement_type.accession)
485
489
  if not term:
486
490
  term = CvTerm.model_validate(
487
491
  technology_type.model_dump(by_alias=True)
@@ -490,9 +494,13 @@ def get_main_assay_descriptors(
490
494
 
491
495
  for keyword in keywords:
492
496
  if "untargetted" in keyword.name.lower():
493
- measurement_types["MSIO:0000101"] = COMMON_MEASUREMENT_TYPES["MSIO:0000101"]
497
+ measurement_types["MSIO:0000101"] = COMMON_MEASUREMENT_TYPES_MAP[
498
+ "MSIO:0000101"
499
+ ]
494
500
  elif "targetted" in keyword.name.lower():
495
- measurement_types["MSIO:0000100"] = COMMON_MEASUREMENT_TYPES["MSIO:0000101"]
501
+ measurement_types["MSIO:0000100"] = COMMON_MEASUREMENT_TYPES_MAP[
502
+ "MSIO:0000100"
503
+ ]
496
504
  for accession, value in COMMON_OMICS_TYPES.items():
497
505
  if accession.lower() == keyword.name.lower():
498
506
  omics_types[accession] = value
@@ -520,9 +528,26 @@ def get_submitter_and_pi(
520
528
  for item in submitter_links:
521
529
  if item.source_ref in type_map["person"]:
522
530
  submitter = type_map["person"][item.source_ref]
523
- submitters.append(
524
- AnnouncementContact.model_validate(submitter, from_attributes=True)
531
+ contact = AnnouncementContact.model_validate(
532
+ submitter, from_attributes=True
525
533
  )
534
+ affiliation_list = []
535
+ if "affiliated-with" in relationship_name_map:
536
+ for ref in relationship_name_map["affiliated-with"]:
537
+ relationship = relationship_name_map["affiliated-with"][ref]
538
+ submitter_ref = relationship.source_ref
539
+ if submitter_ref == submitter.id_:
540
+ organization = type_map["organization"].get(
541
+ relationship.target_ref
542
+ )
543
+ if organization:
544
+ affiliation_list.append(organization.name)
545
+ if affiliation_list:
546
+ contact.affiliation_list = affiliation_list
547
+ if contact.email_list:
548
+ contact.email_list = [x.lower() for x in contact.email_list]
549
+
550
+ submitters.append(contact)
526
551
 
527
552
  if "principal-investigator-of" in relationship_name_map:
528
553
  pi_links: list[BaseMhdRelationship] = list(
@@ -531,9 +556,25 @@ def get_submitter_and_pi(
531
556
  for item in pi_links:
532
557
  if item.source_ref in type_map["person"]:
533
558
  pi = type_map["person"][item.source_ref]
534
- principal_investigators.append(
535
- AnnouncementContact.model_validate(pi, from_attributes=True)
559
+ contact = AnnouncementContact.model_validate(
560
+ pi, from_attributes=True
536
561
  )
562
+ affiliation_list = []
563
+ if "affiliated-with" in relationship_name_map:
564
+ for ref in relationship_name_map["affiliated-with"]:
565
+ relationship = relationship_name_map["affiliated-with"][ref]
566
+ submitter_ref = relationship.source_ref
567
+ if submitter_ref == submitter.id_:
568
+ organization = type_map["organization"].get(
569
+ relationship.target_ref
570
+ )
571
+ if organization:
572
+ affiliation_list.append(organization.name)
573
+ if affiliation_list:
574
+ contact.affiliation_list = affiliation_list
575
+ if contact.email_list:
576
+ contact.email_list = [x.lower() for x in contact.email_list]
577
+ principal_investigators.append(contact)
537
578
 
538
579
  return submitters, principal_investigators
539
580
 
@@ -16,7 +16,7 @@ from mhd_model.model.v0_1.dataset.profiles.base.base import (
16
16
  from mhd_model.model.v0_1.dataset.profiles.legacy.profile import MhDatasetLegacyProfile
17
17
  from mhd_model.model.v0_1.rules.managed_cv_terms import (
18
18
  COMMON_ASSAY_TYPES,
19
- COMMON_MEASUREMENT_TYPES,
19
+ COMMON_MEASUREMENT_TYPES_MAP,
20
20
  COMMON_OMICS_TYPES,
21
21
  COMMON_TECHNOLOGY_TYPES,
22
22
  )
@@ -762,7 +762,7 @@ def get_main_assay_descriptors(
762
762
  item.technology_type_ref
763
763
  ]
764
764
  if measurement_type.accession not in measurement_types:
765
- term = COMMON_MEASUREMENT_TYPES.get(measurement_type.accession)
765
+ term = COMMON_MEASUREMENT_TYPES_MAP.get(measurement_type.accession)
766
766
  if not term:
767
767
  term = CvTerm.model_validate(
768
768
  technology_type.model_dump(by_alias=True)
@@ -771,9 +771,13 @@ def get_main_assay_descriptors(
771
771
 
772
772
  for keyword in keywords:
773
773
  if "untargetted" in keyword.name.lower():
774
- measurement_types["MSIO:0000101"] = COMMON_MEASUREMENT_TYPES["MSIO:0000101"]
774
+ measurement_types["MSIO:0000101"] = COMMON_MEASUREMENT_TYPES_MAP[
775
+ "MSIO:0000101"
776
+ ]
775
777
  elif "targetted" in keyword.name.lower():
776
- measurement_types["MSIO:0000100"] = COMMON_MEASUREMENT_TYPES["MSIO:0000101"]
778
+ measurement_types["MSIO:0000100"] = COMMON_MEASUREMENT_TYPES_MAP[
779
+ "MSIO:0000100"
780
+ ]
777
781
  for accession, value in COMMON_OMICS_TYPES.items():
778
782
  if accession.lower() == keyword.name.lower():
779
783
  omics_types[accession] = value
@@ -52,9 +52,9 @@ class AnnouncementContact(AnnouncementBaseModel):
52
52
  """
53
53
 
54
54
  full_name: Annotated[None | str, Field(min_length=5)] = None
55
- emails: Annotated[None | list[str], Field(min_length=1)] = None
55
+ email_list: Annotated[None | list[str], Field(min_length=1)] = None
56
56
  orcid: Annotated[None | str, Field(title="ORCID")] = None
57
- affiliations: Annotated[None | list[str], Field(min_length=1)] = None
57
+ affiliation_list: Annotated[None | list[str], Field(min_length=1)] = None
58
58
 
59
59
 
60
60
  class AnnouncementPublication(AnnouncementBaseModel):
@@ -119,7 +119,7 @@ ExtendedCharacteristicValues = Annotated[
119
119
  ),
120
120
  controls=[
121
121
  AllowedCvList(
122
- source_names=["ENVO", "NCBITAXON"],
122
+ source_names=["NCBITAXON", "ENVO", "CHEBI"],
123
123
  allowed_other_sources=["wikidata", "ILX"],
124
124
  )
125
125
  ],
@@ -133,7 +133,7 @@ ExtendedCharacteristicValues = Annotated[
133
133
  ),
134
134
  controls=[
135
135
  AllowedCvList(
136
- source_names=["UBERON", "BTO", "NCIT", "MSIO"]
136
+ source_names=["UBERON", "BTO", "NCIT", "CHEBI"]
137
137
  )
138
138
  ],
139
139
  min_value_count=1,
@@ -70,8 +70,8 @@ class MsAnnouncementContact(AnnouncementContact):
70
70
  """
71
71
 
72
72
  full_name: Annotated[str, Field(min_length=5)]
73
- emails: Annotated[list[EmailStr], Field(min_length=1)] = None
74
- affiliations: Annotated[list[str], Field(min_length=1)] = None
73
+ email_list: Annotated[list[EmailStr], Field(min_length=1)] = None
74
+ affiliation_list: Annotated[list[str], Field(min_length=1)] = None
75
75
  orcid: Annotated[None | ms_fields.ORCID, Field(title="ORCID")] = None
76
76
 
77
77
 
@@ -15,8 +15,8 @@ from mhd_model.model.v0_1.dataset.validation.profile.definition import (
15
15
  from mhd_model.model.v0_1.rules.managed_cv_terms import (
16
16
  COMMON_ASSAY_TYPES,
17
17
  COMMON_CHARACTERISTIC_DEFINITIONS,
18
- COMMON_MEASUREMENT_TYPES,
19
- COMMON_OMICS_TYPES,
18
+ # COMMON_MEASUREMENT_TYPES,
19
+ # COMMON_OMICS_TYPES,
20
20
  COMMON_PROTOCOLS,
21
21
  COMMON_TECHNOLOGY_TYPES,
22
22
  )
@@ -1555,20 +1555,20 @@ MHD_LEGACY_PROFILE_V0_1.cv_nodes = [
1555
1555
  )
1556
1556
  ],
1557
1557
  ),
1558
- CvTermValidation(
1559
- node_type="descriptor",
1560
- validation=AllowedCvTerms(
1561
- cv_terms=list(COMMON_MEASUREMENT_TYPES.values())
1562
- ),
1563
- condition=[
1564
- FilterCondition(
1565
- name="Measurement Type",
1566
- relationship_name="[embedded].measurement_type_ref",
1567
- start_node_type="assay",
1568
- expression="measurement_type_ref",
1569
- )
1570
- ],
1571
- ),
1558
+ # CvTermValidation(
1559
+ # node_type="descriptor",
1560
+ # validation=AllowedCvTerms(
1561
+ # cv_terms=list(COMMON_MEASUREMENT_TYPES.values())
1562
+ # ),
1563
+ # condition=[
1564
+ # FilterCondition(
1565
+ # name="Measurement Type",
1566
+ # relationship_name="[embedded].measurement_type_ref",
1567
+ # start_node_type="assay",
1568
+ # expression="measurement_type_ref",
1569
+ # )
1570
+ # ],
1571
+ # ),
1572
1572
  CvTermValidation(
1573
1573
  node_type="descriptor",
1574
1574
  validation=AllowedCvTerms(
@@ -1583,18 +1583,18 @@ MHD_LEGACY_PROFILE_V0_1.cv_nodes = [
1583
1583
  )
1584
1584
  ],
1585
1585
  ),
1586
- CvTermValidation(
1587
- node_type="descriptor",
1588
- validation=AllowedCvTerms(cv_terms=list(COMMON_OMICS_TYPES.values())),
1589
- condition=[
1590
- FilterCondition(
1591
- name="Omics Type",
1592
- relationship_name="[embedded].omics_type_ref",
1593
- start_node_type="assay",
1594
- expression="omics_type_ref",
1595
- )
1596
- ],
1597
- ),
1586
+ # CvTermValidation(
1587
+ # node_type="descriptor",
1588
+ # validation=AllowedCvTerms(cv_terms=list(COMMON_OMICS_TYPES.values())),
1589
+ # condition=[
1590
+ # FilterCondition(
1591
+ # name="Omics Type",
1592
+ # relationship_name="[embedded].omics_type_ref",
1593
+ # start_node_type="assay",
1594
+ # expression="omics_type_ref",
1595
+ # )
1596
+ # ],
1597
+ # ),
1598
1598
  ],
1599
1599
  relationships=[
1600
1600
  RelationshipValidation(
@@ -1438,7 +1438,7 @@ MHD_MS_PROFILE_V0_1.cv_nodes = [
1438
1438
  node_type="characteristic-value",
1439
1439
  min_count=1,
1440
1440
  validation=AllowedCvList(
1441
- source_names=["ENVO", "NCBITAXON"],
1441
+ source_names=["NCBITAXON", "ENVO", "CHEBI"],
1442
1442
  allowed_other_sources=["wikidata", "ILX"],
1443
1443
  ),
1444
1444
  condition=[
@@ -1455,7 +1455,7 @@ MHD_MS_PROFILE_V0_1.cv_nodes = [
1455
1455
  node_type="characteristic-value",
1456
1456
  min_count=1,
1457
1457
  validation=AllowedCvList(
1458
- source_names=["UBERON", "BTO", "NCIT", "MSIO"],
1458
+ source_names=["UBERON", "BTO", "NCIT", "CHEBI"],
1459
1459
  allowed_other_sources=["wikidata", "ILX"],
1460
1460
  ),
1461
1461
  condition=[
@@ -11,7 +11,7 @@ def search_ontology_definition(ontology_name: str) -> None | CvDefinition:
11
11
  if not ontology_name:
12
12
  return None
13
13
  try:
14
- url = "https://www.ebi.ac.uk/ols4/api/v2/ontologies" + ontology_name.lower()
14
+ url = "https://www.ebi.ac.uk/ols4/api/v2/ontologies/" + ontology_name.lower()
15
15
  response = httpx.get(url, timeout=2)
16
16
  response.raise_for_status()
17
17
  json_response = response.json()
@@ -27,7 +27,10 @@ logger = logging.getLogger(__name__)
27
27
 
28
28
  def validate_mhd_file(file_path: str):
29
29
  json_data = load_json(file_path)
30
+ return validate_mhd_file_json(json_data)
30
31
 
32
+
33
+ def validate_mhd_file_json(json_data: dict[str, Any]):
31
34
  mhd_validator = MhdFileValidator()
32
35
  errors = mhd_validator.validate(json_data)
33
36
 
@@ -64,17 +64,49 @@ COMMON_ASSAY_TYPES = {
64
64
  }
65
65
 
66
66
  COMMON_MEASUREMENT_TYPES = {
67
+ "MS:1003904": CvTerm(
68
+ source="MS",
69
+ accession="MS:1003904",
70
+ name="untargeted analysis",
71
+ ),
72
+ "MS:1003905": CvTerm(
73
+ source="MS",
74
+ accession="MS:1003905",
75
+ name="targeted analysis",
76
+ ),
77
+ "MS:1003906": CvTerm(
78
+ source="MS",
79
+ accession="MS:1003906",
80
+ name="semi-targeted analysis",
81
+ ),
82
+ }
83
+
84
+ COMMON_MEASUREMENT_TYPES_MAP = {
67
85
  "MSIO:0000100": CvTerm(
68
- source="MSIO",
69
- accession="MSIO:0000100",
70
- name="targeted metabolite profiling",
86
+ source="MS",
87
+ accession="MS:1003905",
88
+ name="targeted analysis",
71
89
  ),
72
90
  "MSIO:0000101": CvTerm(
73
- source="MSIO",
74
- accession="MSIO:0000101",
75
- name="untargeted metabolite profiling",
91
+ source="MS",
92
+ accession="MS:1003904",
93
+ name="untargeted analysis",
94
+ ),
95
+ "MS:1003904": CvTerm(
96
+ source="MS",
97
+ accession="MS:1003904",
98
+ name="untargeted analysis",
99
+ ),
100
+ "MS:1003905": CvTerm(
101
+ source="MS",
102
+ accession="MS:1003905",
103
+ name="targeted analysis",
104
+ ),
105
+ "MS:1003906": CvTerm(
106
+ source="MS",
107
+ accession="MS:1003906",
108
+ name="semi-targeted analysis",
76
109
  ),
77
- # TODO others?
78
110
  }
79
111
 
80
112
  COMMON_OMICS_TYPES = {
@@ -589,6 +589,10 @@
589
589
  {
590
590
  "type": "number"
591
591
  },
592
+ {
593
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
594
+ "type": "string"
595
+ },
592
596
  {
593
597
  "type": "null"
594
598
  }
@@ -643,6 +647,10 @@
643
647
  {
644
648
  "type": "number"
645
649
  },
650
+ {
651
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
652
+ "type": "string"
653
+ },
646
654
  {
647
655
  "type": "null"
648
656
  }
@@ -730,7 +738,7 @@
730
738
  "default": null,
731
739
  "title": "Full Name"
732
740
  },
733
- "emails": {
741
+ "email_list": {
734
742
  "anyOf": [
735
743
  {
736
744
  "items": {
@@ -744,7 +752,7 @@
744
752
  }
745
753
  ],
746
754
  "default": null,
747
- "title": "Emails"
755
+ "title": "Email List"
748
756
  },
749
757
  "orcid": {
750
758
  "anyOf": [
@@ -758,7 +766,7 @@
758
766
  "default": null,
759
767
  "title": "ORCID"
760
768
  },
761
- "affiliations": {
769
+ "affiliation_list": {
762
770
  "anyOf": [
763
771
  {
764
772
  "items": {
@@ -772,7 +780,7 @@
772
780
  }
773
781
  ],
774
782
  "default": null,
775
- "title": "Affiliations"
783
+ "title": "Affiliation List"
776
784
  }
777
785
  },
778
786
  "title": "AnnouncementContact",
@@ -785,7 +793,7 @@
785
793
  "title": "Full Name",
786
794
  "type": "string"
787
795
  },
788
- "emails": {
796
+ "email_list": {
789
797
  "anyOf": [
790
798
  {
791
799
  "items": {
@@ -799,7 +807,7 @@
799
807
  }
800
808
  ],
801
809
  "default": null,
802
- "title": "Emails"
810
+ "title": "Email List"
803
811
  },
804
812
  "orcid": {
805
813
  "anyOf": [
@@ -813,7 +821,7 @@
813
821
  "default": null,
814
822
  "title": "ORCID"
815
823
  },
816
- "affiliations": {
824
+ "affiliation_list": {
817
825
  "anyOf": [
818
826
  {
819
827
  "items": {
@@ -827,7 +835,7 @@
827
835
  }
828
836
  ],
829
837
  "default": null,
830
- "title": "Affiliations"
838
+ "title": "Affiliation List"
831
839
  }
832
840
  },
833
841
  "required": [
@@ -235,6 +235,10 @@
235
235
  {
236
236
  "type": "number"
237
237
  },
238
+ {
239
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
240
+ "type": "string"
241
+ },
238
242
  {
239
243
  "type": "null"
240
244
  }
@@ -334,14 +338,14 @@
334
338
  "title": "Full Name",
335
339
  "type": "string"
336
340
  },
337
- "emails": {
341
+ "email_list": {
338
342
  "default": null,
339
343
  "items": {
340
344
  "format": "email",
341
345
  "type": "string"
342
346
  },
343
347
  "minItems": 1,
344
- "title": "Emails",
348
+ "title": "Email List",
345
349
  "type": "array"
346
350
  },
347
351
  "orcid": {
@@ -367,13 +371,13 @@
367
371
  "default": null,
368
372
  "title": "ORCID"
369
373
  },
370
- "affiliations": {
374
+ "affiliation_list": {
371
375
  "default": null,
372
376
  "items": {
373
377
  "type": "string"
374
378
  },
375
379
  "minItems": 1,
376
- "title": "Affiliations",
380
+ "title": "Affiliation List",
377
381
  "type": "array"
378
382
  }
379
383
  },
@@ -1012,6 +1016,10 @@
1012
1016
  {
1013
1017
  "type": "number"
1014
1018
  },
1019
+ {
1020
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
1021
+ "type": "string"
1022
+ },
1015
1023
  {
1016
1024
  "type": "null"
1017
1025
  }
@@ -1368,14 +1376,19 @@
1368
1376
  ],
1369
1377
  "cvTerms": [
1370
1378
  {
1371
- "accession": "MSIO:0000100",
1372
- "name": "targeted metabolite profiling",
1373
- "source": "MSIO"
1379
+ "accession": "MS:1003904",
1380
+ "name": "untargeted analysis",
1381
+ "source": "MS"
1382
+ },
1383
+ {
1384
+ "accession": "MS:1003905",
1385
+ "name": "targeted analysis",
1386
+ "source": "MS"
1374
1387
  },
1375
1388
  {
1376
- "accession": "MSIO:0000101",
1377
- "name": "untargeted metabolite profiling",
1378
- "source": "MSIO"
1389
+ "accession": "MS:1003906",
1390
+ "name": "semi-targeted analysis",
1391
+ "source": "MS"
1379
1392
  }
1380
1393
  ],
1381
1394
  "inputType": "list-or-item",
@@ -1673,8 +1686,9 @@
1673
1686
  "name": "allowed-cv-list",
1674
1687
  "negate": false,
1675
1688
  "sourceNames": [
1689
+ "NCBITAXON",
1676
1690
  "ENVO",
1677
- "NCBITAXON"
1691
+ "CHEBI"
1678
1692
  ]
1679
1693
  }
1680
1694
  ],
@@ -1708,7 +1722,7 @@
1708
1722
  "UBERON",
1709
1723
  "BTO",
1710
1724
  "NCIT",
1711
- "MSIO"
1725
+ "CHEBI"
1712
1726
  ]
1713
1727
  }
1714
1728
  ],
@@ -16,7 +16,7 @@
16
16
  "default": null,
17
17
  "title": "Full Name"
18
18
  },
19
- "emails": {
19
+ "email_list": {
20
20
  "anyOf": [
21
21
  {
22
22
  "items": {
@@ -30,7 +30,7 @@
30
30
  }
31
31
  ],
32
32
  "default": null,
33
- "title": "Emails"
33
+ "title": "Email List"
34
34
  },
35
35
  "orcid": {
36
36
  "anyOf": [
@@ -44,7 +44,7 @@
44
44
  "default": null,
45
45
  "title": "ORCID"
46
46
  },
47
- "affiliations": {
47
+ "affiliation_list": {
48
48
  "anyOf": [
49
49
  {
50
50
  "items": {
@@ -58,7 +58,7 @@
58
58
  }
59
59
  ],
60
60
  "default": null,
61
- "title": "Affiliations"
61
+ "title": "Affiliation List"
62
62
  }
63
63
  },
64
64
  "title": "AnnouncementContact",
@@ -653,6 +653,10 @@
653
653
  {
654
654
  "type": "number"
655
655
  },
656
+ {
657
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
658
+ "type": "string"
659
+ },
656
660
  {
657
661
  "type": "null"
658
662
  }
@@ -707,6 +711,10 @@
707
711
  {
708
712
  "type": "number"
709
713
  },
714
+ {
715
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
716
+ "type": "string"
717
+ },
710
718
  {
711
719
  "type": "null"
712
720
  }
@@ -717,6 +717,10 @@
717
717
  {
718
718
  "type": "number"
719
719
  },
720
+ {
721
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
722
+ "type": "string"
723
+ },
720
724
  {
721
725
  "type": "null"
722
726
  }
@@ -799,6 +803,10 @@
799
803
  {
800
804
  "type": "number"
801
805
  },
806
+ {
807
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
808
+ "type": "string"
809
+ },
802
810
  {
803
811
  "type": "null"
804
812
  }
@@ -2266,6 +2274,10 @@
2266
2274
  {
2267
2275
  "type": "number"
2268
2276
  },
2277
+ {
2278
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
2279
+ "type": "string"
2280
+ },
2269
2281
  {
2270
2282
  "type": "null"
2271
2283
  }
@@ -717,6 +717,10 @@
717
717
  {
718
718
  "type": "number"
719
719
  },
720
+ {
721
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
722
+ "type": "string"
723
+ },
720
724
  {
721
725
  "type": "null"
722
726
  }
@@ -799,6 +803,10 @@
799
803
  {
800
804
  "type": "number"
801
805
  },
806
+ {
807
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
808
+ "type": "string"
809
+ },
802
810
  {
803
811
  "type": "null"
804
812
  }
@@ -2266,6 +2274,10 @@
2266
2274
  {
2267
2275
  "type": "number"
2268
2276
  },
2277
+ {
2278
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
2279
+ "type": "string"
2280
+ },
2269
2281
  {
2270
2282
  "type": "null"
2271
2283
  }
@@ -717,6 +717,10 @@
717
717
  {
718
718
  "type": "number"
719
719
  },
720
+ {
721
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
722
+ "type": "string"
723
+ },
720
724
  {
721
725
  "type": "null"
722
726
  }
@@ -799,6 +803,10 @@
799
803
  {
800
804
  "type": "number"
801
805
  },
806
+ {
807
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
808
+ "type": "string"
809
+ },
802
810
  {
803
811
  "type": "null"
804
812
  }
@@ -2266,6 +2274,10 @@
2266
2274
  {
2267
2275
  "type": "number"
2268
2276
  },
2277
+ {
2278
+ "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$",
2279
+ "type": "string"
2280
+ },
2269
2281
  {
2270
2282
  "type": "null"
2271
2283
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mhd-model
3
- Version: 0.1.44
3
+ Version: 0.1.46
4
4
  Summary: MetabolomicsHub Common Data Model
5
5
  Author-email: MetabolomicsHub Team <help@metabolomicshub.org>
6
6
  License-Expression: Apache-2.0
@@ -1,4 +1,4 @@
1
- mhd_model/__init__.py,sha256=GIUxpljf8m_-hkZx1Lqd0XlRmW8568KD6vB-Zdz9aaQ,286
1
+ mhd_model/__init__.py,sha256=qrVDkugICDUTzB1ybw51jBS3f6-EM8YQEvEW3ngUMcE,286
2
2
  mhd_model/domain_utils.py,sha256=DQ3qanzv-Chydrt2HIM_G1jATf0Uv6XMP8-MgeaZFDk,939
3
3
  mhd_model/log_utils.py,sha256=U3ZmSebJttjeszkZ3HPZzjkczxoD557albXHjPRV4Ro,880
4
4
  mhd_model/mhd_client.py,sha256=LGS3jJ0qjnqSi8xYAY_-8K0vKjUgnrjzdM6yh7Fui9E,6939
@@ -19,7 +19,7 @@ mhd_model/convertors/__init__.py,sha256=Vks7EtU2sNmt6IUWGbtIuVjmU2uNHLXf4_-6sUCW
19
19
  mhd_model/convertors/announcement/__init__.py,sha256=e95z9FteLeMQ18CGUswWwEihn5TpFK9Rj-iGJ69H4NA,19
20
20
  mhd_model/convertors/announcement/v0_1/__init__.py,sha256=E41K3F4V61F4MKSwp2ucrUN2BZFU5P-jw1fUn-KEwVk,27
21
21
  mhd_model/convertors/announcement/v0_1/legacy/__init__.py,sha256=b1Oil1GtNAviuvj5rZBg2NXtF3DjkbD0-07eD40XSl4,27
22
- mhd_model/convertors/announcement/v0_1/legacy/mhd2announce.py,sha256=oJ8nuu7pFL3HD2hrjsLuyOavMagSMfBqcl1SvoKSz4s,23384
22
+ mhd_model/convertors/announcement/v0_1/legacy/mhd2announce.py,sha256=J9NPNBlle2m1jyusoSuzmWKwDy3SvVR1UUMCGGBBpT0,25384
23
23
  mhd_model/convertors/announcement/v0_1/ms/__init__.py,sha256=da1PTClDMl-IBkrSvq6JC1lnS-K_BASzCvxVhNxN5Ls,13
24
24
  mhd_model/convertors/announcement/v0_1/ms/mhd2announce.py,sha256=GsQL0NBgLElMEbDKv89uVzsYWUSo7Uc9erR_iSpiBdY,20586
25
25
  mhd_model/convertors/mhd/__init__.py,sha256=5wx_vLrBquQF3-1VucrL7RWNCL__l0QXbUEv2xoEPw4,24
@@ -29,19 +29,19 @@ mhd_model/convertors/neo4j_enabled_data/v0_1/__init__.py,sha256=47DEQpj8HBSa-_TI
29
29
  mhd_model/convertors/neo4j_enabled_data/v0_1/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  mhd_model/convertors/neo4j_enabled_data/v0_1/legacy/convertor.py,sha256=jNFx71UrQ-bcl_OiKS8Y0dbYk_asRhY45yxjwQ7HTqY,3362
31
31
  mhd_model/convertors/sdrf/__init__.py,sha256=5wx_vLrBquQF3-1VucrL7RWNCL__l0QXbUEv2xoEPw4,24
32
- mhd_model/convertors/sdrf/mhd2sdrf.py,sha256=ktY-Ay8LEPiRfx-lBBhT37-49Gi95_h07a4Os4hGw58,33980
32
+ mhd_model/convertors/sdrf/mhd2sdrf.py,sha256=iWBy5BglKSapPEPpsnvcUeuh0KRTpfXBDHd-X_njpEI,34056
33
33
  mhd_model/model/__init__.py,sha256=q_t9xD7KgyTaMt-Q8qceNPxd26jmcM9R21upl_ivnmQ,45
34
34
  mhd_model/model/definitions.py,sha256=xGiXqBzvKrYXbnyNdyUZNiQxFfpEETscGeHmHOhJjxw,3017
35
35
  mhd_model/model/v0_1/__init__.py,sha256=fcsk8GEidn0gqm5iO23cR812OSNa-tkCLKnaaf7Hqqg,47
36
36
  mhd_model/model/v0_1/announcement/__init__.py,sha256=qVKrVqquhcpiX4E6BYkEustq17Vzc8AGEGjlaYkHvX0,37
37
37
  mhd_model/model/v0_1/announcement/profiles/__init__.py,sha256=ZJU_zGi5elIdgFUX0gqrDQa7LAQZEBYHLtrMOVglwcU,35
38
38
  mhd_model/model/v0_1/announcement/profiles/base/__init__.py,sha256=WmEI3o9VDBYS2M5rG_FjcE4Zg8OtiSSkRt5FqjRypE0,32
39
- mhd_model/model/v0_1/announcement/profiles/base/profile.py,sha256=i-ckRDeBJaMv6mx_QkxPLpBG_H5A3Fvb3ZfTTMAdEgI,5205
39
+ mhd_model/model/v0_1/announcement/profiles/base/profile.py,sha256=JOz4wHy2s3cHdGkouwXMYotXvbjHhvRkemPn7ZNtdvw,5213
40
40
  mhd_model/model/v0_1/announcement/profiles/legacy/__init__.py,sha256=WmEI3o9VDBYS2M5rG_FjcE4Zg8OtiSSkRt5FqjRypE0,32
41
41
  mhd_model/model/v0_1/announcement/profiles/legacy/profile.py,sha256=MCkhpfqtiIK7qUWnQcbuXJvvA-QWszioeT-lZH4qhZI,881
42
42
  mhd_model/model/v0_1/announcement/profiles/ms/__init__.py,sha256=WmEI3o9VDBYS2M5rG_FjcE4Zg8OtiSSkRt5FqjRypE0,32
43
- mhd_model/model/v0_1/announcement/profiles/ms/fields.py,sha256=0BnA49kAipnalKmU_Ys47r67jGTLspdqAneGH6H5FYk,13542
44
- mhd_model/model/v0_1/announcement/profiles/ms/profile.py,sha256=RNSYSHSqiOef53R0-71N6cnxA_d9w91o7unVoscKPL4,6073
43
+ mhd_model/model/v0_1/announcement/profiles/ms/fields.py,sha256=Jjlai9s3aiQSQaGo4IYgYKhNkkwD3Eoqb7wPA6x94MI,13552
44
+ mhd_model/model/v0_1/announcement/profiles/ms/profile.py,sha256=I7B7_i6BzuTN-R8RCSNn_lykBFmnXCAdjI78blsVqA0,6081
45
45
  mhd_model/model/v0_1/announcement/validation/__init__.py,sha256=l8qgF7eCaqo5ak7t6uy7iBDAaf5aIeJ45Wpo91Yr88o,47
46
46
  mhd_model/model/v0_1/announcement/validation/base.py,sha256=E86irVw-tR7O0Tu92EZH2eoF7ZFhZ_zQ76zkvQ9jgR8,17464
47
47
  mhd_model/model/v0_1/announcement/validation/definitions.py,sha256=X0_HPHd9_UtGpHVRrFxFrqtbBNZtEBw1orD2T6KuMEk,823
@@ -56,32 +56,32 @@ mhd_model/model/v0_1/dataset/profiles/base/graph_validation.py,sha256=B6Wpb7ENWC
56
56
  mhd_model/model/v0_1/dataset/profiles/base/profile.py,sha256=AfEFmFamoq1Qmcdk2AHIJkKQNICGRjLpVPDRugWkMuM,4852
57
57
  mhd_model/model/v0_1/dataset/profiles/base/relationships.py,sha256=EeXBn1IUuNtSHzlEUqAohP0xx-yhiQ8o5oabQaLMess,463
58
58
  mhd_model/model/v0_1/dataset/profiles/legacy/__init__.py,sha256=dZI-_giUCGYVeEUQdbXHtH2yPKWVFowc1mj__2VqkIY,57
59
- mhd_model/model/v0_1/dataset/profiles/legacy/graph_validation.py,sha256=RtrnwNOIO73FbEB-DaivFUGEfB5zxfnODvFAYhy3Mpk,69742
59
+ mhd_model/model/v0_1/dataset/profiles/legacy/graph_validation.py,sha256=2QPbkhUI281uolLy7mn5IF-sB2-1X1H6JwXACBEaXJ0,69798
60
60
  mhd_model/model/v0_1/dataset/profiles/legacy/profile.py,sha256=amBxF1xOZDRy7p9rCEjvk-EsnhtT09W5t0Iuk-eOAog,416
61
61
  mhd_model/model/v0_1/dataset/profiles/ms/__init__.py,sha256=8ED9PxVT9VzhA4T6UUtBWNs9e6-E4HW4Ilocc1PPQNA,42
62
- mhd_model/model/v0_1/dataset/profiles/ms/graph_validation.py,sha256=OemJAvTnUVhYrELbFCiGJfpY-sccxi72ynOYG5NBbFI,79034
62
+ mhd_model/model/v0_1/dataset/profiles/ms/graph_validation.py,sha256=jIpYTAtViw5YrWPHFoztbuEgVgtQ_6_wgMjtGiisHOU,79044
63
63
  mhd_model/model/v0_1/dataset/profiles/ms/profile.py,sha256=Cz9y1cXmC8RivsBAjoS2eKBDy2CpJ-RRK20o0GNTcuI,408
64
64
  mhd_model/model/v0_1/dataset/validation/__init__.py,sha256=_juFvBF1ZIiL0LvBFKc9iQJkEau2oq9PRMabaGfgEwo,52
65
65
  mhd_model/model/v0_1/dataset/validation/base.py,sha256=5MJ1EPRRYRIGiDdTKD_814japT2wbGOnx-mjVItPtOI,66067
66
- mhd_model/model/v0_1/dataset/validation/utils.py,sha256=aDlVx-daR-wT3aObTOriJDZz9UZA7CZqWTts_9ZVYtY,964
67
- mhd_model/model/v0_1/dataset/validation/validator.py,sha256=je7U6P4mJR5FeGB0vuC0rjghLtWv0jI2IIEzufefTb0,4117
66
+ mhd_model/model/v0_1/dataset/validation/utils.py,sha256=hqcpv7tXZTfG7wheZIuKeHIxVPAXQwHGHbyri1M0cw4,965
67
+ mhd_model/model/v0_1/dataset/validation/validator.py,sha256=j5Kvyrj-mjE041EmsmCRoOK3eSoUF0yFUT2VqWfjm0g,4218
68
68
  mhd_model/model/v0_1/dataset/validation/profile/__init__.py,sha256=_85zooOqf7i70JhIb5ea2ykwGukx7_WdVTwUZ0b4aoU,33
69
69
  mhd_model/model/v0_1/dataset/validation/profile/base.py,sha256=R3xz2lOQ8n1ZZh3mVNTQMpm6SlrWgG6F6aUX7mIZOB8,2521
70
70
  mhd_model/model/v0_1/dataset/validation/profile/definition.py,sha256=o9j3URm6OklYGQFgIFHWPrF3Oq6Z-3VoN-RHyupiTXw,3053
71
71
  mhd_model/model/v0_1/rules/__init__.py,sha256=anBgW9CJxl5kHu10ZwLdKdgo1v4ad4ayzI8X_YBGWgk,72
72
72
  mhd_model/model/v0_1/rules/cv_definitions.py,sha256=9yXYtFrk8sun9dgyyI5Kwx8KoceZfZ_iZmQrT_quo9c,6309
73
- mhd_model/model/v0_1/rules/managed_cv_terms.py,sha256=XbtZVqBjU51xj549trZtE_XJbRS_o2F-5llagl7OfM8,10507
73
+ mhd_model/model/v0_1/rules/managed_cv_terms.py,sha256=JBdbwLysiqmCa19jsF6Kpk5WxVHid6DtBje7Uvqkoco,11226
74
74
  mhd_model/model/v0_1/rules/predefined_cv_terms.py,sha256=QinjzuA1HeeHCMtSvi-wMZYmGvlUX6opyivLyW2x71c,2617
75
75
  mhd_model/model/v0_1/sdrf/__init__.py,sha256=fcsk8GEidn0gqm5iO23cR812OSNa-tkCLKnaaf7Hqqg,47
76
76
  mhd_model/model/v0_1/sdrf/model.py,sha256=5_qsF6WuUy8ctcW-fcexiEZcxjzSESCMgOYyktheSXg,1461
77
77
  mhd_model/schemas/__init__.py,sha256=DrLraaFU_swK6sTXualuQ9TTlEm0FvnjLkFi83F9eaI,18
78
78
  mhd_model/schemas/mhd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
- mhd_model/schemas/mhd/announcement-v0.1.legacy-profile.json,sha256=sZxp_MvAPAl7wEUKtNSi_wNicYsuu47xjowv6oaxZv4,27716
80
- mhd_model/schemas/mhd/announcement-v0.1.ms-profile.json,sha256=Cw3lsXc57fiDIWkdflxWzbo3DGNfUT2HcRHCchjG-B0,50291
81
- mhd_model/schemas/mhd/announcement-v0.1.schema.json,sha256=_y7iPAvqkItu7pZ7P2G7TqRP5wuQniuBtPBmicZSpZ0,26819
82
- mhd_model/schemas/mhd/common-data-model-v0.1.legacy-profile.json,sha256=0CMfPVsIWmY_HonN-EB3nuQqlXiqz8qrhQOxQS00HlA,114905
83
- mhd_model/schemas/mhd/common-data-model-v0.1.ms-profile.json,sha256=VCalpTsRPvR2BWuAgWO4zQU8af7O-2MCeDm3PVCRpVA,114897
84
- mhd_model/schemas/mhd/common-data-model-v0.1.schema.json,sha256=Wzn7pTDtrxQcazbYcT0OVLg8qu7ZnwmwRdWt9J8hYv8,114901
79
+ mhd_model/schemas/mhd/announcement-v0.1.legacy-profile.json,sha256=DY23rzd0_28IXVt1HA_OAawSNF8cjo07uEr9D2iPZjY,27992
80
+ mhd_model/schemas/mhd/announcement-v0.1.ms-profile.json,sha256=GrjS4nV4ZEAFL6XZpDeY0psC1LhCvLh_Yi_RpCPcI_s,50694
81
+ mhd_model/schemas/mhd/announcement-v0.1.schema.json,sha256=8m2lZQE89V7hsNVxVk1pJcmYfC30EbwTO5wscEquTu4,27079
82
+ mhd_model/schemas/mhd/common-data-model-v0.1.legacy-profile.json,sha256=F_DEYMT_wpFMcXS2gy90p9MMNRRC-ih_U3AqRb-yf38,115271
83
+ mhd_model/schemas/mhd/common-data-model-v0.1.ms-profile.json,sha256=uviJ0R4jghluxzinldMC5idhT-YM5fs-BZvrSvoIy-g,115263
84
+ mhd_model/schemas/mhd/common-data-model-v0.1.schema.json,sha256=UaUZWdCZ2iIZYnJaBSZi9kRL2IWr0hYapzxL2h9IdWM,115267
85
85
  mhd_model/shared/__init__.py,sha256=bpx83kR69nkohpm-ww4Z97-jALGSjXxjkW9IVjdeV1Y,58
86
86
  mhd_model/shared/exceptions.py,sha256=uHbLOLZWzZeHDhM23gyo2oxi_KZ696FgyNGhkIUuKeY,161
87
87
  mhd_model/shared/fields.py,sha256=1S2oQxwFmMJI7AJ3RIUgXORqEFhQcoa6YRmQh74io5w,619
@@ -91,9 +91,9 @@ mhd_model/shared/validation/cv_term_helper.py,sha256=ilDYgh_0cMrRQqmnvAwifCphH4f
91
91
  mhd_model/shared/validation/definitions.py,sha256=ZBq8LsgflIOMrmZZJaKOEirSkoA7XOudngXO5jQnx6Y,5428
92
92
  mhd_model/shared/validation/registry.py,sha256=G90tSEkuS2CHrOjGdE7XQpUfAXzro1hfjFst_UoAkP0,1192
93
93
  mhd_model/shared/validation/validators.py,sha256=IhZe9SNP1x8uLf2Ux1XFp1ugQDO9pHHsZDKhkjQZB9M,29445
94
- mhd_model-0.1.44.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
95
- mhd_model-0.1.44.dist-info/METADATA,sha256=qOYuB2n1qGzIyOyhENL2iTM7jQYYBkiLeb-XIbz0wPg,4174
96
- mhd_model-0.1.44.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
97
- mhd_model-0.1.44.dist-info/entry_points.txt,sha256=-F97t5JZgwWwzi15NZOAPaVvNDXR0KvTE_atG8ZYH4w,55
98
- mhd_model-0.1.44.dist-info/top_level.txt,sha256=_ZgHv-VuH4mrsT8J7_fZ8q0-iuOL4aAFu7xtzglEynI,10
99
- mhd_model-0.1.44.dist-info/RECORD,,
94
+ mhd_model-0.1.46.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
95
+ mhd_model-0.1.46.dist-info/METADATA,sha256=kx8swphS7k1uS07fmILUxTVORdbLOGy86mUSnft6XQ0,4174
96
+ mhd_model-0.1.46.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
97
+ mhd_model-0.1.46.dist-info/entry_points.txt,sha256=-F97t5JZgwWwzi15NZOAPaVvNDXR0KvTE_atG8ZYH4w,55
98
+ mhd_model-0.1.46.dist-info/top_level.txt,sha256=_ZgHv-VuH4mrsT8J7_fZ8q0-iuOL4aAFu7xtzglEynI,10
99
+ mhd_model-0.1.46.dist-info/RECORD,,