nmdc-runtime 1.8.0__py3-none-any.whl → 1.9.0__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.
Potentially problematic release.
This version of nmdc-runtime might be problematic. Click here for more details.
- nmdc_runtime/config.py +1 -0
- nmdc_runtime/site/export/ncbi_xml.py +36 -5
- nmdc_runtime/site/export/ncbi_xml_utils.py +32 -0
- nmdc_runtime/site/graphs.py +5 -2
- nmdc_runtime/site/ops.py +49 -17
- nmdc_runtime/site/repository.py +0 -2
- nmdc_runtime/site/translation/submission_portal_translator.py +3 -1
- nmdc_runtime/site/util.py +7 -5
- nmdc_runtime/util.py +9 -1
- {nmdc_runtime-1.8.0.dist-info → nmdc_runtime-1.9.0.dist-info}/METADATA +1 -1
- {nmdc_runtime-1.8.0.dist-info → nmdc_runtime-1.9.0.dist-info}/RECORD +15 -14
- {nmdc_runtime-1.8.0.dist-info → nmdc_runtime-1.9.0.dist-info}/WHEEL +1 -1
- {nmdc_runtime-1.8.0.dist-info → nmdc_runtime-1.9.0.dist-info}/LICENSE +0 -0
- {nmdc_runtime-1.8.0.dist-info → nmdc_runtime-1.9.0.dist-info}/entry_points.txt +0 -0
- {nmdc_runtime-1.8.0.dist-info → nmdc_runtime-1.9.0.dist-info}/top_level.txt +0 -0
nmdc_runtime/config.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DATABASE_CLASS_NAME = "Database"
|
|
@@ -66,7 +66,7 @@ class NCBISubmissionXML:
|
|
|
66
66
|
element.append(child)
|
|
67
67
|
return element
|
|
68
68
|
|
|
69
|
-
def set_description(self, email,
|
|
69
|
+
def set_description(self, email, first, last, org, date=None):
|
|
70
70
|
date = date or datetime.datetime.now().strftime("%Y-%m-%d")
|
|
71
71
|
description = self.set_element(
|
|
72
72
|
"Description",
|
|
@@ -74,7 +74,6 @@ class NCBISubmissionXML:
|
|
|
74
74
|
self.set_element(
|
|
75
75
|
"Comment", f"NMDC Submission for {self.nmdc_study_id}"
|
|
76
76
|
),
|
|
77
|
-
self.set_element("Submitter", attrib={"user_name": user}),
|
|
78
77
|
self.set_element(
|
|
79
78
|
"Organization",
|
|
80
79
|
attrib={"role": "owner", "type": "center"},
|
|
@@ -205,7 +204,7 @@ class NCBISubmissionXML:
|
|
|
205
204
|
children=[
|
|
206
205
|
self.set_element(
|
|
207
206
|
"Title",
|
|
208
|
-
f"NMDC Biosample {sample_id_value} from {organism_name} part of {self.nmdc_study_id} study",
|
|
207
|
+
f"NMDC Biosample {sample_id_value} from {organism_name}, part of {self.nmdc_study_id} study",
|
|
209
208
|
),
|
|
210
209
|
],
|
|
211
210
|
),
|
|
@@ -229,6 +228,13 @@ class NCBISubmissionXML:
|
|
|
229
228
|
"Attribute", attributes[key], {"attribute_name": key}
|
|
230
229
|
)
|
|
231
230
|
for key in sorted(attributes)
|
|
231
|
+
]
|
|
232
|
+
+ [
|
|
233
|
+
self.set_element(
|
|
234
|
+
"Attribute",
|
|
235
|
+
"National Microbiome Data Collaborative",
|
|
236
|
+
{"attribute_name": "broker name"},
|
|
237
|
+
)
|
|
232
238
|
],
|
|
233
239
|
),
|
|
234
240
|
]
|
|
@@ -279,6 +285,7 @@ class NCBISubmissionXML:
|
|
|
279
285
|
org: str,
|
|
280
286
|
nmdc_omics_processing: list,
|
|
281
287
|
nmdc_biosamples: list,
|
|
288
|
+
nmdc_library_preparation: list,
|
|
282
289
|
):
|
|
283
290
|
bsm_id_name_dict = {
|
|
284
291
|
biosample["id"]: biosample["name"] for biosample in nmdc_biosamples
|
|
@@ -288,6 +295,7 @@ class NCBISubmissionXML:
|
|
|
288
295
|
fastq_files = []
|
|
289
296
|
biosample_ids = []
|
|
290
297
|
omics_processing_ids = {}
|
|
298
|
+
lib_prep_protocol_names = {}
|
|
291
299
|
instrument_name = ""
|
|
292
300
|
omics_type = ""
|
|
293
301
|
library_name = ""
|
|
@@ -312,13 +320,26 @@ class NCBISubmissionXML:
|
|
|
312
320
|
)
|
|
313
321
|
library_name = bsm_id_name_dict.get(biosample_id, "")
|
|
314
322
|
|
|
323
|
+
for lib_prep_dict in nmdc_library_preparation:
|
|
324
|
+
if biosample_id in lib_prep_dict:
|
|
325
|
+
lib_prep_protocol_names[biosample_id] = (
|
|
326
|
+
lib_prep_dict[biosample_id]
|
|
327
|
+
.get("protocol_link", {})
|
|
328
|
+
.get("name", "")
|
|
329
|
+
)
|
|
330
|
+
|
|
315
331
|
if fastq_files:
|
|
316
332
|
files_elements = [
|
|
317
333
|
self.set_element(
|
|
318
334
|
"File",
|
|
319
335
|
"",
|
|
320
336
|
{"file_path": f},
|
|
321
|
-
[
|
|
337
|
+
[
|
|
338
|
+
self.set_element(
|
|
339
|
+
"DataType",
|
|
340
|
+
"sra-run-fastq" if ".fastq" in f else "generic-data",
|
|
341
|
+
)
|
|
342
|
+
],
|
|
322
343
|
)
|
|
323
344
|
for f in fastq_files
|
|
324
345
|
]
|
|
@@ -437,6 +458,15 @@ class NCBISubmissionXML:
|
|
|
437
458
|
)
|
|
438
459
|
)
|
|
439
460
|
|
|
461
|
+
for biosample_id, lib_prep_name in lib_prep_protocol_names.items():
|
|
462
|
+
sra_attributes.append(
|
|
463
|
+
self.set_element(
|
|
464
|
+
"Attribute",
|
|
465
|
+
lib_prep_name,
|
|
466
|
+
{"name": "library_construction_protocol"},
|
|
467
|
+
)
|
|
468
|
+
)
|
|
469
|
+
|
|
440
470
|
for biosample_id, omics_processing_id in omics_processing_ids.items():
|
|
441
471
|
identifier_element = self.set_element(
|
|
442
472
|
"Identifier",
|
|
@@ -468,6 +498,7 @@ class NCBISubmissionXML:
|
|
|
468
498
|
biosamples_list: list,
|
|
469
499
|
biosample_omics_processing_list: list,
|
|
470
500
|
biosample_data_objects_list: list,
|
|
501
|
+
biosample_library_preparation_list: list,
|
|
471
502
|
):
|
|
472
503
|
data_type = None
|
|
473
504
|
ncbi_project_id = None
|
|
@@ -482,7 +513,6 @@ class NCBISubmissionXML:
|
|
|
482
513
|
|
|
483
514
|
self.set_description(
|
|
484
515
|
email=self.nmdc_pi_email,
|
|
485
|
-
user="National Microbiome Data Collaborative (NMDC)",
|
|
486
516
|
first=self.first_name,
|
|
487
517
|
last=self.last_name,
|
|
488
518
|
org=self.ncbi_submission_metadata.get("organization", ""),
|
|
@@ -510,6 +540,7 @@ class NCBISubmissionXML:
|
|
|
510
540
|
org=self.ncbi_submission_metadata.get("organization", ""),
|
|
511
541
|
nmdc_omics_processing=biosample_omics_processing_list,
|
|
512
542
|
nmdc_biosamples=biosamples_list,
|
|
543
|
+
nmdc_library_preparation=biosample_library_preparation_list,
|
|
513
544
|
)
|
|
514
545
|
|
|
515
546
|
rough_string = ET.tostring(self.root, "unicode")
|
|
@@ -96,6 +96,38 @@ def fetch_omics_processing_from_biosamples(all_docs_collection, biosamples_list)
|
|
|
96
96
|
return biosample_data_objects
|
|
97
97
|
|
|
98
98
|
|
|
99
|
+
def fetch_library_preparation_from_biosamples(all_docs_collection, biosamples_list):
|
|
100
|
+
biosample_lib_prep = []
|
|
101
|
+
|
|
102
|
+
for biosample in biosamples_list:
|
|
103
|
+
biosample_id = biosample["id"]
|
|
104
|
+
|
|
105
|
+
# Step 1: Find any document with biosample id as has_input
|
|
106
|
+
initial_query = {"has_input": biosample_id}
|
|
107
|
+
initial_document = all_docs_collection.find_one(initial_query)
|
|
108
|
+
|
|
109
|
+
if not initial_document:
|
|
110
|
+
continue
|
|
111
|
+
|
|
112
|
+
initial_output = initial_document.get("has_output")
|
|
113
|
+
if not initial_output:
|
|
114
|
+
continue
|
|
115
|
+
|
|
116
|
+
# Step 2: Use has_output to find the library preparation document
|
|
117
|
+
for output_id in initial_output:
|
|
118
|
+
lib_prep_query = {
|
|
119
|
+
"has_input": output_id,
|
|
120
|
+
"designated_class": "nmdc:LibraryPreparation",
|
|
121
|
+
}
|
|
122
|
+
lib_prep_doc = all_docs_collection.find_one(lib_prep_query)
|
|
123
|
+
|
|
124
|
+
if lib_prep_doc:
|
|
125
|
+
biosample_lib_prep.append({biosample_id: lib_prep_doc})
|
|
126
|
+
break # Stop at the first document that meets the criteria
|
|
127
|
+
|
|
128
|
+
return biosample_lib_prep
|
|
129
|
+
|
|
130
|
+
|
|
99
131
|
def handle_quantity_value(slot_value):
|
|
100
132
|
if "has_numeric_value" in slot_value and "has_unit" in slot_value:
|
|
101
133
|
return f"{slot_value['has_numeric_value']} {slot_value['has_unit']}"
|
nmdc_runtime/site/graphs.py
CHANGED
|
@@ -52,6 +52,7 @@ from nmdc_runtime.site.ops import (
|
|
|
52
52
|
get_ncbi_export_pipeline_study,
|
|
53
53
|
get_data_objects_from_biosamples,
|
|
54
54
|
get_omics_processing_from_biosamples,
|
|
55
|
+
get_library_preparation_from_biosamples,
|
|
55
56
|
get_ncbi_export_pipeline_inputs,
|
|
56
57
|
ncbi_submission_xml_from_nmdc_study,
|
|
57
58
|
ncbi_submission_xml_asset,
|
|
@@ -390,12 +391,14 @@ def nmdc_study_to_ncbi_submission_export():
|
|
|
390
391
|
ncbi_submission_metadata = get_ncbi_export_pipeline_inputs()
|
|
391
392
|
biosamples = get_biosamples_by_study_id(nmdc_study)
|
|
392
393
|
omics_processing_records = get_omics_processing_from_biosamples(biosamples)
|
|
393
|
-
|
|
394
|
+
data_object_records = get_data_objects_from_biosamples(biosamples)
|
|
395
|
+
library_preparation_records = get_library_preparation_from_biosamples(biosamples)
|
|
394
396
|
xml_data = ncbi_submission_xml_from_nmdc_study(
|
|
395
397
|
nmdc_study,
|
|
396
398
|
ncbi_submission_metadata,
|
|
397
399
|
biosamples,
|
|
398
400
|
omics_processing_records,
|
|
399
|
-
|
|
401
|
+
data_object_records,
|
|
402
|
+
library_preparation_records,
|
|
400
403
|
)
|
|
401
404
|
ncbi_submission_xml_asset(xml_data)
|
nmdc_runtime/site/ops.py
CHANGED
|
@@ -66,6 +66,7 @@ from nmdc_runtime.site.export.ncbi_xml import NCBISubmissionXML
|
|
|
66
66
|
from nmdc_runtime.site.export.ncbi_xml_utils import (
|
|
67
67
|
fetch_data_objects_from_biosamples,
|
|
68
68
|
fetch_omics_processing_from_biosamples,
|
|
69
|
+
fetch_library_preparation_from_biosamples,
|
|
69
70
|
)
|
|
70
71
|
from nmdc_runtime.site.drsobjects.ingest import mongo_add_docs_result_as_dict
|
|
71
72
|
from nmdc_runtime.site.resources import (
|
|
@@ -74,6 +75,7 @@ from nmdc_runtime.site.resources import (
|
|
|
74
75
|
RuntimeApiSiteClient,
|
|
75
76
|
RuntimeApiUserClient,
|
|
76
77
|
NeonApiClient,
|
|
78
|
+
MongoDB as MongoDBResource,
|
|
77
79
|
)
|
|
78
80
|
from nmdc_runtime.site.translation.gold_translator import GoldStudyTranslator
|
|
79
81
|
from nmdc_runtime.site.translation.neon_soil_translator import NeonSoilDataTranslator
|
|
@@ -86,7 +88,7 @@ from nmdc_runtime.site.translation.neon_surface_water_translator import (
|
|
|
86
88
|
from nmdc_runtime.site.translation.submission_portal_translator import (
|
|
87
89
|
SubmissionPortalTranslator,
|
|
88
90
|
)
|
|
89
|
-
from nmdc_runtime.site.util import
|
|
91
|
+
from nmdc_runtime.site.util import run_and_log, schema_collection_has_index_on_id
|
|
90
92
|
from nmdc_runtime.util import (
|
|
91
93
|
drs_object_in_for,
|
|
92
94
|
pluralize,
|
|
@@ -526,29 +528,45 @@ def perform_mongo_updates(context, json_in):
|
|
|
526
528
|
if rv["result"] == "errors":
|
|
527
529
|
raise Failure(str(rv["detail"]))
|
|
528
530
|
|
|
529
|
-
|
|
530
|
-
|
|
531
|
+
# TODO containing op `perform_mongo_updates` needs test coverage, as below line had trivial bug.
|
|
532
|
+
# ref: https://github.com/microbiomedata/nmdc-runtime/issues/631
|
|
533
|
+
add_docs_result = _add_schema_docs_with_or_without_replacement(mongo, docs)
|
|
534
|
+
op_patch = UpdateOperationRequest(
|
|
535
|
+
done=True,
|
|
536
|
+
result=add_docs_result,
|
|
537
|
+
metadata={"done_at": datetime.now(timezone.utc).isoformat(timespec="seconds")},
|
|
538
|
+
)
|
|
539
|
+
op_doc = client.update_operation(op_id, op_patch).json()
|
|
540
|
+
return ["/operations/" + op_doc["id"]]
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
def _add_schema_docs_with_or_without_replacement(
|
|
544
|
+
mongo: MongoDBResource, docs: Dict[str, list]
|
|
545
|
+
):
|
|
546
|
+
coll_index_on_id_map = schema_collection_has_index_on_id(mongo.db)
|
|
547
|
+
if all(coll_index_on_id_map[coll] for coll in docs.keys()):
|
|
531
548
|
replace = True
|
|
532
|
-
elif all(not
|
|
549
|
+
elif all(not coll_index_on_id_map[coll] for coll in docs.keys()):
|
|
550
|
+
# FIXME: XXX: This is a hack because e.g. <https://w3id.org/nmdc/FunctionalAnnotationAggMember>
|
|
551
|
+
# documents should be unique with compound key (metagenome_annotation_id, gene_function_id)
|
|
552
|
+
# and yet this is not explicit in the schema. One potential solution is to auto-generate an `id`
|
|
553
|
+
# as a deterministic hash of the compound key.
|
|
554
|
+
#
|
|
555
|
+
# For now, decision is to potentially re-insert "duplicate" documents, i.e. to interpret
|
|
556
|
+
# lack of `id` as lack of unique document identity for de-duplication.
|
|
533
557
|
replace = False # wasting time trying to upsert by `id`.
|
|
534
558
|
else:
|
|
535
559
|
colls_not_id_indexed = [
|
|
536
|
-
coll for coll in docs.keys() if not
|
|
560
|
+
coll for coll in docs.keys() if not coll_index_on_id_map[coll]
|
|
537
561
|
]
|
|
538
|
-
colls_id_indexed = [coll for coll in docs.keys() if
|
|
562
|
+
colls_id_indexed = [coll for coll in docs.keys() if coll_index_on_id_map[coll]]
|
|
539
563
|
raise Failure(
|
|
540
564
|
"Simultaneous addition of non-`id`ed collections and `id`-ed collections"
|
|
541
565
|
" is not supported at this time."
|
|
542
566
|
f"{colls_not_id_indexed=} ; {colls_id_indexed=}"
|
|
543
567
|
)
|
|
544
568
|
op_result = mongo.add_docs(docs, validate=False, replace=replace)
|
|
545
|
-
|
|
546
|
-
done=True,
|
|
547
|
-
result=mongo_add_docs_result_as_dict(op_result),
|
|
548
|
-
metadata={"done_at": datetime.now(timezone.utc).isoformat(timespec="seconds")},
|
|
549
|
-
)
|
|
550
|
-
op_doc = client.update_operation(op_id, op_patch).json()
|
|
551
|
-
return ["/operations/" + op_doc["id"]]
|
|
569
|
+
return mongo_add_docs_result_as_dict(op_result)
|
|
552
570
|
|
|
553
571
|
|
|
554
572
|
@op(required_resource_keys={"mongo"})
|
|
@@ -664,7 +682,6 @@ def translate_portal_submission_to_nmdc_schema_database(
|
|
|
664
682
|
study_category: Optional[str],
|
|
665
683
|
study_doi_category: Optional[str],
|
|
666
684
|
study_doi_provider: Optional[str],
|
|
667
|
-
study_funding_sources: Optional[List[str]],
|
|
668
685
|
study_pi_image_url: Optional[str],
|
|
669
686
|
biosample_extras: Optional[list[dict]],
|
|
670
687
|
biosample_extras_slot_mapping: Optional[list[dict]],
|
|
@@ -683,7 +700,6 @@ def translate_portal_submission_to_nmdc_schema_database(
|
|
|
683
700
|
study_category=study_category,
|
|
684
701
|
study_doi_category=study_doi_category,
|
|
685
702
|
study_doi_provider=study_doi_provider,
|
|
686
|
-
study_funding_sources=study_funding_sources,
|
|
687
703
|
study_pi_image_url=study_pi_image_url,
|
|
688
704
|
biosample_extras=biosample_extras,
|
|
689
705
|
biosample_extras_slot_mapping=biosample_extras_slot_mapping,
|
|
@@ -1099,6 +1115,18 @@ def get_omics_processing_from_biosamples(context: OpExecutionContext, biosamples
|
|
|
1099
1115
|
return biosample_omics_processing
|
|
1100
1116
|
|
|
1101
1117
|
|
|
1118
|
+
@op(required_resource_keys={"mongo"})
|
|
1119
|
+
def get_library_preparation_from_biosamples(
|
|
1120
|
+
context: OpExecutionContext, biosamples: list
|
|
1121
|
+
):
|
|
1122
|
+
mdb = context.resources.mongo.db
|
|
1123
|
+
alldocs_collection = mdb["alldocs"]
|
|
1124
|
+
biosample_lib_prep = fetch_library_preparation_from_biosamples(
|
|
1125
|
+
alldocs_collection, biosamples
|
|
1126
|
+
)
|
|
1127
|
+
return biosample_lib_prep
|
|
1128
|
+
|
|
1129
|
+
|
|
1102
1130
|
@op
|
|
1103
1131
|
def ncbi_submission_xml_from_nmdc_study(
|
|
1104
1132
|
context: OpExecutionContext,
|
|
@@ -1106,10 +1134,14 @@ def ncbi_submission_xml_from_nmdc_study(
|
|
|
1106
1134
|
ncbi_exporter_metadata: dict,
|
|
1107
1135
|
biosamples: list,
|
|
1108
1136
|
omics_processing_records: list,
|
|
1109
|
-
|
|
1137
|
+
data_object_records: list,
|
|
1138
|
+
library_preparation_records: list,
|
|
1110
1139
|
) -> str:
|
|
1111
1140
|
ncbi_exporter = NCBISubmissionXML(nmdc_study, ncbi_exporter_metadata)
|
|
1112
1141
|
ncbi_xml = ncbi_exporter.get_submission_xml(
|
|
1113
|
-
biosamples,
|
|
1142
|
+
biosamples,
|
|
1143
|
+
omics_processing_records,
|
|
1144
|
+
data_object_records,
|
|
1145
|
+
library_preparation_records,
|
|
1114
1146
|
)
|
|
1115
1147
|
return ncbi_xml
|
nmdc_runtime/site/repository.py
CHANGED
|
@@ -539,7 +539,6 @@ def biosample_submission_ingest():
|
|
|
539
539
|
"study_category": None,
|
|
540
540
|
"study_doi_category": None,
|
|
541
541
|
"study_doi_provider": None,
|
|
542
|
-
"study_funding_sources": None,
|
|
543
542
|
"study_pi_image_url": None,
|
|
544
543
|
}
|
|
545
544
|
},
|
|
@@ -578,7 +577,6 @@ def biosample_submission_ingest():
|
|
|
578
577
|
"study_category": None,
|
|
579
578
|
"study_doi_category": None,
|
|
580
579
|
"study_doi_provider": None,
|
|
581
|
-
"study_funding_sources": None,
|
|
582
580
|
"study_pi_image_url": None,
|
|
583
581
|
}
|
|
584
582
|
},
|
|
@@ -404,7 +404,9 @@ class SubmissionPortalTranslator(Translator):
|
|
|
404
404
|
description=self._get_from(
|
|
405
405
|
metadata_submission, ["studyForm", "description"]
|
|
406
406
|
),
|
|
407
|
-
funding_sources=self.
|
|
407
|
+
funding_sources=self._get_from(
|
|
408
|
+
metadata_submission, ["studyForm", "fundingSources"]
|
|
409
|
+
),
|
|
408
410
|
# emsl_proposal_identifier=self._get_from(
|
|
409
411
|
# metadata_submission, ["multiOmicsForm", "studyNumber"]
|
|
410
412
|
# ),
|
nmdc_runtime/site/util.py
CHANGED
|
@@ -4,6 +4,7 @@ from subprocess import Popen, PIPE, STDOUT, CalledProcessError
|
|
|
4
4
|
|
|
5
5
|
from pymongo.database import Database as MongoDatabase
|
|
6
6
|
|
|
7
|
+
from nmdc_runtime.api.db.mongo import get_collection_names_from_schema
|
|
7
8
|
from nmdc_runtime.site.resources import mongo_resource
|
|
8
9
|
|
|
9
10
|
mode_test = {
|
|
@@ -34,12 +35,13 @@ def run_and_log(shell_cmd, context):
|
|
|
34
35
|
|
|
35
36
|
|
|
36
37
|
@lru_cache
|
|
37
|
-
def
|
|
38
|
-
|
|
39
|
-
name for name in mdb.list_collection_names() if name.endswith("_set")
|
|
40
|
-
]
|
|
38
|
+
def schema_collection_has_index_on_id(mdb: MongoDatabase) -> dict:
|
|
39
|
+
present_collection_names = set(mdb.list_collection_names())
|
|
41
40
|
return {
|
|
42
|
-
name: (
|
|
41
|
+
name: (
|
|
42
|
+
name in present_collection_names and "id_1" in mdb[name].index_information()
|
|
43
|
+
)
|
|
44
|
+
for name in get_collection_names_from_schema()
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
|
nmdc_runtime/util.py
CHANGED
|
@@ -8,6 +8,7 @@ from copy import deepcopy
|
|
|
8
8
|
from datetime import datetime, timezone
|
|
9
9
|
from functools import lru_cache
|
|
10
10
|
from io import BytesIO
|
|
11
|
+
from itertools import chain
|
|
11
12
|
from pathlib import Path
|
|
12
13
|
from uuid import uuid4
|
|
13
14
|
from typing import List, Optional, Set, Dict
|
|
@@ -369,7 +370,14 @@ def specialize_activity_set_docs(docs):
|
|
|
369
370
|
|
|
370
371
|
# Define a mapping from collection name to a list of class names allowable for that collection's documents.
|
|
371
372
|
collection_name_to_class_names: Dict[str, List[str]] = {
|
|
372
|
-
collection_name:
|
|
373
|
+
collection_name: list(
|
|
374
|
+
set(
|
|
375
|
+
chain.from_iterable(
|
|
376
|
+
nmdc_schema_view().class_descendants(cls_name)
|
|
377
|
+
for cls_name in get_class_names_from_collection_spec(spec)
|
|
378
|
+
)
|
|
379
|
+
)
|
|
380
|
+
)
|
|
373
381
|
for collection_name, spec in nmdc_jsonschema["$defs"]["Database"][
|
|
374
382
|
"properties"
|
|
375
383
|
].items()
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
nmdc_runtime/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
nmdc_runtime/config.py,sha256=qyV_To6t--DQUpYJ3SrE6sZlxuVXLPmx2dVtZV-3l-c,33
|
|
2
3
|
nmdc_runtime/containers.py,sha256=8m_S1wiFu8VOWvY7tyqzf-02X9gXY83YGc8FgjWzLGA,418
|
|
3
4
|
nmdc_runtime/main.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
nmdc_runtime/util.py,sha256=
|
|
5
|
+
nmdc_runtime/util.py,sha256=Wd2GuuskyUqf1eV5mHLZws8BHAOsqnc0Qj7_4WhSvAM,20736
|
|
5
6
|
nmdc_runtime/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
7
|
nmdc_runtime/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
8
|
nmdc_runtime/core/db/Database.py,sha256=WamgBUbq85A7-fr3p5B9Tk92U__yPdr9pBb4zyQok-4,377
|
|
@@ -35,11 +36,11 @@ nmdc_runtime/minter/domain/model.py,sha256=WMOuKub3dVzkOt_EZSRDLeTsJPqFbKx01SMQ5
|
|
|
35
36
|
nmdc_runtime/minter/entrypoints/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
37
|
nmdc_runtime/minter/entrypoints/fastapi_app.py,sha256=JC4thvzfFwRc1mhWQ-kHy3yvs0SYxF6ktE7LXNCwqlI,4031
|
|
37
38
|
nmdc_runtime/site/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
|
-
nmdc_runtime/site/graphs.py,sha256=
|
|
39
|
-
nmdc_runtime/site/ops.py,sha256=
|
|
40
|
-
nmdc_runtime/site/repository.py,sha256=
|
|
39
|
+
nmdc_runtime/site/graphs.py,sha256=jqfwhrCVUBszt9168au_DVvZBtgIfpUf1OXFiyPHI6U,12304
|
|
40
|
+
nmdc_runtime/site/ops.py,sha256=DchVsC0v7J3noZMhVXUZgSGrm_sC78Y9_z_Nfhuq21E,39632
|
|
41
|
+
nmdc_runtime/site/repository.py,sha256=ge3LW_5izCgL6x1Ios8z2Hrt--aY6LXqhGjnAjcIJkI,37422
|
|
41
42
|
nmdc_runtime/site/resources.py,sha256=ZSH1yvA-li0R7Abc22_v0XLbjBYf5igETr2G01J3hnc,17557
|
|
42
|
-
nmdc_runtime/site/util.py,sha256=
|
|
43
|
+
nmdc_runtime/site/util.py,sha256=zAY0oIY7GRf63ecqWelmS27N7PVrAXVwEhtnpescBSw,1415
|
|
43
44
|
nmdc_runtime/site/backup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
44
45
|
nmdc_runtime/site/backup/nmdcdb_mongodump.py,sha256=H5uosmEiXwLwklJrYJWrNhb_Nuf_ew8dBpZLl6_dYhs,2699
|
|
45
46
|
nmdc_runtime/site/backup/nmdcdb_mongoexport.py,sha256=XIFI_AI3zl0dFr-ELOEmwvT41MyRKBGFaAT3RcamTNE,4166
|
|
@@ -50,8 +51,8 @@ nmdc_runtime/site/drsobjects/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
|
|
|
50
51
|
nmdc_runtime/site/drsobjects/ingest.py,sha256=pcMP69WSzFHFqHB9JIL55ePFhilnCLRc2XHCQ97w1Ik,3107
|
|
51
52
|
nmdc_runtime/site/drsobjects/registration.py,sha256=D1T3QUuxEOxqKZIvB5rkb_6ZxFZiA-U9SMPajyeWC2Y,3572
|
|
52
53
|
nmdc_runtime/site/export/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
-
nmdc_runtime/site/export/ncbi_xml.py,sha256
|
|
54
|
-
nmdc_runtime/site/export/ncbi_xml_utils.py,sha256=
|
|
54
|
+
nmdc_runtime/site/export/ncbi_xml.py,sha256=KMKHZJEjTGECI2N2Hp0yDSMGrkjEC7GmlOnptaZCy2E,22297
|
|
55
|
+
nmdc_runtime/site/export/ncbi_xml_utils.py,sha256=jY4YJt5P7EMsy8gSOPI33K6VcEfOXaVR_zQINZOBUKU,7561
|
|
55
56
|
nmdc_runtime/site/export/study_metadata.py,sha256=WRU0F1ksWfNX3k9LD91Pn2DuLA-IOpGvYPJd6DnguEs,4819
|
|
56
57
|
nmdc_runtime/site/normalization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
57
58
|
nmdc_runtime/site/normalization/gold.py,sha256=iISDD4qs4d6uLhv631WYNeQVOzY5DO201ZpPtxHdkVk,1311
|
|
@@ -64,7 +65,7 @@ nmdc_runtime/site/translation/neon_benthic_translator.py,sha256=e_7tXFrP0PpdhqUC
|
|
|
64
65
|
nmdc_runtime/site/translation/neon_soil_translator.py,sha256=cJJ_QPva5G5SIT_7DjCSsqbDvgbiKGqUYrxK3nx7_Lw,37634
|
|
65
66
|
nmdc_runtime/site/translation/neon_surface_water_translator.py,sha256=6LaFwBnVx6TN9v1D-G6LFrDxY0TK05AvMklx0E1tTeQ,26590
|
|
66
67
|
nmdc_runtime/site/translation/neon_utils.py,sha256=mdxJVPb3zbD4DiKW3Fwgk22kjczKMwkcozvy7fwteTE,5203
|
|
67
|
-
nmdc_runtime/site/translation/submission_portal_translator.py,sha256=
|
|
68
|
+
nmdc_runtime/site/translation/submission_portal_translator.py,sha256=aNGIXTiJEXGC_29qWeol2C426bAt5VlY3In_YhplPU0,28169
|
|
68
69
|
nmdc_runtime/site/translation/translator.py,sha256=xM9dM-nTgSWwu5HFoUVNHf8kqk9iiH4PgWdSx4OKxEk,601
|
|
69
70
|
nmdc_runtime/site/translation/util.py,sha256=w_l3SiExGsl6cXRqto0a_ssDmHkP64ITvrOVfPxmNpY,4366
|
|
70
71
|
nmdc_runtime/site/validation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -72,9 +73,9 @@ nmdc_runtime/site/validation/emsl.py,sha256=OG20mv_3E2rkQqTQtYO0_SVRqFb-Z_zKCiAV
|
|
|
72
73
|
nmdc_runtime/site/validation/gold.py,sha256=Z5ZzYdjERbrJ2Tu06d0TDTBSfwaFdL1Z23Rl-YkZ2Ow,803
|
|
73
74
|
nmdc_runtime/site/validation/jgi.py,sha256=LdJfhqBVHWCDp0Kzyk8eJZMwEI5NQ-zuTda31BcGwOA,1299
|
|
74
75
|
nmdc_runtime/site/validation/util.py,sha256=GGbMDSwR090sr_E_fHffCN418gpYESaiot6XghS7OYk,3349
|
|
75
|
-
nmdc_runtime-1.
|
|
76
|
-
nmdc_runtime-1.
|
|
77
|
-
nmdc_runtime-1.
|
|
78
|
-
nmdc_runtime-1.
|
|
79
|
-
nmdc_runtime-1.
|
|
80
|
-
nmdc_runtime-1.
|
|
76
|
+
nmdc_runtime-1.9.0.dist-info/LICENSE,sha256=VWiv65r7gHGjgtr3jMJYVmQny5GRpQ6H-W9sScb1x70,2408
|
|
77
|
+
nmdc_runtime-1.9.0.dist-info/METADATA,sha256=6PtNVNbnAQR1l8MWaC6jtXv9YcJzoaoumZkDpvAQ7jE,7302
|
|
78
|
+
nmdc_runtime-1.9.0.dist-info/WHEEL,sha256=Mdi9PDNwEZptOjTlUcAth7XJDFtKrHYaQMPulZeBCiQ,91
|
|
79
|
+
nmdc_runtime-1.9.0.dist-info/entry_points.txt,sha256=JxdvOnvxHK_8046cwlvE30s_fV0-k-eTpQtkKYA69nQ,224
|
|
80
|
+
nmdc_runtime-1.9.0.dist-info/top_level.txt,sha256=b0K1s09L_iHH49ueBKaLrB5-lh6cyrSv9vL6x4Qvyz8,13
|
|
81
|
+
nmdc_runtime-1.9.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|