rcsb.workflow 0.41__tar.gz → 0.43__tar.gz

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. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/HISTORY.txt +4 -0
  2. {rcsb.workflow-0.41/rcsb.workflow.egg-info → rcsb_workflow-0.43}/PKG-INFO +11 -2
  3. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb/workflow/chem/__init__.py +1 -1
  4. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb/workflow/targets/ProteinTargetSequenceExecutionWorkflow.py +13 -1
  5. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb/workflow/targets/ProteinTargetSequenceWorkflow.py +62 -30
  6. {rcsb.workflow-0.41 → rcsb_workflow-0.43/rcsb.workflow.egg-info}/PKG-INFO +11 -2
  7. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/setup.cfg +1 -1
  8. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/LICENSE +0 -0
  9. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/MANIFEST.in +0 -0
  10. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/README.md +0 -0
  11. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb/__init__.py +0 -0
  12. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb/workflow/__init__.py +0 -0
  13. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb/workflow/chem/ChemCompFileWorkflow.py +0 -0
  14. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb/workflow/chem/ChemCompImageWorkflow.py +0 -0
  15. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb/workflow/chem/ChemCompSearchIndexWorkflow.py +0 -0
  16. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb/workflow/targets/__init__.py +0 -0
  17. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb.workflow.egg-info/SOURCES.txt +0 -0
  18. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb.workflow.egg-info/dependency_links.txt +0 -0
  19. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb.workflow.egg-info/not-zip-safe +0 -0
  20. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb.workflow.egg-info/requires.txt +0 -0
  21. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/rcsb.workflow.egg-info/top_level.txt +0 -0
  22. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/requirements.txt +0 -0
  23. {rcsb.workflow-0.41 → rcsb_workflow-0.43}/setup.py +0 -0
@@ -31,3 +31,7 @@
31
31
  22-May-2023 - V0.39 Add retries to tox task for MMseqs2 download
32
32
  1-Jun-2023 - V0.40 Don't back up resources to GitHub during cache update workflows
33
33
  12-Jun-2023 - V0.41 Set useTaxonomy filter to False for CARD annotations
34
+ 19-Sep-2023 - V0.42 Don't overwrite Buildlocker files if there is no data;
35
+ Reduce resource footprint for Azure tests;
36
+ Make CARDTargetOntologyProvider stashable on Buildlocker
37
+ 21-May-2024 - V0.43 Fix pylinting
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rcsb.workflow
3
- Version: 0.41
3
+ Version: 0.43
4
4
  Summary: RCSB Python data processing and ETL/ELT workflow entry points
5
5
  Home-page: https://github.com/rcsb/py-rcsb_workflow
6
6
  Author: John Westbrook
@@ -14,9 +14,18 @@ Classifier: Programming Language :: Python
14
14
  Classifier: Programming Language :: Python :: 3
15
15
  Classifier: Programming Language :: Python :: 3.8
16
16
  Description-Content-Type: text/markdown
17
+ License-File: LICENSE
18
+ Requires-Dist: OpenEye-toolkits>=2020.2.2
19
+ Requires-Dist: rcsb.utils.chem>=0.75
20
+ Requires-Dist: rcsb.utils.seq>=0.63
21
+ Requires-Dist: rcsb.utils.targets>=0.57
22
+ Requires-Dist: rcsb.utils.seqalign>=0.24
23
+ Requires-Dist: rcsb.exdb>=0.87
24
+ Requires-Dist: rcsb.utils.io>=1.20
17
25
  Provides-Extra: dev
26
+ Requires-Dist: check-manifest; extra == "dev"
18
27
  Provides-Extra: test
19
- License-File: LICENSE
28
+ Requires-Dist: coverage; extra == "test"
20
29
 
21
30
  # py-rcsb_workflow
22
31
 
@@ -2,4 +2,4 @@ __docformat__ = "google en"
2
2
  __author__ = "John Westbrook"
3
3
  __email__ = "john.westbrook@rcsb.org"
4
4
  __license__ = "Apache 2.0"
5
- __version__ = "0.41"
5
+ __version__ = "0.43"
@@ -227,20 +227,32 @@ def fullWorkflow():
227
227
  """Entry point for the full targets sequence and cofactor update workflow."""
228
228
  ptsWf = ProteinTargetSequenceExecutionWorkflow()
229
229
  ok = ptsWf.cacheTaxonomy()
230
+ logger.info("cacheTaxonomy status %r", ok)
230
231
  ok = ptsWf.updateUniProtTaxonomy() and ok
232
+ logger.info("updateUniProtTaxonomy status %r", ok)
231
233
  ok = ptsWf.fetchProteinEntityData() and ok
234
+ logger.info("fetchProteinEntityData status %r", ok)
232
235
  ok = ptsWf.fetchChemicalReferenceMappingData() and ok
236
+ logger.info("fetchChemicalReferenceMappingData status %r", ok)
233
237
  ok = ptsWf.fetchLigandNeighborMappingData() and ok
238
+ logger.info("fetchLigandNeighborMappingData status %r", ok)
234
239
  ok = ptsWf.exportFasta() and ok
240
+ logger.info("exportFasta status %r", ok)
235
241
  ok = ptsWf.createSearchDatabases() and ok
242
+ logger.info("createSearchDatabases status %r", ok)
236
243
  ok = ptsWf.searchDatabases() and ok
244
+ logger.info("searchDatabases status %r", ok)
237
245
  ok = ptsWf.buildFeatures() and ok
246
+ logger.info("buildFeatures status %r", ok)
247
+ # To rebuild ChEMBL-target-activity data from scratch (non-incremental), set skip=None in fetchTargetActivityDataMulti()
238
248
  ok = ptsWf.buildActivityData() and ok
249
+ logger.info("buildActivityData status %r", ok)
239
250
  ok = ptsWf.buildCofactorData() and ok
251
+ logger.info("buildCofactorData status %r", ok)
240
252
  ptsWf.resourceCheck()
241
253
  return ok
242
254
 
243
255
 
244
256
  if __name__ == "__main__":
245
257
  status = fullWorkflow()
246
- print("Full workflow completion status (%r)", status)
258
+ logger.info("Full workflow completion status (%r)", status)
@@ -14,6 +14,7 @@
14
14
  # 5-May-2023 Restore from stash if fromDbPharos and reloadPharos parameters are False
15
15
  # 1-Jun-2023 aae Don't back up resources to GitHub during cache update workflows
16
16
  # 12-Jun-2023 dwp Set useTaxonomy filter to False for CARD annotations
17
+ # 6-Jul-2023 aae Don't overwrite Buildlocker files if there is no data
17
18
  ##
18
19
  __docformat__ = "google en"
19
20
  __author__ = "John Westbrook"
@@ -33,6 +34,7 @@ from rcsb.utils.seqalign.MMseqsUtils import MMseqsUtils
33
34
  from rcsb.utils.seq.UniProtIdMappingProvider import UniProtIdMappingProvider
34
35
  from rcsb.utils.targets.CARDTargetProvider import CARDTargetProvider
35
36
  from rcsb.utils.targets.CARDTargetAnnotationProvider import CARDTargetAnnotationProvider
37
+ from rcsb.utils.targets.CARDTargetOntologyProvider import CARDTargetOntologyProvider
36
38
  from rcsb.utils.targets.ChEMBLTargetProvider import ChEMBLTargetProvider
37
39
  from rcsb.utils.targets.ChEMBLTargetActivityProvider import ChEMBLTargetActivityProvider
38
40
  from rcsb.utils.targets.ChEMBLTargetCofactorProvider import ChEMBLTargetCofactorProvider
@@ -67,9 +69,12 @@ class ProteinTargetSequenceWorkflow(object):
67
69
  ok = False
68
70
  try:
69
71
  crmP = ChemRefMappingProvider(self.__cachePath, useCache=False)
70
- okF = crmP.fetchChemRefMapping(self.__cfgOb)
71
- okB = crmP.backup(self.__cfgOb, self.__configName, useStash=True, useGit=False)
72
- ok = okF and okB
72
+ ok = crmP.fetchChemRefMapping(self.__cfgOb)
73
+ logger.info("Completed fetch ChemRefMappingProvider (%r)", ok)
74
+ crmP.reload()
75
+ if ok and crmP.testCache(minCount=1):
76
+ ok = crmP.backup(self.__cfgOb, self.__configName, useStash=True, useGit=False)
77
+ logger.info("Completed backup ChemRefMappingProvider (%r)", ok)
73
78
  except Exception as e:
74
79
  logger.exception("Failing with %s", str(e))
75
80
  return ok
@@ -79,9 +84,12 @@ class ProteinTargetSequenceWorkflow(object):
79
84
  ok = False
80
85
  try:
81
86
  crmP = LigandNeighborMappingProvider(self.__cachePath, useCache=False)
82
- okF = crmP.fetchLigandNeighborMapping(self.__cfgOb)
83
- okB = crmP.backup(self.__cfgOb, self.__configName, useStash=True, useGit=False)
84
- ok = okF and okB
87
+ ok = crmP.fetchLigandNeighborMapping(self.__cfgOb)
88
+ logger.info("Completed fetch LigandNeighborMappingProvider (%r)", ok)
89
+ crmP.reload()
90
+ if ok and crmP.testCache(minCount=1):
91
+ ok = crmP.backup(self.__cfgOb, self.__configName, useStash=True, useGit=False)
92
+ logger.info("Completed backup LigandNeighborMappingProvider (%r)", ok)
85
93
  except Exception as e:
86
94
  logger.exception("Failing with %s", str(e))
87
95
  return ok
@@ -117,11 +125,12 @@ class ProteinTargetSequenceWorkflow(object):
117
125
  startTime = time.time()
118
126
  umP = UniProtIdMappingProvider(cachePath=self.__cachePath)
119
127
  umP.clearCache()
120
- ok1 = umP.reload(useCache=True, useLegacy=False, fmt="tdd", mapNames=["NCBI-taxon"])
121
- logger.info("Completed building UniProt Id mapping (%r) at %s (%.4f seconds)", ok1, time.strftime("%Y %m %d %H:%M:%S", time.localtime()), time.time() - startTime)
122
- if ok1:
123
- ok2 = umP.backup(self.__cfgOb, self.__configName)
124
- return ok1 & ok2
128
+ ok = umP.reload(useCache=True, useLegacy=False, fmt="tdd", mapNames=["NCBI-taxon"])
129
+ logger.info("Completed building UniProt Id mapping (%r) at %s (%.4f seconds)", ok, time.strftime("%Y %m %d %H:%M:%S", time.localtime()), time.time() - startTime)
130
+ if ok and umP.testCache():
131
+ ok = umP.backup(self.__cfgOb, self.__configName)
132
+ logger.info("Completed backup UniProt Id mapping (%r)", ok)
133
+ return ok
125
134
 
126
135
  def exportTargetsFasta(self, resourceNameList=None, useCache=True, addTaxonomy=False, reloadPharos=False, fromDbPharos=False, backupPharos=False, remotePrefix=None):
127
136
  """Export the target FASTA files for the input data resources.
@@ -151,7 +160,7 @@ class ProteinTargetSequenceWorkflow(object):
151
160
  backupPharos=backupPharos,
152
161
  remotePrefix=remotePrefix
153
162
  )
154
- logger.info("Completed loading %s targets (status %r)at %s (%.4f seconds)", resourceName, ok, time.strftime("%Y %m %d %H:%M:%S", time.localtime()), time.time() - startTime)
163
+ logger.info("Completed loading %s targets (status %r) at %s (%.4f seconds)", resourceName, ok, time.strftime("%Y %m %d %H:%M:%S", time.localtime()), time.time() - startTime)
155
164
  retOk = retOk and ok
156
165
  return retOk
157
166
 
@@ -163,6 +172,7 @@ class ProteinTargetSequenceWorkflow(object):
163
172
  taxonPath = self.__getTaxonPath(resourceName)
164
173
  if resourceName == "card":
165
174
  cardtP = CARDTargetProvider(cachePath=self.__cachePath, useCache=useCache)
175
+ cardtP.reload()
166
176
  if cardtP.testCache():
167
177
  ok = cardtP.exportCardFasta(fastaPath, taxonPath)
168
178
  elif resourceName == "drugbank":
@@ -173,6 +183,7 @@ class ProteinTargetSequenceWorkflow(object):
173
183
  ok = dbtP.exportFasta(fastaPath, taxonPath, addTaxonomy=addTaxonomy)
174
184
  elif resourceName == "chembl":
175
185
  chtP = ChEMBLTargetProvider(cachePath=self.__cachePath, useCache=useCache)
186
+ chtP.reload()
176
187
  if chtP.testCache():
177
188
  ok = chtP.exportFasta(fastaPath, taxonPath, addTaxonomy=addTaxonomy)
178
189
  elif resourceName == "pharos":
@@ -181,7 +192,7 @@ class ProteinTargetSequenceWorkflow(object):
181
192
  ptP = PharosTargetProvider(cachePath=self.__cachePath, useCache=useCache, reloadDb=reloadPharos, fromDb=fromDbPharos, mysqlUser=user, mysqlPassword=pw)
182
193
  if ptP.testCache():
183
194
  ok = ptP.exportProteinFasta(fastaPath, taxonPath, addTaxonomy=addTaxonomy)
184
- if backupPharos:
195
+ if ok and backupPharos and ptP.testCache():
185
196
  okB = ptP.backup(self.__cfgOb, self.__configName, remotePrefix=remotePrefix, useStash=True, useGit=False)
186
197
  logger.info("%r targets backup status (%r)", resourceName, okB)
187
198
  elif not (reloadPharos or fromDbPharos):
@@ -190,6 +201,7 @@ class ProteinTargetSequenceWorkflow(object):
190
201
  ok = ptP.exportProteinFasta(fastaPath, taxonPath, addTaxonomy=addTaxonomy)
191
202
  elif resourceName == "sabdab":
192
203
  stP = SAbDabTargetProvider(cachePath=self.__cachePath, useCache=False)
204
+ stP.reload()
193
205
  if stP.testCache():
194
206
  ok = stP.exportFasta(fastaPath)
195
207
  elif resourceName == "pdbprent":
@@ -341,22 +353,30 @@ class ProteinTargetSequenceWorkflow(object):
341
353
  if resourceName == "sabdab":
342
354
  fP = SAbDabTargetFeatureProvider(cachePath=self.__cachePath, useCache=True)
343
355
  ok = fP.buildFeatureList(resultPath)
344
- if backup:
356
+ fP.reload()
357
+ if ok and backup and fP.testCache():
345
358
  okB = fP.backup(self.__cfgOb, self.__configName, remotePrefix=remotePrefix, useStash=True, useGit=False)
346
359
  logger.info("%r features backup status (%r)", resourceName, okB)
347
360
  elif resourceName == "card":
348
361
  fP = CARDTargetAnnotationProvider(cachePath=self.__cachePath, useCache=True)
349
362
  ok = fP.buildAnnotationList(resultPath, useTaxonomy=useTaxonomy)
350
- if backup:
363
+ fP.reload()
364
+ if ok and backup and fP.testCache():
351
365
  okB = fP.backup(self.__cfgOb, self.__configName, remotePrefix=remotePrefix, useStash=True, useGit=False)
352
366
  logger.info("%r annotations backup status (%r)", resourceName, okB)
367
+ fP = CARDTargetOntologyProvider(cachePath=self.__cachePath, useCache=False)
368
+ ok = fP.reload()
369
+ if ok and backup and fP.testCache():
370
+ okB = fP.backup(self.__cfgOb, self.__configName, remotePrefix=remotePrefix, useStash=True, useGit=False)
371
+ logger.info("%r ontology backup status (%r)", resourceName, okB)
353
372
  elif resourceName == "imgt":
354
373
  fP = IMGTTargetFeatureProvider(cachePath=self.__cachePath, useCache=True)
355
374
  ok = fP.buildFeatureList(useCache=True)
356
- if backup:
375
+ fP.reload()
376
+ if ok and backup and fP.testCache():
357
377
  okB = fP.backup(self.__cfgOb, self.__configName, remotePrefix=remotePrefix, useStash=True, useGit=False)
358
378
  logger.info("%r features backup status (%r)", resourceName, okB)
359
- return ok & okB
379
+ return ok and okB
360
380
  except Exception as e:
361
381
  logger.exception("Failing with %s", str(e))
362
382
  return False
@@ -394,7 +414,7 @@ class ProteinTargetSequenceWorkflow(object):
394
414
  def __buildActivityData(self, referenceResourceName, resourceName, backup=False, remotePrefix=None, maxTargets=None):
395
415
  """Build features inferred from sequence comparison results between the input resources."""
396
416
  try:
397
- okB = okC = True
417
+ okB = okC = okD = True
398
418
  resultPath = self.__getFilteredSearchResultPath(resourceName, referenceResourceName)
399
419
  #
400
420
  if resourceName == "chembl":
@@ -406,26 +426,30 @@ class ProteinTargetSequenceWorkflow(object):
406
426
  pass
407
427
  targetIdList = aP.getTargetIdList(resultPath)
408
428
  targetIdList = targetIdList[:maxTargets] if maxTargets else targetIdList
429
+ # To rebuild ChEMBL-target-activity data from scratch (non-incremental), change skip=None
409
430
  ok = aP.fetchTargetActivityDataMulti(targetIdList, skip="tried", chunkSize=50, numProc=6)
410
431
  #
411
- if backup:
432
+ aP.reload()
433
+ if ok and backup and aP.testCache():
412
434
  okB = aP.backup(self.__cfgOb, self.__configName, remotePrefix=remotePrefix, useStash=True, useGit=False)
413
435
  logger.info("%r activity backup status (%r)", resourceName, okB)
414
436
  elif resourceName == "pharos":
415
437
  aP = PharosTargetActivityProvider(cachePath=self.__cachePath, useCache=True)
416
438
  ok = aP.fetchTargetActivityData()
417
- if backup:
439
+ aP.reload()
440
+ if ok and backup and aP.testCache(minCount=1):
418
441
  okB = aP.backup(self.__cfgOb, self.__configName, remotePrefix=remotePrefix, useStash=True, useGit=False)
419
442
  logger.info("%r activity data backup status (%r)", resourceName, okB)
420
443
  #
421
444
  chemblIdList = aP.fetchCompoundIdentifiers()
422
445
  phP = PharosProvider(cachePath=self.__cachePath, useCache=False)
423
- phP.load(chemblIdList, "identifiers", fmt="json", indent=0)
424
- if backup:
425
- okC = phP.backup(self.__cfgOb, self.__configName, remotePrefix=remotePrefix, useStash=True, useGit=False)
446
+ okC = phP.load(chemblIdList, "identifiers", fmt="json", indent=0)
447
+ phP.reload()
448
+ if okC and backup and phP.testCache(minCount=1):
449
+ okD = phP.backup(self.__cfgOb, self.__configName, remotePrefix=remotePrefix, useStash=True, useGit=False)
426
450
  logger.info("%r identifier backup status (%r)", resourceName, okC)
427
451
 
428
- return ok and okB and okC
452
+ return ok and okB and okC and okD
429
453
  except Exception as e:
430
454
  logger.exception("Failing with %s", str(e))
431
455
  return False
@@ -472,26 +496,34 @@ class ProteinTargetSequenceWorkflow(object):
472
496
  if resourceName == "chembl":
473
497
  aP = ChEMBLTargetCofactorProvider(cachePath=self.__cachePath, useCache=True)
474
498
  ok = aP.buildCofactorList(resultPath, crmpObj=crmpObj, lnmpObj=lnmpObj, maxActivity=maxActivity)
499
+ ok = aP.reload() and ok
500
+ logger.info("%r cofactor data build status (%r)", resourceName, ok)
475
501
  #
476
- if backup:
502
+ if ok and backup and aP.testCache():
477
503
  okB = aP.backup(self.__cfgOb, self.__configName, remotePrefix=remotePrefix, useStash=True, useGit=False)
478
- logger.info("%r cofactor backup status (%r)", resourceName, okB)
504
+ logger.info("%r cofactor data backup status (%r)", resourceName, okB)
479
505
 
480
506
  elif resourceName == "pharos":
481
507
  aP = PharosTargetCofactorProvider(cachePath=self.__cachePath, useCache=True, useStash=True, useGit=True)
482
508
  ok = aP.buildCofactorList(resultPath, crmpObj=crmpObj, lnmpObj=lnmpObj, maxActivity=maxActivity)
483
- if backup:
509
+ ok = aP.reload() and ok
510
+ logger.info("%r cofactor data build status (%r)", resourceName, ok)
511
+ #
512
+ if ok and backup and aP.testCache():
484
513
  okB = aP.backup(self.__cfgOb, self.__configName, remotePrefix=remotePrefix, useStash=True, useGit=False)
485
514
  logger.info("%r cofactor data backup status (%r)", resourceName, okB)
486
515
 
487
516
  elif resourceName == "drugbank":
488
517
  aP = DrugBankTargetCofactorProvider(cachePath=self.__cachePath, useCache=True)
489
518
  ok = aP.buildCofactorList(resultPath, crmpObj=crmpObj, lnmpObj=lnmpObj)
490
- if backup:
519
+ ok = aP.reload() and ok
520
+ logger.info("%r cofactor data build status (%r)", resourceName, ok)
521
+ #
522
+ if ok and backup and aP.testCache():
491
523
  okB = aP.backup(self.__cfgOb, self.__configName, remotePrefix=remotePrefix, useStash=True, useGit=False)
492
524
  logger.info("%r cofactor data backup status (%r)", resourceName, okB)
493
-
494
- return ok & okB
525
+ #
526
+ return ok and okB
495
527
  except Exception as e:
496
528
  logger.exception("Failing with %s", str(e))
497
529
  return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rcsb.workflow
3
- Version: 0.41
3
+ Version: 0.43
4
4
  Summary: RCSB Python data processing and ETL/ELT workflow entry points
5
5
  Home-page: https://github.com/rcsb/py-rcsb_workflow
6
6
  Author: John Westbrook
@@ -14,9 +14,18 @@ Classifier: Programming Language :: Python
14
14
  Classifier: Programming Language :: Python :: 3
15
15
  Classifier: Programming Language :: Python :: 3.8
16
16
  Description-Content-Type: text/markdown
17
+ License-File: LICENSE
18
+ Requires-Dist: OpenEye-toolkits>=2020.2.2
19
+ Requires-Dist: rcsb.utils.chem>=0.75
20
+ Requires-Dist: rcsb.utils.seq>=0.63
21
+ Requires-Dist: rcsb.utils.targets>=0.57
22
+ Requires-Dist: rcsb.utils.seqalign>=0.24
23
+ Requires-Dist: rcsb.exdb>=0.87
24
+ Requires-Dist: rcsb.utils.io>=1.20
17
25
  Provides-Extra: dev
26
+ Requires-Dist: check-manifest; extra == "dev"
18
27
  Provides-Extra: test
19
- License-File: LICENSE
28
+ Requires-Dist: coverage; extra == "test"
20
29
 
21
30
  # py-rcsb_workflow
22
31
 
@@ -2,7 +2,7 @@
2
2
  universal = 1
3
3
 
4
4
  [metadata]
5
- description-file = README.md
5
+ description_file = README.md
6
6
 
7
7
  [egg_info]
8
8
  tag_build =
File without changes
File without changes
File without changes
File without changes