stjames 0.0.120__py3-none-any.whl → 0.0.122__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 stjames might be problematic. Click here for more details.

stjames/__init__.py CHANGED
@@ -22,3 +22,4 @@ from .status import *
22
22
  from .constraint import *
23
23
  from .message import *
24
24
  from .types import *
25
+ from .engine import *
stjames/calculation.py CHANGED
@@ -1,10 +1,13 @@
1
- from typing import Optional
1
+ from typing import Optional, Self
2
2
 
3
- from .base import Base, LowercaseStrEnum
3
+ from pydantic import model_validator
4
+
5
+ from .base import Base, LowercaseStrEnum, UniqueList
4
6
  from .message import Message
5
7
  from .molecule import Molecule
6
8
  from .settings import Settings
7
9
  from .status import Status
10
+ from .task import Task
8
11
  from .types import UUID
9
12
 
10
13
 
@@ -20,6 +23,7 @@ class StJamesVersion(LowercaseStrEnum):
20
23
  class Calculation(Base):
21
24
  molecules: list[Molecule]
22
25
 
26
+ tasks: UniqueList[Task] = []
23
27
  settings: Settings = Settings()
24
28
 
25
29
  status: Status = Status.QUEUED
@@ -29,8 +33,17 @@ class Calculation(Base):
29
33
  logfile: Optional[str] = None
30
34
  messages: list[Message] = []
31
35
 
36
+ # DEPRECATED - moving into settings
32
37
  engine: Optional[str] = "peregrine"
38
+
33
39
  uuids: list[UUID | None] | None = None
34
40
 
35
41
  # not to be changed by end users, diff. versions will have diff. defaults
36
42
  json_format: str = StJamesVersion.V0
43
+
44
+ @model_validator(mode="after")
45
+ def populate_tasks(self) -> Self:
46
+ """Set the tasks from the settings, so that we don't have to migrate old entries."""
47
+ if len(self.tasks) == 0:
48
+ self.tasks = self.settings.tasks
49
+ return self
stjames/settings.py CHANGED
@@ -6,6 +6,7 @@ from .base import Base, UniqueList
6
6
  from .basis_set import BasisSet
7
7
  from .compute_settings import ComputeSettings
8
8
  from .correction import Correction
9
+ from .engine import Engine
9
10
  from .method import CORRECTABLE_NNP_METHODS, METHODS_WITH_CORRECTION, PREPACKAGED_METHODS, Method
10
11
  from .mode import Mode
11
12
  from .opt_settings import OptimizationSettings
@@ -20,11 +21,13 @@ _T = TypeVar("_T")
20
21
  class Settings(Base):
21
22
  mode: Mode = Mode.AUTO
22
23
 
24
+ # DEPRECATED - specify tasks only in BasicCalculationWorkflow or Calculation now
25
+ tasks: UniqueList[Task] = [Task.ENERGY, Task.CHARGE, Task.DIPOLE]
26
+
23
27
  method: Method = Method.HARTREE_FOCK
24
28
  basis_set: Optional[BasisSet] = None
25
- tasks: UniqueList[Task] = [Task.ENERGY, Task.CHARGE, Task.DIPOLE]
29
+ engine: Engine = None # type: ignore [assignment]
26
30
  corrections: UniqueList[Correction] = []
27
-
28
31
  solvent_settings: Optional[SolventSettings] = None
29
32
 
30
33
  # scf/opt settings will be set automatically based on mode, but can be overridden manually
@@ -33,6 +36,12 @@ class Settings(Base):
33
36
  thermochem_settings: ThermochemistrySettings = ThermochemistrySettings()
34
37
  compute_settings: ComputeSettings = ComputeSettings()
35
38
 
39
+ @model_validator(mode="after")
40
+ def set_engine(self) -> Self:
41
+ """Set the calculation engine."""
42
+ self.engine = self.engine or self.method.default_engine()
43
+ return self
44
+
36
45
  # mypy has this dead wrong (https://docs.pydantic.dev/2.0/usage/computed_fields/)
37
46
  # Python 3.12 narrows the reason for the ignore to prop-decorator
38
47
  @computed_field # type: ignore[misc, prop-decorator, unused-ignore]
@@ -18,6 +18,7 @@ from .ion_mobility import *
18
18
  from .irc import *
19
19
  from .macropka import *
20
20
  from .molecular_dynamics import *
21
+ from .msa import *
21
22
  from .multistage_opt import *
22
23
  from .nmr import *
23
24
  from .pka import *
@@ -49,6 +50,7 @@ WORKFLOW_NAME = Literal[
49
50
  "irc",
50
51
  "macropka",
51
52
  "molecular_dynamics",
53
+ "msa",
52
54
  "multistage_opt",
53
55
  "nmr",
54
56
  "pka",
@@ -81,6 +83,7 @@ WORKFLOW_MAPPING: dict[WORKFLOW_NAME, Workflow] = {
81
83
  "macropka": MacropKaWorkflow, # type: ignore [dict-item]
82
84
  "molecular_dynamics": MolecularDynamicsWorkflow, # type: ignore [dict-item]
83
85
  "multistage_opt": MultiStageOptWorkflow, # type: ignore [dict-item]
86
+ "msa": MSAWorkflow, # type: ignore [dict-item]
84
87
  "nmr": NMRSpectroscopyWorkflow, # type: ignore [dict-item]
85
88
  "pka": pKaWorkflow, # type: ignore [dict-item]
86
89
  "pose_analysis_md": PoseAnalysisMolecularDynamicsWorkflow, # type: ignore [dict-item]
@@ -4,8 +4,10 @@ from typing import Self
4
4
 
5
5
  from pydantic import model_validator
6
6
 
7
+ from ..base import UniqueList
7
8
  from ..engine import Engine
8
9
  from ..settings import Settings
10
+ from ..task import Task
9
11
  from ..types import UUID
10
12
  from .workflow import MoleculeWorkflow
11
13
 
@@ -25,9 +27,12 @@ class BasicCalculationWorkflow(MoleculeWorkflow):
25
27
  """
26
28
 
27
29
  settings: Settings
28
- engine: Engine = None # type: ignore [assignment]
30
+ tasks: UniqueList[Task] = [Task.ENERGY, Task.CHARGE, Task.DIPOLE]
29
31
  calculation_uuid: UUID | None = None
30
32
 
33
+ # DEPRECATED - specify in settings now
34
+ engine: Engine = None # type: ignore [assignment]
35
+
31
36
  @model_validator(mode="after")
32
37
  def set_engine(self) -> Self:
33
38
  """Set the calculation engine."""
@@ -3,9 +3,9 @@
3
3
  from abc import ABC
4
4
  from typing import Annotated, Literal, Self, Sequence, TypeVar
5
5
 
6
- from pydantic import AfterValidator, BaseModel, Field, field_validator, model_validator
6
+ from pydantic import AfterValidator, BaseModel, Field, PositiveInt, field_validator, model_validator
7
7
 
8
- from ..base import LowercaseStrEnum
8
+ from ..base import Base, LowercaseStrEnum
9
9
  from ..constraint import Constraint
10
10
  from ..method import Method, XTBMethod
11
11
  from ..mode import Mode
@@ -41,6 +41,28 @@ class ScreeningSettings(BaseModel):
41
41
  max_confs: int | None = None
42
42
 
43
43
 
44
+ class ConformerClusteringSettings(Base):
45
+ """
46
+ Settings for (optionally) clustering conformers based on three-dimensional properties.
47
+
48
+ The properties used for clustering are:
49
+ - Solvent-accessible surface area
50
+ - Polar solvent-accessible surface area
51
+ - Radius of gyration
52
+ - Plane of best fit
53
+ - Normalized principal moment ratios 1 and 2
54
+
55
+ Rowan uses k-means clustering to identify representative conformers.
56
+ This loosely follows Wilcken and co-workers (10.1007/s10822-020-00337-7).
57
+
58
+ :param num_clusters: the number of clusters to include
59
+ :param conformers_per_cluster: the number of compounds to pick from each cluster
60
+ """
61
+
62
+ num_clusters: PositiveInt = 5
63
+ conformers_per_cluster: PositiveInt = 3
64
+
65
+
44
66
  class ConformerGenSettings(BaseModel):
45
67
  """
46
68
  Conformer generation settings.
@@ -310,6 +332,8 @@ class ConformerGenMixin(BaseModel):
310
332
  nci: bool = False
311
333
  max_confs: int | None = None
312
334
 
335
+ conformer_clustering_settings: ConformerClusteringSettings | None = None
336
+
313
337
  @model_validator(mode="after")
314
338
  def validate_and_build_conf_gen_settings(self) -> Self:
315
339
  """Validate and build the ConformerGenSettings."""
@@ -36,9 +36,13 @@ class FukuiIndexWorkflow(MoleculeWorkflow):
36
36
  """
37
37
 
38
38
  opt_settings: Settings | None = None
39
+
40
+ # DEPRECATED - will be removed
39
41
  opt_engine: Engine | None = None
40
42
 
41
43
  fukui_settings: Settings = Settings(method=Method.GFN1_XTB)
44
+
45
+ # DEPRECATED - will be removed
42
46
  fukui_engine: Engine = None # type: ignore [assignment]
43
47
 
44
48
  optimization: UUID | None = None
@@ -52,7 +56,6 @@ class FukuiIndexWorkflow(MoleculeWorkflow):
52
56
  def set_engines(self) -> Self:
53
57
  """Set the engines for optimization and Fukui index calculations."""
54
58
  if self.opt_settings is not None and self.opt_engine is None:
55
- self.opt_engine = self.opt_settings.method.default_engine()
56
- self.fukui_engine = self.fukui_engine or self.fukui_settings.method.default_engine()
57
-
59
+ self.opt_engine = self.opt_settings.engine
60
+ self.fukui_engine = self.fukui_engine or self.fukui_settings.engine
58
61
  return self
@@ -96,6 +96,8 @@ class MolecularDynamicsWorkflow(MoleculeWorkflow):
96
96
 
97
97
  settings: MolecularDynamicsSettings
98
98
  calc_settings: Settings
99
+
100
+ # DEPRECATED - will remove later
99
101
  calc_engine: Engine = None # type: ignore[assignment]
100
102
 
101
103
  frames: list[Frame] = []
@@ -103,6 +105,6 @@ class MolecularDynamicsWorkflow(MoleculeWorkflow):
103
105
  @model_validator(mode="after")
104
106
  def validate_calc_engine(self) -> Self:
105
107
  """Ensure that the calc_engine is set."""
106
- self.calc_engine = self.calc_engine or self.calc_settings.method.default_engine()
108
+ self.calc_engine = self.calc_engine or self.calc_settings.engine
107
109
 
108
110
  return self
@@ -0,0 +1,31 @@
1
+ from ..base import LowercaseStrEnum
2
+ from .workflow import ProteinSequenceWorkflow
3
+
4
+
5
+ class MSAFormat(LowercaseStrEnum):
6
+ """Format of the MSA."""
7
+
8
+ COLABFOLD_DEFAULT = "colabfold_default"
9
+ AF3_JSON = "af3_json"
10
+
11
+
12
+ class MSAWorkflow(ProteinSequenceWorkflow):
13
+ """
14
+ Workflow for generating a MSA from protein sequences.
15
+
16
+ Inherited:
17
+ :param initial_protein_sequences: protein sequences of interest
18
+
19
+ New:
20
+ :param format: the format of the MSA return files
21
+
22
+ Results:
23
+ :param a3m_file: A3M file string
24
+ :param m8_file: M8 file string
25
+ :param af3_json_file: AF3 JSON file string
26
+ """
27
+
28
+ format: MSAFormat = MSAFormat.COLABFOLD_DEFAULT
29
+ a3m_file: str | None = None
30
+ m8_file: str | None = None
31
+ af3_json_file: str | None = None
stjames/workflows/scan.py CHANGED
@@ -1,12 +1,11 @@
1
- """Scan workflow."""
2
-
3
- from typing import Annotated
1
+ from typing import Annotated, Self
4
2
 
5
3
  import numpy as np
6
4
  from numpy.typing import NDArray
7
- from pydantic import AfterValidator, field_validator
5
+ from pydantic import AfterValidator, field_validator, model_validator
8
6
 
9
7
  from ..base import Base, round_optional_float
8
+ from ..engine import Engine
10
9
  from ..molecule import Molecule
11
10
  from ..settings import Settings
12
11
  from ..types import UUID
@@ -75,7 +74,9 @@ class ScanWorkflow(MoleculeWorkflow):
75
74
  scan_settings: ScanSettings | list[ScanSettings]
76
75
  scan_settings_2d: ScanSettings | list[ScanSettings] = []
77
76
  calc_settings: Settings
78
- calc_engine: str
77
+
78
+ # DEPRECATED - will be removed in future
79
+ calc_engine: Engine = None # type: ignore [assignment]
79
80
 
80
81
  wavefront_propagation: bool = True
81
82
 
@@ -94,3 +95,9 @@ class ScanWorkflow(MoleculeWorkflow):
94
95
  raise ValueError("Concerted scan settings must have same number of steps!")
95
96
 
96
97
  return val
98
+
99
+ @model_validator(mode="after")
100
+ def set_calc_engine(self) -> Self:
101
+ """Set the calculation engine."""
102
+ self.calc_engine = self.calc_engine or self.calc_settings.engine
103
+ return self
@@ -95,6 +95,16 @@ class MoleculeWorkflow(Workflow):
95
95
  return mode
96
96
 
97
97
 
98
+ class ProteinSequenceWorkflow(Workflow):
99
+ """
100
+ Base class for Workflows that operate on protein sequences.
101
+
102
+ :param initial_protein_sequences: protein sequences of interest
103
+ """
104
+
105
+ protein_sequences: list[str]
106
+
107
+
98
108
  class DBCalculation(Base):
99
109
  """Encodes a calculation that's in the database. This isn't terribly useful by itself."""
100
110
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stjames
3
- Version: 0.0.120
3
+ Version: 0.0.122
4
4
  Summary: standardized JSON atom/molecule encoding scheme
5
5
  Author-email: Corin Wagen <corin@rowansci.com>
6
6
  Project-URL: Homepage, https://github.com/rowansci/stjames
@@ -1,9 +1,9 @@
1
- stjames/__init__.py,sha256=i_vqziEdoBNXhD7Gjb2_1zLkSx0Ko1N8BnCk6No_T6A,522
1
+ stjames/__init__.py,sha256=eM4xm21MXF7RGJcwFEarw0LDz8r8haPhxxgOnCXhsgU,544
2
2
  stjames/_deprecated_solvent_settings.py,sha256=gj5j9p3zakIwSTK5_ndqBXJx--IzjZNxZ75z-wipLOo,450
3
3
  stjames/atom.py,sha256=RnlAgWsZZJEZnSBWCeoj6NtWht8mZTf4qDWfT_Ot05U,2704
4
4
  stjames/base.py,sha256=YhmNZqFdWYD_lCw8rD2fZtt17nh8g7lUFBnGMezB-u8,1837
5
5
  stjames/basis_set.py,sha256=wI3M2q9uPf9jhKpAi4E2DrsyKzloDGLRjAlk7krdYgc,949
6
- stjames/calculation.py,sha256=O2LwwQ_cOLmDOGXTHA9J71YbUZXigUSbvbLA-fSVm3w,915
6
+ stjames/calculation.py,sha256=jm3LvFzJl54yJQtfrqKvodAkZyAvgN3hMWAsWD4HMM8,1333
7
7
  stjames/compute_settings.py,sha256=wuYE6W4WqP3oFHwAeEp7XQ0oMz_MNLucWgrsuJ4kEFQ,268
8
8
  stjames/constraint.py,sha256=B6oV0rYjmAWr8gpi5f03gRy_uuqjUURVDVwoez5Cfbg,2442
9
9
  stjames/correction.py,sha256=ZVErCcj4TPyZeKrdvXVjHa0tFynsCaoy96QZUVxWFM8,413
@@ -17,7 +17,7 @@ stjames/pdb.py,sha256=6ayVUUdTufkXs_nfpRQuT1yGvymuyICB4L5Wh55OsaA,26507
17
17
  stjames/periodic_cell.py,sha256=eV_mArsY_MPEFSrFEsTC-CyCc6V8ITAXdk7yhjjNI7M,1080
18
18
  stjames/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  stjames/scf_settings.py,sha256=ecEVP3aKArNorpbP0mapnbc-EMjjzx4jeVW6q9tvqsw,436
20
- stjames/settings.py,sha256=qZ3yhuMIQNiLs8Z-uEyVReSg2IQAjnDzQ6euHHqE6xI,6128
20
+ stjames/settings.py,sha256=PGSNeNosl9OYLAZ3TGdWCN_4UwXI4qujJ5M9VWduE2o,6493
21
21
  stjames/solvent.py,sha256=flrGlwD4QavmXlIxeqlsiQv1F_PWyqBTKTDH9HjHdRg,1246
22
22
  stjames/status.py,sha256=KQHDqWSd4kBLow23YLcfOkFdtqN61RFZI-jf2zANWRY,501
23
23
  stjames/task.py,sha256=OLINRqe66o7t8arffilwmggrF_7TH0L79u6DhGruxV8,329
@@ -37,23 +37,24 @@ stjames/data/read_nist_isotopes.py,sha256=y10FNjW43QpC45qib7VHsIghEwT7GG5rsNwHdc
37
37
  stjames/data/symbol_element.json,sha256=vl_buFusTqBd-muYQtMLtTDLy2OtBI6KkBeqkaWRQrg,1186
38
38
  stjames/optimization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
39
  stjames/optimization/freezing_string_method.py,sha256=eEQBqbYHgJH9gVRLDIFtGuPcsHHMLAAt1hF3jtq70lo,2285
40
- stjames/workflows/__init__.py,sha256=GiSXuBCA2tE5eXHnVYJvjtoqX_zvCn8t0wpkvK1HEls,3438
40
+ stjames/workflows/__init__.py,sha256=wzLBi71MgMxlxRXw3N7feazCym6qNRJ8e4pRk3UXPHM,3520
41
41
  stjames/workflows/admet.py,sha256=qFUpCFiLW-3gzuEjCMNBJ6DEG_vquJcPAsN4SVZRfdE,1289
42
- stjames/workflows/basic_calculation.py,sha256=sAgHBcNHE72ZbZPB9vyZShALRC4zOVw6It6cpJlbX2A,911
42
+ stjames/workflows/basic_calculation.py,sha256=wIiq2lFRN4nxN0__X_JbPSeaUeJ4tKUyg6NaB1xqoEY,1079
43
43
  stjames/workflows/batch_docking.py,sha256=o-t5FkfLlbe60jX1_ZeqWSJJ5vsjEIbTa5GLN3ny_tk,1590
44
44
  stjames/workflows/bde.py,sha256=g_In-caftXiimrhfdptHjpfrYQUs3vF58qYmRnaTN8g,10825
45
45
  stjames/workflows/conformer.py,sha256=18aO6ngMBeGAmQkBdLGCCHr398RIYr1v2hD2IT1u4cc,3005
46
- stjames/workflows/conformer_search.py,sha256=1kBUT0yCcTPTCtxg1tlTKHRRXkfNYNqzla_89lDEL9k,15696
46
+ stjames/workflows/conformer_search.py,sha256=b3xbyFdulc8VLtk12a_v_zWaS_bkyi6cVVqNyTucD38,16544
47
47
  stjames/workflows/descriptors.py,sha256=T4tc7xdtBdxESGO86KR323jPQ2pgwxBqgV0khA6MEgQ,584
48
48
  stjames/workflows/docking.py,sha256=t30kqeFXQ0yrlqvN6Jdwt0SdfnJLDsfK-7yFi0gwNbY,4753
49
49
  stjames/workflows/double_ended_ts_search.py,sha256=ovJgEVFc6c3mijCE3TKAY70YvqNmAZ5Y4XgV4-tIxBI,3127
50
50
  stjames/workflows/electronic_properties.py,sha256=GT3-NC7w-dbcOJ-3AzJ7LgzH6frTbiH2Iyb9BCa-SvY,4112
51
- stjames/workflows/fukui.py,sha256=095GDGSSEc5PDD1aoKM8J7icgR5tfwS5Bs9XxFQHge4,2387
51
+ stjames/workflows/fukui.py,sha256=E9dfPnZzgwDR3J_8DdTTSwHcMPelyZxlLCmp_WA8UJo,2424
52
52
  stjames/workflows/hydrogen_bond_basicity.py,sha256=q9eXty68ZyCmrB6G_8bfeOT8Ui_IQquRPu6z-3rNreQ,1589
53
53
  stjames/workflows/ion_mobility.py,sha256=5vUjEYCnF9sN3dTqqEgWAq0jAfdoFvkLubemoXE8DLc,3125
54
54
  stjames/workflows/irc.py,sha256=ZP7icylW8rgo_Uh7h3bmyumn0ru1IyF-61nP5Jnmq3M,3402
55
55
  stjames/workflows/macropka.py,sha256=Krj0xXuB-u57Kqlf4bbRiHDUWCpliFr6YPiYqPmYaWk,3803
56
- stjames/workflows/molecular_dynamics.py,sha256=HqWNxxPSAphfI0DdbTERFkq8UeBjEvhnA_ETv0xw_RY,3522
56
+ stjames/workflows/molecular_dynamics.py,sha256=cgjede9TWf-eXRFeUcM59cyVQAhSduL6L0J0oMrX3xc,3543
57
+ stjames/workflows/msa.py,sha256=nK3KmPQv9Sr7yRjNfDWSXIgBrk3PnhvDYHnsVoqoS-M,773
57
58
  stjames/workflows/multistage_opt.py,sha256=UN-4WLsT2WEjO5KqDPrcCkb708Co-ZScHx3g2bto768,16597
58
59
  stjames/workflows/nmr.py,sha256=1QEF4SB6dWIr-jzLEZ7V972UnRUOTufOJSHwIGyV3dM,2681
59
60
  stjames/workflows/pka.py,sha256=i-jzl2lN0yRWc0tgrWSBCplITEByfRyEQrlUhjnzcBc,4580
@@ -61,14 +62,14 @@ stjames/workflows/pose_analysis_md.py,sha256=dpWVKC-8fPdw6ExIXk9xbeVBDUMUYQECpix
61
62
  stjames/workflows/protein_binder_design.py,sha256=KnPKQJTMrSO5xfw64Bh7T0wHck1NtysVwkVgHs1cGws,12013
62
63
  stjames/workflows/protein_cofolding.py,sha256=w7Sg_ttU4bcJb7wlVcI_AAsLM9WVAJcU5ucbNb5Iyzw,4326
63
64
  stjames/workflows/redox_potential.py,sha256=7S18t9Y3eynSnA3lZbRlvLfdbgeBopdiigLzt1zxg5c,3871
64
- stjames/workflows/scan.py,sha256=DXQBpa2t2PowAtOwmdgpxaSLq--fEShljzAGSb8Nf5U,2993
65
+ stjames/workflows/scan.py,sha256=lgpvrrFG03GWQj2tWeBqPQVYSCGLgYdnQsU9bAUZQok,3317
65
66
  stjames/workflows/solubility.py,sha256=lfCVvJjqEaddLUpK6WBxjB7u12Sci-K95A5_qIMkIRM,3028
66
67
  stjames/workflows/spin_states.py,sha256=0degmE-frovgoXweshZyjfjqL7nkbaFoO9YoJhvQnaI,4748
67
68
  stjames/workflows/strain.py,sha256=paYxDDQTB1eYP_c2kLVz1-QX7Vpw0LLb3ujnFin_SOM,1834
68
69
  stjames/workflows/tautomer.py,sha256=7eYKziGPg8Km6lfowTzSkgJfJ4SHUPrAmnTf8Bi-SB0,1164
69
- stjames/workflows/workflow.py,sha256=cYNP_tK1afJTscXJzYv5VGe8n2Est6PpthS268oRi1U,2494
70
- stjames-0.0.120.dist-info/licenses/LICENSE,sha256=i05z7xEhyrg6f8j0lR3XYjShnF-MJGFQ-DnpsZ8yiVI,1084
71
- stjames-0.0.120.dist-info/METADATA,sha256=G8ujY0SFUr28ySoupBKoRViks6v84Q5bepOSRES9EMc,1725
72
- stjames-0.0.120.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
73
- stjames-0.0.120.dist-info/top_level.txt,sha256=FYCwxl6quhYOAgG-mnPQcCK8vsVM7B8rIUrO-WrQ_PI,8
74
- stjames-0.0.120.dist-info/RECORD,,
70
+ stjames/workflows/workflow.py,sha256=nwSX-KO2J9Lgd_uNuoYxS1Lv8rZB-jmTfphb8KJODC8,2720
71
+ stjames-0.0.122.dist-info/licenses/LICENSE,sha256=i05z7xEhyrg6f8j0lR3XYjShnF-MJGFQ-DnpsZ8yiVI,1084
72
+ stjames-0.0.122.dist-info/METADATA,sha256=9McsAFJMWpw8ymFCC3VTRWKU6cXslDyZKGvTHt1u7Og,1725
73
+ stjames-0.0.122.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
74
+ stjames-0.0.122.dist-info/top_level.txt,sha256=FYCwxl6quhYOAgG-mnPQcCK8vsVM7B8rIUrO-WrQ_PI,8
75
+ stjames-0.0.122.dist-info/RECORD,,