rcsb.exdb 1.31__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 (98) hide show
  1. rcsb/__init__.py +1 -0
  2. rcsb/exdb/__init__.py +1 -0
  3. rcsb/exdb/branch/BranchedEntityExtractor.py +82 -0
  4. rcsb/exdb/branch/GlycanProvider.py +116 -0
  5. rcsb/exdb/branch/GlycanUtils.py +114 -0
  6. rcsb/exdb/branch/__init__.py +0 -0
  7. rcsb/exdb/chemref/ChemRefEtlWorker.py +118 -0
  8. rcsb/exdb/chemref/ChemRefExtractor.py +70 -0
  9. rcsb/exdb/chemref/ChemRefMappingProvider.py +139 -0
  10. rcsb/exdb/chemref/PubChemDataCacheProvider.py +372 -0
  11. rcsb/exdb/chemref/PubChemEtlWrapper.py +280 -0
  12. rcsb/exdb/chemref/PubChemIndexCacheProvider.py +638 -0
  13. rcsb/exdb/chemref/__init__.py +0 -0
  14. rcsb/exdb/citation/CitationAdapter.py +91 -0
  15. rcsb/exdb/citation/CitationExtractor.py +190 -0
  16. rcsb/exdb/citation/CitationUtils.py +51 -0
  17. rcsb/exdb/citation/__init__.py +0 -0
  18. rcsb/exdb/cli/__init__.py +0 -0
  19. rcsb/exdb/entry/EntryInfoProvider.py +148 -0
  20. rcsb/exdb/entry/__init__.py +0 -0
  21. rcsb/exdb/examples-seq/EntityInstanceExtractor.py +557 -0
  22. rcsb/exdb/examples-seq/EntityPolymerExtractor.py +544 -0
  23. rcsb/exdb/examples-seq/EntityPolymerExtractorFullTests.py +176 -0
  24. rcsb/exdb/examples-seq/ReferenceSequenceAssignmentUpdater.py +449 -0
  25. rcsb/exdb/examples-seq/ReferenceSequenceUtils.py +123 -0
  26. rcsb/exdb/examples-seq/ReferenceSequenceUtilsTests.py +109 -0
  27. rcsb/exdb/examples-seq/exampleObjectExtractor.py +109 -0
  28. rcsb/exdb/examples-seq/fixtureEntityPolymerExtractor.py +85 -0
  29. rcsb/exdb/examples-seq/testEntityInstanceExtractor.py +170 -0
  30. rcsb/exdb/examples-seq/testEntityPolymerExtractor.py +171 -0
  31. rcsb/exdb/examples-seq/testReferenceSequenceAssignmentUpdater.py +79 -0
  32. rcsb/exdb/examples-seq/testReferenceSequenceUtils.py +108 -0
  33. rcsb/exdb/seq/AnnotationExtractor.py +76 -0
  34. rcsb/exdb/seq/LigandNeighborMappingExtractor.py +84 -0
  35. rcsb/exdb/seq/LigandNeighborMappingProvider.py +106 -0
  36. rcsb/exdb/seq/PolymerEntityExtractor.py +328 -0
  37. rcsb/exdb/seq/ReferenceSequenceAnnotationAdapter.py +598 -0
  38. rcsb/exdb/seq/ReferenceSequenceAnnotationProvider.py +228 -0
  39. rcsb/exdb/seq/ReferenceSequenceAssignmentAdapter.py +534 -0
  40. rcsb/exdb/seq/ReferenceSequenceAssignmentProvider.py +388 -0
  41. rcsb/exdb/seq/ReferenceSequenceCacheProvider.py +397 -0
  42. rcsb/exdb/seq/TaxonomyExtractor.py +69 -0
  43. rcsb/exdb/seq/UniProtCoreEtlWorker.py +177 -0
  44. rcsb/exdb/seq/UniProtExtractor.py +80 -0
  45. rcsb/exdb/seq/__init__.py +0 -0
  46. rcsb/exdb/tests/TEST-EXDB-CLI-EXEC.sh +19 -0
  47. rcsb/exdb/tests/TEST-EXDB-CLI-REFSEQ-EXEC.sh +12 -0
  48. rcsb/exdb/tests/__init__.py +0 -0
  49. rcsb/exdb/tests/fixtureDictMethodResourceProvider.py +104 -0
  50. rcsb/exdb/tests/fixturePdbxLoader.py +298 -0
  51. rcsb/exdb/tests/test-data/components-abbrev.cif +2739 -0
  52. rcsb/exdb/tests/test-data/prdcc-abbrev.cif +9171 -0
  53. rcsb/exdb/tests/testAnnotationExtractor.py +79 -0
  54. rcsb/exdb/tests/testBranchedEntityExtractor.py +81 -0
  55. rcsb/exdb/tests/testChemRefLoader.py +106 -0
  56. rcsb/exdb/tests/testChemRefMappingProvider.py +95 -0
  57. rcsb/exdb/tests/testCitationAdapter.py +97 -0
  58. rcsb/exdb/tests/testCitationExtractor.py +93 -0
  59. rcsb/exdb/tests/testCitationUtils.py +92 -0
  60. rcsb/exdb/tests/testEntryInfoEtlWorkflow.py +70 -0
  61. rcsb/exdb/tests/testEntryInfoProvider.py +97 -0
  62. rcsb/exdb/tests/testGlycanEtlWorkflow.py +70 -0
  63. rcsb/exdb/tests/testGlycanProvider.py +98 -0
  64. rcsb/exdb/tests/testGlycanUtils.py +64 -0
  65. rcsb/exdb/tests/testLigandNeighborMappingProvider.py +90 -0
  66. rcsb/exdb/tests/testObjectExtractor.py +342 -0
  67. rcsb/exdb/tests/testObjectTransformer.py +83 -0
  68. rcsb/exdb/tests/testObjectUpdater.py +120 -0
  69. rcsb/exdb/tests/testPolymerEntityExtractor.py +93 -0
  70. rcsb/exdb/tests/testPubChemDataCacheProvider.py +124 -0
  71. rcsb/exdb/tests/testPubChemEtlWorkflow.py +134 -0
  72. rcsb/exdb/tests/testPubChemEtlWrapper.py +155 -0
  73. rcsb/exdb/tests/testPubChemIndexCacheProvider.py +123 -0
  74. rcsb/exdb/tests/testReferenceSequenceAnnotationAdapter.py +106 -0
  75. rcsb/exdb/tests/testReferenceSequenceAssignmentAdapter.py +121 -0
  76. rcsb/exdb/tests/testReferenceSequenceAssignmentAdapterValidate.py +122 -0
  77. rcsb/exdb/tests/testReferenceSequenceAssignmentProvider.py +117 -0
  78. rcsb/exdb/tests/testReferenceSequenceCacheProvider.py +94 -0
  79. rcsb/exdb/tests/testTaxonomyExtractor.py +75 -0
  80. rcsb/exdb/tests/testTreeNodeListWorker.py +111 -0
  81. rcsb/exdb/tests/testUniProtCoreEtlWorker.py +99 -0
  82. rcsb/exdb/tests/testUniProtExtractor.py +77 -0
  83. rcsb/exdb/tree/TreeNodeListWorker.py +228 -0
  84. rcsb/exdb/tree/__init__.py +0 -0
  85. rcsb/exdb/utils/ObjectAdapterBase.py +22 -0
  86. rcsb/exdb/utils/ObjectExtractor.py +286 -0
  87. rcsb/exdb/utils/ObjectTransformer.py +124 -0
  88. rcsb/exdb/utils/ObjectUpdater.py +121 -0
  89. rcsb/exdb/utils/ObjectValidator.py +160 -0
  90. rcsb/exdb/utils/__init__.py +0 -0
  91. rcsb/exdb/wf/EntryInfoEtlWorkflow.py +71 -0
  92. rcsb/exdb/wf/GlycanEtlWorkflow.py +76 -0
  93. rcsb/exdb/wf/PubChemEtlWorkflow.py +240 -0
  94. rcsb/exdb/wf/__init__.py +0 -0
  95. rcsb_exdb-1.31.dist-info/METADATA +103 -0
  96. rcsb_exdb-1.31.dist-info/RECORD +98 -0
  97. rcsb_exdb-1.31.dist-info/WHEEL +4 -0
  98. rcsb_exdb-1.31.dist-info/licenses/LICENSE +201 -0
File without changes
@@ -0,0 +1,71 @@
1
+ ##
2
+ # File: EntryInfoEtlWorkflow.py
3
+ # Date: 22-Sep-2021 jdw
4
+ #
5
+ # Workflow wrapper -- Entry-level annotations extracted from ExDB
6
+ #
7
+ # Updates:
8
+ # 1-Jun-2023 aae Don't back up resources to GitHub during cache update workflows
9
+ #
10
+ ##
11
+ __docformat__ = "google en"
12
+ __author__ = "John Westbrook"
13
+ __email__ = "jwest@rcsb.rutgers.edu"
14
+ __license__ = "Apache 2.0"
15
+
16
+ import logging
17
+ import os
18
+
19
+
20
+ from rcsb.exdb.entry.EntryInfoProvider import EntryInfoProvider
21
+ from rcsb.utils.config.ConfigUtil import ConfigUtil
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ class EntryInfoEtlWorkflow(object):
27
+ def __init__(self, **kwargs):
28
+ """Workflow wrapper -- extract selected entry-level annotations from ExDb
29
+
30
+ Args:
31
+ configPath (str, optional): path to configuration file (default: exdb-config-example.yml)
32
+ configName (str, optional): configuration section name (default: site_info_configuration)
33
+ cachePath (str, optional): path to cache directory (default: '.')
34
+ stashRemotePrefix (str, optional): file name prefix (channel) applied to remote stash file artifacts (default: None)
35
+ """
36
+ configPath = kwargs.get("configPath", "exdb-config-example.yml")
37
+ self.__configName = kwargs.get("configName", "site_info_configuration")
38
+ mockTopPath = kwargs.get("mockTopPath", None)
39
+ self.__cfgOb = ConfigUtil(configPath=configPath, defaultSectionName=self.__configName, mockTopPath=mockTopPath)
40
+ #
41
+ self.__cachePath = kwargs.get("cachePath", ".")
42
+ self.__cachePath = os.path.abspath(self.__cachePath)
43
+ self.__stashRemotePrefix = kwargs.get("stashRemotePrefix", None)
44
+ #
45
+ self.__debugFlag = kwargs.get("debugFlag", False)
46
+ if self.__debugFlag:
47
+ logger.setLevel(logging.DEBUG)
48
+ #
49
+
50
+ def update(self, backup=True):
51
+ """Update extraction of selected entry-level annotations from ExDB.
52
+
53
+ Returns:
54
+ (bool): True for success or False otherwise
55
+
56
+ """
57
+ try:
58
+ ok = False
59
+ eiP = EntryInfoProvider(cachePath=self.__cachePath, useCache=True)
60
+ eiP.update(self.__cfgOb, fmt="json", indent=3)
61
+ #
62
+ if backup:
63
+ ok = eiP.backup(self.__cfgOb, self.__configName, self.__stashRemotePrefix, useGit=False, useStash=True)
64
+ logger.info("Backup entry-level annotations (%r)", ok)
65
+ else:
66
+ ok = True
67
+
68
+ except Exception as e:
69
+ logger.exception("Failing with %s", str(e))
70
+ #
71
+ return ok
@@ -0,0 +1,76 @@
1
+ ##
2
+ # File: GlycanEtlWorkflow.py
3
+ # Date: 30-Jun-2021 jdw
4
+ #
5
+ # Workflow wrapper -- Glycan ETL utilities
6
+ #
7
+ # Updates:
8
+ # 1-Jun-2023 aae Don't back up resources to GitHub during cache update workflows
9
+ #
10
+ ##
11
+ __docformat__ = "google en"
12
+ __author__ = "John Westbrook"
13
+ __email__ = "jwest@rcsb.rutgers.edu"
14
+ __license__ = "Apache 2.0"
15
+
16
+ import logging
17
+ import os
18
+
19
+
20
+ from rcsb.exdb.branch.GlycanProvider import GlycanProvider
21
+ from rcsb.utils.config.ConfigUtil import ConfigUtil
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ class GlycanEtlWorkflow(object):
27
+ def __init__(self, **kwargs):
28
+ """Workflow wrapper -- Glycan mapping ETL utilities
29
+
30
+ Args:
31
+ configPath (str, optional): path to configuration file (default: exdb-config-example.yml)
32
+ configName (str, optional): configuration section name (default: site_info_configuration)
33
+ cachePath (str, optional): path to cache directory (default: '.')
34
+ stashRemotePrefix (str, optional): file name prefix (channel) applied to remote stash file artifacts (default: None)
35
+ """
36
+ configPath = kwargs.get("configPath", "exdb-config-example.yml")
37
+ self.__configName = kwargs.get("configName", "site_info_configuration")
38
+ mockTopPath = kwargs.get("mockTopPath", None)
39
+ self.__cfgOb = ConfigUtil(configPath=configPath, defaultSectionName=self.__configName, mockTopPath=mockTopPath)
40
+ #
41
+ self.__cachePath = kwargs.get("cachePath", ".")
42
+ self.__cachePath = os.path.abspath(self.__cachePath)
43
+ self.__stashRemotePrefix = kwargs.get("stashRemotePrefix", None)
44
+ #
45
+ self.__debugFlag = kwargs.get("debugFlag", False)
46
+ if self.__debugFlag:
47
+ logger.setLevel(logging.DEBUG)
48
+ #
49
+
50
+ def updateMatchedIndex(self, backup=True):
51
+ """Update Glycan correspondence index.
52
+
53
+ Returns:
54
+ (bool): True for success or False otherwise
55
+
56
+ """
57
+ try:
58
+ ok1 = ok2 = False
59
+ gP = GlycanProvider(cachePath=self.__cachePath, useCache=True)
60
+ ok = gP.restore(self.__cfgOb, self.__configName, self.__stashRemotePrefix, useStash=True, useGit=True)
61
+ logger.info("Restore glycan matched identifiers status (%r)", ok)
62
+
63
+ ok1 = gP.update(self.__cfgOb, fmt="json", indent=3)
64
+ riD = gP.getIdentifiers()
65
+ logger.info("Matched glycan identifiers (%d)", len(riD))
66
+ #
67
+ if backup:
68
+ ok2 = gP.backup(self.__cfgOb, self.__configName, self.__stashRemotePrefix, useGit=False, useStash=True)
69
+ logger.info("Backup matched glycan identifiers (%r)", ok2)
70
+ else:
71
+ ok2 = True
72
+
73
+ except Exception as e:
74
+ logger.exception("Failing with %s", str(e))
75
+ #
76
+ return ok1 and ok2
@@ -0,0 +1,240 @@
1
+ ##
2
+ # File: PubChemEtlWorkflow.py
3
+ # Date: 28-Jul-2020 jdw
4
+ #
5
+ # Workflow wrapper -- PubChem ETL utilities
6
+ #
7
+ # Updates:
8
+ # 13-Mar-2023 aae Updates to use multiprocess count, disable git stash testing
9
+ # 1-Jun-2023 aae Don't back up resources to GitHub during cache update workflows
10
+ ##
11
+ __docformat__ = "google en"
12
+ __author__ = "John Westbrook"
13
+ __email__ = "jwest@rcsb.rutgers.edu"
14
+ __license__ = "Apache 2.0"
15
+
16
+ import logging
17
+ import os
18
+ import time
19
+
20
+
21
+ from rcsb.exdb.chemref.PubChemEtlWrapper import PubChemEtlWrapper
22
+ from rcsb.utils.config.ConfigUtil import ConfigUtil
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ class PubChemEtlWorkflow(object):
28
+ def __init__(self, **kwargs):
29
+ """Workflow wrapper -- PubChem ETL utilities
30
+
31
+ Args:
32
+ configPath (str, optional): path to configuration file (default: exdb-config-example.yml)
33
+ configName (str, optional): configuration section name (default: site_info_configuration)
34
+ cachePath (str, optional): path to cache directory (default: '.')
35
+ stashRemotePrefix (str, optional): file name prefix (channel) applied to remote stash file artifacts (default: None)
36
+ """
37
+ configPath = kwargs.get("configPath", "exdb-config-example.yml")
38
+ self.__configName = kwargs.get("configName", "site_info_configuration")
39
+ mockTopPath = kwargs.get("mockTopPath", None)
40
+ self.__cfgOb = ConfigUtil(configPath=configPath, defaultSectionName=self.__configName, mockTopPath=mockTopPath)
41
+ #
42
+ self.__cachePath = kwargs.get("cachePath", ".")
43
+ self.__cachePath = os.path.abspath(self.__cachePath)
44
+ self.__stashRemotePrefix = kwargs.get("stashRemotePrefix", None)
45
+ #
46
+ self.__debugFlag = kwargs.get("debugFlag", False)
47
+ if self.__debugFlag:
48
+ logger.setLevel(logging.DEBUG)
49
+ #
50
+
51
+ def dump(self, **kwargs):
52
+ """Dump the current object store of PubChem correspondences and data.
53
+
54
+ Args:
55
+ useStash (bool): should stash (Buildlocker) be updated? (default: True)
56
+ useGit (bool): should stash (GitHub) be updated? (default: True)
57
+
58
+ Returns:
59
+ (bool): True for success or False otherwise
60
+
61
+ """
62
+ ok1 = ok2 = ok3 = ok4 = False
63
+ try:
64
+ useStash = kwargs.get("useStash", True)
65
+ useGit = kwargs.get("useGit", True) # Revisit stashing in GitHub as file timestamp will always cause a commit
66
+ # -- Update local chemical indices and create PubChem mapping index ---
67
+ pcewP = PubChemEtlWrapper(self.__cfgOb, self.__cachePath, stashRemotePrefix=self.__stashRemotePrefix)
68
+ sTime = time.time()
69
+ logger.info("Dumping index data")
70
+ ok1 = pcewP.dump(contentType="index")
71
+ eTime = time.time()
72
+ logger.info("Dumping index data done in (%.4f seconds)", eTime - sTime)
73
+ if useGit or useStash:
74
+ sTime = time.time()
75
+ logger.info("Stashing index data")
76
+ ok2 = pcewP.toStash(contentType="index", useStash=useStash, useGit=useGit)
77
+ eTime = time.time()
78
+ logger.info("Stashing index data done in (%.4f seconds)", eTime - sTime)
79
+ else:
80
+ ok2 = True
81
+
82
+ sTime = time.time()
83
+ logger.info("Dumping reference data")
84
+ ok3 = pcewP.dump(contentType="data")
85
+ if useGit or useStash:
86
+ sTime = time.time()
87
+ logger.info("Stashing reference data")
88
+ ok4 = pcewP.toStash(contentType="data", useStash=useStash, useGit=useGit)
89
+ eTime = time.time()
90
+ logger.info("Stashing reference data done in (%.4f seconds)", eTime - sTime)
91
+ else:
92
+ ok4 = True
93
+ eTime = time.time()
94
+ logger.info("Dumping data done in (%.4f seconds)", eTime - sTime)
95
+ except Exception as e:
96
+ logger.exception("Failing with %s", str(e))
97
+ return ok1 and ok2 and ok3 and ok4
98
+
99
+ def stash(self):
100
+ """Stash the current cache files containing PubChem correspondences and data."""
101
+ ok1 = ok2 = False
102
+ try:
103
+ # -- Update local chemical indices and create PubChem mapping index ---
104
+ pcewP = PubChemEtlWrapper(self.__cfgOb, self.__cachePath, stashRemotePrefix=self.__stashRemotePrefix)
105
+ sTime = time.time()
106
+ ok1 = pcewP. toStash(contentType="index")
107
+ eTime = time.time()
108
+ logger.info("Stashing index data done in (%.4f seconds)", eTime - sTime)
109
+
110
+ sTime = time.time()
111
+ logger.info("Stashing reference data")
112
+ ok2 = pcewP.toStash(contentType="data")
113
+ eTime = time.time()
114
+ logger.info("Stashing data done in (%.4f seconds)", eTime - sTime)
115
+ except Exception as e:
116
+ logger.exception("Failing with %s", str(e))
117
+ return ok1 and ok2
118
+
119
+ def restore(self):
120
+ """Restore the current object store of PubChem correspondences and data from stashed data sets."""
121
+ ok1 = ok2 = False
122
+ numObjData = numObjIndex = 0
123
+ try:
124
+ # -- Update local chemical indices and create PubChem mapping index ---
125
+ pcewP = PubChemEtlWrapper(self.__cfgOb, self.__cachePath, stashRemotePrefix=self.__stashRemotePrefix)
126
+ sTime = time.time()
127
+ logger.info("Restoring stashed index data")
128
+ ok1 = pcewP.fromStash(contentType="index")
129
+ numObjIndex = pcewP.reloadDump(contentType="index")
130
+ eTime = time.time()
131
+ logger.info("Restoring index data done in (%.4f seconds)", eTime - sTime)
132
+
133
+ sTime = time.time()
134
+ logger.info("Restoring reference data")
135
+ ok2 = pcewP.fromStash(contentType="data")
136
+ numObjData = pcewP.reloadDump(contentType="data")
137
+ eTime = time.time()
138
+ logger.info("Restoring data done in (%.4f seconds)", eTime - sTime)
139
+ except Exception as e:
140
+ logger.exception("Failing with %s", str(e))
141
+ return ok1 and ok2 and numObjData > 1 and numObjIndex > 1
142
+
143
+ def updateMatchedIndex(self, **kwargs):
144
+ """Update chemical indices and correspondence matches.
145
+
146
+ Args:
147
+ ccUrlTarget (str, optional): target url for chemical component dictionary resource file (default: None=all public)
148
+ birdUrlTarget (str, optional): target url for bird dictionary resource file (cc format) (default: None=all public)
149
+ ccFileNamePrefix (str, optional): index file prefix (default: full)
150
+ rebuildChemIndices (bool, optional): rebuild indices from source (default: False)
151
+ exportPath (str, optional): path to export raw PubChem search results (default: None)
152
+ numProcChemComp (int, optional): number processors to include in multiprocessing mode (default: 8)
153
+ numProc (int, optional): number processors to include in multiprocessing mode (default: 2)
154
+ useStash (bool, optional): should stash (Buildlocker) be updated? (default: True)
155
+ useGit (bool, optional): should stash (GitHub) be updated? (default: True)
156
+
157
+ Returns:
158
+ (bool): True for success or False otherwise
159
+
160
+ """
161
+ try:
162
+ ok1 = ok2 = ok3 = False
163
+ # -- Update local chemical indices and create PubChem mapping index ---
164
+ ccUrlTarget = kwargs.get("ccUrlTarget", None)
165
+ birdUrlTarget = kwargs.get("birdUrlTarget", None)
166
+ ccFileNamePrefix = kwargs.get("ccFileNamePrefix", "cc-full")
167
+ numProcChemComp = kwargs.get("numProcChemComp", 8)
168
+ numProc = kwargs.get("numProc", 4)
169
+ rebuildChemIndices = kwargs.get("rebuildChemIndices", True)
170
+ exportPath = kwargs.get("exportPath", None)
171
+ useStash = kwargs.get("useStash", True)
172
+ useGit = kwargs.get("useGit", False)
173
+ #
174
+ pcewP = PubChemEtlWrapper(self.__cfgOb, self.__cachePath, stashRemotePrefix=self.__stashRemotePrefix)
175
+ ok1 = pcewP.updateIndex(
176
+ ccUrlTarget=ccUrlTarget,
177
+ birdUrlTarget=birdUrlTarget,
178
+ ccFileNamePrefix=ccFileNamePrefix,
179
+ exportPath=exportPath,
180
+ rebuildChemIndices=rebuildChemIndices,
181
+ numProcChemComp=numProcChemComp,
182
+ numProc=numProc,
183
+ )
184
+ logger.info("updateIndex completed with status %r", ok1)
185
+ ok2 = pcewP.dump(contentType="index")
186
+ logger.info("dump completed with status %r", ok2)
187
+ if useGit or useStash:
188
+ ok3 = pcewP.toStash(contentType="index", useStash=useStash, useGit=useGit)
189
+ logger.info("toStash completed with status %r", ok3)
190
+ else:
191
+ ok3 = True
192
+ except Exception as e:
193
+ logger.exception("Failing with %s", str(e))
194
+ #
195
+ return ok1 and ok2 and ok3
196
+
197
+ def updateMatchedData(self, **kwargs):
198
+ """Update PubChem annotation data for matched correspondences. Generate and stash
199
+ related identifiers for corresponding components and BIRD chemical definitions.
200
+
201
+ Args:
202
+ numProc(int): number processors to include in multiprocessing mode (default: 2)
203
+ useStash(bool): should stash (Buildlocker) be updated? (default: True)
204
+ useGit(bool): should stash (GitHub) be updated? (default: True)
205
+
206
+ Returns:
207
+ (bool): True for success or False otherwise
208
+ """
209
+ try:
210
+ ok1 = ok2 = ok3 = ok4 = ok5 = ok6 = False
211
+ # --
212
+ numProc = kwargs.get("numProc", 4)
213
+ useStash = kwargs.get("useStash", True)
214
+ useGit = kwargs.get("useGit", False)
215
+ #
216
+ pcewP = PubChemEtlWrapper(self.__cfgOb, self.__cachePath, stashRemotePrefix=self.__stashRemotePrefix)
217
+ ok1 = pcewP.updateMatchedData(numProc=numProc)
218
+ logger.info("PubChemEtlWrapper.updateMatchedData completed with status %r", ok1)
219
+ ok2 = pcewP.dump(contentType="data")
220
+ logger.info("PubChemEtlWrapper.dump 'data' completed with status %r", ok2)
221
+ if useGit or useStash:
222
+ ok3 = pcewP.toStash(contentType="data", useStash=useStash, useGit=useGit)
223
+ logger.info("PubChemEtlWrapper.toStash 'data' completed with status %r", ok3)
224
+ else:
225
+ ok3 = True
226
+ #
227
+ ok4 = pcewP.updateIdentifiers()
228
+ logger.info("PubChemEtlWrapper.updateIdentifiers completed with status %r", ok4)
229
+ ok5 = pcewP.dump(contentType="identifiers")
230
+ logger.info("PubChemEtlWrapper.dump 'identifiers' completed with status %r", ok5)
231
+ if useGit or useStash:
232
+ ok6 = pcewP.toStash(contentType="identifiers", useStash=useStash, useGit=useGit)
233
+ logger.info("PubChemEtlWrapper.toStash 'identifiers' completed with status %r", ok6)
234
+ else:
235
+ ok6 = True
236
+ #
237
+ except Exception as e:
238
+ logger.exception("Failing with %s", str(e))
239
+ #
240
+ return ok1 and ok2 and ok3 and ok4 and ok5 and ok6
File without changes
@@ -0,0 +1,103 @@
1
+ Metadata-Version: 2.4
2
+ Name: rcsb.exdb
3
+ Version: 1.31
4
+ Summary: RCSB Python ExDB data extraction and loading workflows
5
+ Project-URL: Homepage, https://github.com/rcsb/py-rcsb_exdb
6
+ Author-email: John Westbrook <john.westbrook@rcsb.org>
7
+ Maintainer-email: Dennis Piehl <dennis.piehl@rcsb.org>
8
+ License-Expression: Apache-2.0
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 5 - Production/Stable
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Natural Language :: English
13
+ Classifier: Programming Language :: Python
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Requires-Python: >=3.9
17
+ Requires-Dist: jsonschema>=2.6.0
18
+ Requires-Dist: numpy
19
+ Requires-Dist: openeye-toolkits>=2024.1.1
20
+ Requires-Dist: rcsb-db>=1.808
21
+ Requires-Dist: rcsb-utils-chem>=0.84
22
+ Requires-Dist: rcsb-utils-chemref>=0.91
23
+ Requires-Dist: rcsb-utils-config>=0.40
24
+ Requires-Dist: rcsb-utils-dictionary>=1.27
25
+ Requires-Dist: rcsb-utils-ec>=0.25
26
+ Requires-Dist: rcsb-utils-go>=0.18
27
+ Requires-Dist: rcsb-utils-io>=1.48
28
+ Requires-Dist: rcsb-utils-seq>=0.82
29
+ Requires-Dist: rcsb-utils-struct>=0.47
30
+ Requires-Dist: rcsb-utils-targets>=0.82
31
+ Requires-Dist: rcsb-utils-taxonomy>=0.43
32
+ Provides-Extra: tests
33
+ Requires-Dist: black>=21.5b1; extra == 'tests'
34
+ Requires-Dist: check-manifest; extra == 'tests'
35
+ Requires-Dist: coverage; extra == 'tests'
36
+ Requires-Dist: flake8; extra == 'tests'
37
+ Requires-Dist: pylint; extra == 'tests'
38
+ Requires-Dist: rcsb-utils-citation>=0.25; extra == 'tests'
39
+ Requires-Dist: tox; extra == 'tests'
40
+ Description-Content-Type: text/markdown
41
+
42
+ # py-rcsb_exdb
43
+
44
+ [![Build Status](https://dev.azure.com/rcsb/RCSB%20PDB%20Python%20Projects/_apis/build/status/rcsb.py-rcsb_exdb?branchName=master)](https://dev.azure.com/rcsb/RCSB%20PDB%20Python%20Projects/_build/latest?definitionId=18&branchName=master)
45
+
46
+ RCSB exchange database extraction and loading workflow tools
47
+
48
+ ## Introduction
49
+
50
+ This module contains a collection of utility classes for extracting data from
51
+ the RCSB exchange database and subsequently reloading processed or integrated data.
52
+
53
+ ### Installation
54
+
55
+ Download the library source software from the project repository:
56
+
57
+ ```bash
58
+
59
+ git clone --recurse-submodules https://github.com/rcsb/py-rcsb_exdb.git
60
+
61
+ ```
62
+
63
+ Optionally, run test suite (Python versions 2.7 and 3.7) using
64
+ [tox](http://tox.readthedocs.io/en/latest/example/platform.html):
65
+
66
+ ```bash
67
+ tox
68
+ ```
69
+
70
+ Installation is via the program [pip](https://pypi.python.org/pypi/pip). To run tests
71
+ from the source tree, the package must be installed in editable mode (i.e. -e):
72
+
73
+ ```bash
74
+ pip install -e . --extra-index-url https://pypi.anaconda.org/OpenEye/simple
75
+
76
+ # or using uv
77
+
78
+ uv pip install -e .
79
+ ```
80
+
81
+ #### Installing in Ubuntu Linux (tested in 18.04)
82
+
83
+ You will need a few packages, before `pip install .` can work:
84
+
85
+ ```bash
86
+
87
+ sudo apt install flex bison
88
+
89
+ ```
90
+
91
+ ### Installing on macOS
92
+
93
+ To use and develop this package on macOS requires a number of packages that are not
94
+ distributed as part of the base macOS operating system.
95
+ The following steps provide one approach to creating the development environment for this
96
+ package. First, install the Apple [XCode](https://developer.apple.com/xcode/) package and associate command-line tools.
97
+ This will provide essential compilers and supporting tools. The [HomeBrew](https://brew.sh/) package
98
+ manager provides further access to a variety of common open source services and tools.
99
+ Follow the instructions provided by at the [HomeBrew](https://brew.sh/) site to
100
+ install this system. Once HomeBrew is installed, you can further install the
101
+ [MongoDB](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/) packages which
102
+ are required to support the ExDB tools. HomeBrew also provides a variety of options for
103
+ managing a [Python virtual environments](https://gist.github.com/Geoyi/f55ed54d24cc9ff1c14bd95fac21c042).
@@ -0,0 +1,98 @@
1
+ rcsb/__init__.py,sha256=ED6jHcYiuYpr_0vjGz0zx2lrrmJT9sDJCzIljoDfmlM,65
2
+ rcsb/exdb/__init__.py,sha256=ED6jHcYiuYpr_0vjGz0zx2lrrmJT9sDJCzIljoDfmlM,65
3
+ rcsb/exdb/branch/BranchedEntityExtractor.py,sha256=et-rQWTMbvzFcOW3PPKeGLdvOzyCxwQo1p_y3LJqjJo,2645
4
+ rcsb/exdb/branch/GlycanProvider.py,sha256=D5jhSGKc6pembx-eQX2zQcEULffQ1yrkgVOzPDclhP8,4000
5
+ rcsb/exdb/branch/GlycanUtils.py,sha256=lovKiRrYwmVxk4VItrrUj0D6wQ_BIOojiM5dgNdY0g4,4507
6
+ rcsb/exdb/branch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ rcsb/exdb/chemref/ChemRefEtlWorker.py,sha256=pGVsCJt6gzIWAGRRUULiyvaFul5LHx5UfFBUbv6B6lI,5439
8
+ rcsb/exdb/chemref/ChemRefExtractor.py,sha256=D-m8oga4PtntTTkpxc9k8gwMbn16vkGKq0BrDicUZaM,2580
9
+ rcsb/exdb/chemref/ChemRefMappingProvider.py,sha256=UMrJtQHTThMBFhV1ZzDAwz6-ZXU4VPn2vemNzAPDPW0,5290
10
+ rcsb/exdb/chemref/PubChemDataCacheProvider.py,sha256=g1O9FoDbqsLqET_D-oFxqiOf50bIpBSnSwjg4OJMqNc,15479
11
+ rcsb/exdb/chemref/PubChemEtlWrapper.py,sha256=uvGsNH_vTdJg11n2iftR5mq5UVKuM2GbgtotsR5kYSQ,11699
12
+ rcsb/exdb/chemref/PubChemIndexCacheProvider.py,sha256=5SRTA437XVuCawJDT4JT3hV9zDkNk0peOpRJNKFlkMA,29299
13
+ rcsb/exdb/chemref/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ rcsb/exdb/citation/CitationAdapter.py,sha256=rgzzv2BChlv38kO-QO67KHucvAXT-HaQbYz5coYHke4,3501
15
+ rcsb/exdb/citation/CitationExtractor.py,sha256=tPJv9UJlUjNVwHnOdfZoOUlkFWMQHqUEYNpbHnCNTHM,7574
16
+ rcsb/exdb/citation/CitationUtils.py,sha256=4W1_-HgblZ4fk_rC5mzWinwZqDujV8K-QZxOL6e0ldk,1487
17
+ rcsb/exdb/citation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ rcsb/exdb/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ rcsb/exdb/entry/EntryInfoProvider.py,sha256=GE6ix6NjyUG0Q4RRTyzd4jWGdDp4Vrbbqh9XNZTZjm8,5095
20
+ rcsb/exdb/entry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ rcsb/exdb/examples-seq/EntityInstanceExtractor.py,sha256=cAZmmijRhtrYnH4lclj-o_Xf2Yel8RYWJG5DOj2SB2w,28612
22
+ rcsb/exdb/examples-seq/EntityPolymerExtractor.py,sha256=zGxLTa9ahAKwgBVxUrhDErZjmSSqmAbNQy1QEJOW7zg,25846
23
+ rcsb/exdb/examples-seq/EntityPolymerExtractorFullTests.py,sha256=S15z0nd-zIakUU1UZFYgbO5vfD6-dGLkSAb-AiNliDo,7460
24
+ rcsb/exdb/examples-seq/ReferenceSequenceAssignmentUpdater.py,sha256=B73sF0uvPZjH15FNk6QvsFBGbKXVVWE1rFXJpjM8FaY,21678
25
+ rcsb/exdb/examples-seq/ReferenceSequenceUtils.py,sha256=xvNrtf2Y5I_cUwIHXiTzOUi8ChAGGwdqP4wiBDBdDXg,4779
26
+ rcsb/exdb/examples-seq/ReferenceSequenceUtilsTests.py,sha256=tOidiXKHm9V6K6yghcnQc03OgJBpnsEqjuEupxwvT1M,3880
27
+ rcsb/exdb/examples-seq/exampleObjectExtractor.py,sha256=1mawRGdX0Faot0Mtmu47D6OkHfPPZ6cV9zJLu40llc8,3908
28
+ rcsb/exdb/examples-seq/fixtureEntityPolymerExtractor.py,sha256=neBxsKl-gr85y6HC4DndJkO_2WkNkcEiiRlM98OLZPY,2918
29
+ rcsb/exdb/examples-seq/testEntityInstanceExtractor.py,sha256=aenQytsaG59vQws_juxSv5O_UWEx7QT1mzidpdG87vc,6834
30
+ rcsb/exdb/examples-seq/testEntityPolymerExtractor.py,sha256=p0yPGTBBG5mlHPobZ9Xol3LpOgxorGZejLcsz04lfJw,7305
31
+ rcsb/exdb/examples-seq/testReferenceSequenceAssignmentUpdater.py,sha256=V1wDTY4NSfafRjGQqhpHTKXQQkUdQajFnu9XmN0XL3E,2906
32
+ rcsb/exdb/examples-seq/testReferenceSequenceUtils.py,sha256=JIpQsyVfU9sx-50ludlDIWGQ2414o_4pI1JwMFyoBzU,3639
33
+ rcsb/exdb/seq/AnnotationExtractor.py,sha256=8iCE8LJR7QH8ilSWDkpKYQSfVuSvorlnM9VHIIYcRoY,2741
34
+ rcsb/exdb/seq/LigandNeighborMappingExtractor.py,sha256=PpRWunQHZ6j8s6MCu1tuY59cocEoUvM3bIUcsvQ-Ijo,3431
35
+ rcsb/exdb/seq/LigandNeighborMappingProvider.py,sha256=vzy2tJGB6IgDNgSHyzGU3TuTOV9cfWI_eLRkO3apQtk,3741
36
+ rcsb/exdb/seq/PolymerEntityExtractor.py,sha256=YPyK0F90mjHCBc_vqZdAvBcDecAcOHUax4TxGToEzmg,15004
37
+ rcsb/exdb/seq/ReferenceSequenceAnnotationAdapter.py,sha256=VXStOXoZcbFGYOm5eYiqn599BNksG87h3kzK_aQz2Xc,31160
38
+ rcsb/exdb/seq/ReferenceSequenceAnnotationProvider.py,sha256=2fbNeH1VkxEPpny0lfaTJ-UGEXQjxTdQbUoeiTRbJuU,9560
39
+ rcsb/exdb/seq/ReferenceSequenceAssignmentAdapter.py,sha256=P-t4w4uvnx4qv_vBAJwKuBGjo6wOIYZ8IKzGaw2bCQ8,25935
40
+ rcsb/exdb/seq/ReferenceSequenceAssignmentProvider.py,sha256=Y0wK9SsRNfZvFfyWDCEP_fXgYEMKu7XDT4eNJGyxyyU,18181
41
+ rcsb/exdb/seq/ReferenceSequenceCacheProvider.py,sha256=R0D_J65B7RtUuJFbJ4h787VAMi_BE3i-dH1pm-Em_v0,19497
42
+ rcsb/exdb/seq/TaxonomyExtractor.py,sha256=I7jsb5Kanrnh4X-znl9kZPZMJ7o2dp4fsnp2IWel4rs,2315
43
+ rcsb/exdb/seq/UniProtCoreEtlWorker.py,sha256=-fEojXF3lAJ1tbMsPIxT9In6ooiPThuKSoIRQ0YlZ1s,7590
44
+ rcsb/exdb/seq/UniProtExtractor.py,sha256=pR_A9e82YvbQ813M8rNPu1bCPOHMjGnCqJmLDMM23Qo,2695
45
+ rcsb/exdb/seq/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
+ rcsb/exdb/tests/TEST-EXDB-CLI-EXEC.sh,sha256=DWiM-DeyG_GFRki4WWSIl41ErYVxrp8t0lPypizterc,778
47
+ rcsb/exdb/tests/TEST-EXDB-CLI-REFSEQ-EXEC.sh,sha256=CPQ8rRpfBVIl5r6IFt2t-P4aBBIWUo4NioR7M0LM6Nc,769
48
+ rcsb/exdb/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
+ rcsb/exdb/tests/fixtureDictMethodResourceProvider.py,sha256=h_iRfmZR9UG0nFYnVoPDtAE3VPpyrnwJRXbrdfeh0gY,3999
50
+ rcsb/exdb/tests/fixturePdbxLoader.py,sha256=wfXyJ4k2Z-85J6sCSArf-eAuYQVbsTilwWmnm8cNPa4,10167
51
+ rcsb/exdb/tests/testAnnotationExtractor.py,sha256=rpeB4RtOcYD27S3ZwnePHHSaac2j4bmvqfu-wJ5254U,2657
52
+ rcsb/exdb/tests/testBranchedEntityExtractor.py,sha256=efchTzuQylD7L7Kc0j-rEvBeLjnPzvSWVLA8I7JIBys,2936
53
+ rcsb/exdb/tests/testChemRefLoader.py,sha256=pZqWiSIQZ9bfZMJplw_ym9swCe0N6rjq63mfcqWtNO0,3696
54
+ rcsb/exdb/tests/testChemRefMappingProvider.py,sha256=wxypTg-Y5DsAksT4a2x2yh1_JCf-7HqP9z0jKDmNcNg,3353
55
+ rcsb/exdb/tests/testCitationAdapter.py,sha256=ZlvG6aTHzKVnREj3LXQd1iniwC-KXR45vbyzBgdoiu8,3625
56
+ rcsb/exdb/tests/testCitationExtractor.py,sha256=7Xg75JHtnZkfrFnZVNggLRVFeRNW6V5O0tGse40C9fc,3141
57
+ rcsb/exdb/tests/testCitationUtils.py,sha256=lCn5n_49vAnQIaUd4fSY-sQ6Ld5r5G32WRaprErryo8,3064
58
+ rcsb/exdb/tests/testEntryInfoEtlWorkflow.py,sha256=TutfC949U0nDkFbmMdXo_MgbxMfvll4O-5C7N8Qj3TA,2340
59
+ rcsb/exdb/tests/testEntryInfoProvider.py,sha256=2Ti-o2A8QlB0reJHFqXHjyrvehlLRFtycFhCTBTY_d0,3360
60
+ rcsb/exdb/tests/testGlycanEtlWorkflow.py,sha256=Olml-71jiWAGOU-NQNHiRSPrew7RJtLK3R6u6WTlUSc,2295
61
+ rcsb/exdb/tests/testGlycanProvider.py,sha256=n15qTncV289o-E5J_AsizPW1tgeCHZH8A7_qXG2Afr4,3201
62
+ rcsb/exdb/tests/testGlycanUtils.py,sha256=h59g_iuEEzhcWRW50VdYlRHw3UrpqiRYgJZKDU4C9Wc,1953
63
+ rcsb/exdb/tests/testLigandNeighborMappingProvider.py,sha256=JjY4y5a4ZuZPJ4gdOxIwRLVz5U6F0f0K963OeDZmFAM,3144
64
+ rcsb/exdb/tests/testObjectExtractor.py,sha256=aHP6q9UQqDFd44u8KNQrnfTWy8Rf9dQ8FnHhUHAmqq0,14122
65
+ rcsb/exdb/tests/testObjectTransformer.py,sha256=7fPWTfN4G6wFj6MZkw_L0dtONMsVBlBCzoHvxzrgsUo,2944
66
+ rcsb/exdb/tests/testObjectUpdater.py,sha256=Kq-Mk4ZbD-eMoIsR3zGJvamFq-OEX4tFXyPB9FePWxc,4950
67
+ rcsb/exdb/tests/testPolymerEntityExtractor.py,sha256=RTsEWZDarrtdVn2Xy7fbPIrZTw7Nd9VJ21aBBr3QFU0,3536
68
+ rcsb/exdb/tests/testPubChemDataCacheProvider.py,sha256=K2Fg4Bibtdg9Z9zLwwJqZDa-XlIKHiSb9A6ewIa2-sM,4679
69
+ rcsb/exdb/tests/testPubChemEtlWorkflow.py,sha256=vENOnc7D-EukdjElvhsZqTL0h5N6alPso4Gn3rDNMXg,5187
70
+ rcsb/exdb/tests/testPubChemEtlWrapper.py,sha256=yGg0HvtYvFTvEEK9OsqvSSRVzCIG90UPEK_Lh7SifAk,6511
71
+ rcsb/exdb/tests/testPubChemIndexCacheProvider.py,sha256=KVPfgnMdp7V57LnuwLLkbcZ-DjGHdEx4q0V1RAyOCXw,4947
72
+ rcsb/exdb/tests/testReferenceSequenceAnnotationAdapter.py,sha256=hABmh743REIhFe3vP_dKr0uUvUH6-Ci71fpHGUIzt6E,4495
73
+ rcsb/exdb/tests/testReferenceSequenceAssignmentAdapter.py,sha256=g9-t6-TMZNqxtjgZy9cYCXA19ZkOfjb0un7o8sasuAA,4897
74
+ rcsb/exdb/tests/testReferenceSequenceAssignmentAdapterValidate.py,sha256=p3wPa-9_Il9eHP3fQGI1ag2FE0mvuOdeGu2uet6APOU,5005
75
+ rcsb/exdb/tests/testReferenceSequenceAssignmentProvider.py,sha256=6qzk-xt0QVrX4IC8Ml6HnDzFcee14vIUs14AKAWFg9w,4631
76
+ rcsb/exdb/tests/testReferenceSequenceCacheProvider.py,sha256=thQnpv1dxnL46PfZS6alhyS2N_rnATRmvh8SU9HJHAM,3469
77
+ rcsb/exdb/tests/testTaxonomyExtractor.py,sha256=NZv0UFBnnRUxQN3gzPIruOqyJEG6F81avI8tQu9ILao,2536
78
+ rcsb/exdb/tests/testTreeNodeListWorker.py,sha256=PiVaSOG0140fonhHsp0yxft3KlYaBzDb2hwmPKZxy5Y,3653
79
+ rcsb/exdb/tests/testUniProtCoreEtlWorker.py,sha256=8LyJjeMiKkGSYZ1641xpO1clKSJSESWrHywrNqMeJ9o,3403
80
+ rcsb/exdb/tests/testUniProtExtractor.py,sha256=jNNAI1GIedEbZhpdG1C9CjuZskUwxFg8jxgZJi1tr2U,2604
81
+ rcsb/exdb/tests/test-data/components-abbrev.cif,sha256=Vodm2R_8ipO2X4e8W3Wa1MiH3YF7RSczdtXC0TA13sM,139314
82
+ rcsb/exdb/tests/test-data/prdcc-abbrev.cif,sha256=pA2yCImadbuh51q59fdIOsGnyXVBPFv-8Z8Zrk2jUqA,415606
83
+ rcsb/exdb/tree/TreeNodeListWorker.py,sha256=VLd7MWCxw9fONoC3xYbjvARp2O2V8Vyy-kUZnwQWi30,10233
84
+ rcsb/exdb/tree/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
+ rcsb/exdb/utils/ObjectAdapterBase.py,sha256=w-MGvs-TFQXzfgOfAX3aNyCfaN9gY8WP-7MU2FcMAYs,466
86
+ rcsb/exdb/utils/ObjectExtractor.py,sha256=fAJ-WW_-80h_s_XSDdZYi1I2pltb-uQ3teOtCkcyznk,11057
87
+ rcsb/exdb/utils/ObjectTransformer.py,sha256=B5myzcYzsu5vEnzbxUYG3c6u3UlD6ekKftMKQpUCsXg,5229
88
+ rcsb/exdb/utils/ObjectUpdater.py,sha256=prrpRKjMNr7Y8jPMfQdyQh4yJ2zDLd4pZMDxF7g5mks,5089
89
+ rcsb/exdb/utils/ObjectValidator.py,sha256=FiF7wNe0V13rrrIczxWneFIBRAp0p4gWaNhqgfYo4Ho,6973
90
+ rcsb/exdb/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
+ rcsb/exdb/wf/EntryInfoEtlWorkflow.py,sha256=YVr75Wz1BPjLr_satd28B9BeD3QL6HwmkR173AKqTno,2570
92
+ rcsb/exdb/wf/GlycanEtlWorkflow.py,sha256=oJ6wf438K2e-eLmy8Ni3MCPxjAKgVJY38SWO885gnmg,2820
93
+ rcsb/exdb/wf/PubChemEtlWorkflow.py,sha256=fNX3A6kf0S1XiJMz7ywNpFuuua5lT3XaUFjcCJtvQsU,11235
94
+ rcsb/exdb/wf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
95
+ rcsb_exdb-1.31.dist-info/METADATA,sha256=QWvZc5fDZqWlHPTXgBsRhu8Q7W7yZy4hOSp6sMJGxuk,3845
96
+ rcsb_exdb-1.31.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
97
+ rcsb_exdb-1.31.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
98
+ rcsb_exdb-1.31.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.28.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any