cmxflow 0.1.0__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 (49) hide show
  1. cmxflow-0.1.0/LICENSE +21 -0
  2. cmxflow-0.1.0/PKG-INFO +187 -0
  3. cmxflow-0.1.0/README.md +164 -0
  4. cmxflow-0.1.0/pyproject.toml +62 -0
  5. cmxflow-0.1.0/src/cmxflow/__init__.py +21 -0
  6. cmxflow-0.1.0/src/cmxflow/block.py +357 -0
  7. cmxflow-0.1.0/src/cmxflow/cmxmol.py +124 -0
  8. cmxflow-0.1.0/src/cmxflow/mcp/__init__.py +11 -0
  9. cmxflow-0.1.0/src/cmxflow/mcp/server.py +1210 -0
  10. cmxflow-0.1.0/src/cmxflow/mcp/state.py +314 -0
  11. cmxflow-0.1.0/src/cmxflow/operators/__init__.py +34 -0
  12. cmxflow-0.1.0/src/cmxflow/operators/align.py +485 -0
  13. cmxflow-0.1.0/src/cmxflow/operators/base.py +91 -0
  14. cmxflow-0.1.0/src/cmxflow/operators/cluster.py +119 -0
  15. cmxflow-0.1.0/src/cmxflow/operators/confgen.py +222 -0
  16. cmxflow-0.1.0/src/cmxflow/operators/dedup.py +65 -0
  17. cmxflow-0.1.0/src/cmxflow/operators/dock/__init__.py +106 -0
  18. cmxflow-0.1.0/src/cmxflow/operators/dock/dock.py +267 -0
  19. cmxflow-0.1.0/src/cmxflow/operators/dock/ec.py +260 -0
  20. cmxflow-0.1.0/src/cmxflow/operators/dock/pose.py +836 -0
  21. cmxflow-0.1.0/src/cmxflow/operators/dock/score.py +628 -0
  22. cmxflow-0.1.0/src/cmxflow/operators/filter.py +507 -0
  23. cmxflow-0.1.0/src/cmxflow/operators/ionize.py +184 -0
  24. cmxflow-0.1.0/src/cmxflow/operators/method.py +145 -0
  25. cmxflow-0.1.0/src/cmxflow/operators/select.py +216 -0
  26. cmxflow-0.1.0/src/cmxflow/operators/sim2d.py +187 -0
  27. cmxflow-0.1.0/src/cmxflow/operators/sim3d.py +276 -0
  28. cmxflow-0.1.0/src/cmxflow/operators/standardize.py +98 -0
  29. cmxflow-0.1.0/src/cmxflow/opt/__init__.py +5 -0
  30. cmxflow-0.1.0/src/cmxflow/opt/optuna.py +225 -0
  31. cmxflow-0.1.0/src/cmxflow/parameter.py +197 -0
  32. cmxflow-0.1.0/src/cmxflow/scores/__init__.py +19 -0
  33. cmxflow-0.1.0/src/cmxflow/scores/automatic.py +310 -0
  34. cmxflow-0.1.0/src/cmxflow/scores/cluster.py +84 -0
  35. cmxflow-0.1.0/src/cmxflow/scores/shape.py +230 -0
  36. cmxflow-0.1.0/src/cmxflow/sinks/__init__.py +15 -0
  37. cmxflow-0.1.0/src/cmxflow/sinks/molecule.py +106 -0
  38. cmxflow-0.1.0/src/cmxflow/sinks/table.py +107 -0
  39. cmxflow-0.1.0/src/cmxflow/sinks/writer.py +57 -0
  40. cmxflow-0.1.0/src/cmxflow/sources/__init__.py +17 -0
  41. cmxflow-0.1.0/src/cmxflow/sources/molecule.py +58 -0
  42. cmxflow-0.1.0/src/cmxflow/sources/reader.py +121 -0
  43. cmxflow-0.1.0/src/cmxflow/sources/table.py +142 -0
  44. cmxflow-0.1.0/src/cmxflow/utils/__init__.py +20 -0
  45. cmxflow-0.1.0/src/cmxflow/utils/parallel.py +617 -0
  46. cmxflow-0.1.0/src/cmxflow/utils/pymol.py +65 -0
  47. cmxflow-0.1.0/src/cmxflow/utils/serial.py +213 -0
  48. cmxflow-0.1.0/src/cmxflow/utils/text.py +244 -0
  49. cmxflow-0.1.0/src/cmxflow/workflow.py +263 -0
cmxflow-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Benjmain J. Shields
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
cmxflow-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,187 @@
1
+ Metadata-Version: 2.4
2
+ Name: cmxflow
3
+ Version: 0.1.0
4
+ Summary: A Python package for building and optimizing cheminformatics workflows using Bayesian optimization and LLM agents
5
+ License-File: LICENSE
6
+ Author: Benjamin J. Shields
7
+ Requires-Python: >=3.10,<4.0
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.10
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Classifier: Programming Language :: Python :: 3.13
13
+ Classifier: Programming Language :: Python :: 3.14
14
+ Requires-Dist: dimorphite-dl
15
+ Requires-Dist: fastmcp (>=2.0,<3.0)
16
+ Requires-Dist: optuna (>=3.0,<4.0)
17
+ Requires-Dist: pandas (>=2.0,<3.0)
18
+ Requires-Dist: pyarrow
19
+ Requires-Dist: rdkit (>=2025.4,<2026.0)
20
+ Requires-Dist: scikit-learn (>=1.7,<2.0)
21
+ Description-Content-Type: text/markdown
22
+
23
+ # cmxflow ๐Ÿงช
24
+
25
+ [![Docs](https://img.shields.io/badge/docs-b--shields.github.io%2Fcmxflow-teal)](https://b-shields.github.io/cmxflow/)
26
+ [![CI](https://github.com/b-shields/cmxflow/actions/workflows/ci.yml/badge.svg)](https://github.com/b-shields/cmxflow/actions/workflows/ci.yml)
27
+ [![codecov](https://codecov.io/gh/b-shields/cmxflow/branch/main/graph/badge.svg)](https://codecov.io/gh/b-shields/cmxflow)
28
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)]()
29
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
30
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
31
+
32
+ Composable cheminformatics workflows with Bayesian optimization.
33
+
34
+ ## Overview ๐Ÿ”ฌ
35
+
36
+ **cmxflow** is a Python framework for building and optimizing cheminformatics pipelines. Chain together molecular operations as blocks, then let Bayesian optimization find the best parameters for your task.
37
+
38
+ **[Read the full documentation &rarr;](https://b-shields.github.io/cmxflow/)**
39
+
40
+ ### Two Usage Modes โš—๏ธ
41
+
42
+ cmxflow is designed to work both as:
43
+
44
+ 1. **An Agentic Tool** - via MCP (Model Context Protocol) server, allowing LLM agents to build and optimize workflows conversationally
45
+ 2. **A Programmatic API** - for direct Python usage in scripts and notebooks
46
+
47
+ ## Block Types ๐Ÿงฌ
48
+
49
+ Workflows are built from four types of blocks:
50
+
51
+ | Block Type | Purpose |
52
+ |------------|---------|
53
+ | **SourceBlock** | Read molecules from files (SDF, SMILES, CSV, Parquet) |
54
+ | **Block** | Transform molecules (1:1 or N:M) |
55
+ | **SinkBlock** | Write molecules to files |
56
+ | **ScoreBlock** | Compute optimization objective |
57
+
58
+ ### Example Operators ๐Ÿ’Š
59
+
60
+ | Block | Purpose |
61
+ |-------|---------|
62
+ | `MoleculeStandardizeBlock` | Standardize molecules (metals, salts, charges, tautomers) |
63
+ | `MoleculeDeduplicateBlock` | Remove duplicate molecules by canonical SMILES |
64
+ | `RDKitBlock` | Apply any RDKit method (descriptors, transformations) |
65
+ | `SubstructureFilterBlock` | Filter by SMARTS patterns or catalogs (PAINS, BRENK, etc.) |
66
+ | `PropertyFilterBlock` | Filter molecules by property conditions |
67
+ | `PropertyHeadBlock` | Select top N molecules by property |
68
+ | `PropertyTailBlock` | Select bottom N molecules by property |
69
+ | `MoleculeSimilarityBlock` | Compute 2D fingerprint similarity |
70
+ | `Molecule3DSimilarityBlock` | Compute 3D shape similarity |
71
+ | `IonizeMoleculeBlock` | Generate pH-dependent ionization states |
72
+ | `EnumerateStereoBlock` | Enumerate all stereoisomers |
73
+ | `ConformerGenerationBlock` | Generate 3D conformers (ETKDGv3) |
74
+ | `MoleculeAlignBlock` | Align molecules to 3D reference |
75
+ | `MoleculeDockBlock` | Dock into protein binding pocket |
76
+ | `RepresentativeClusterBlock` | Cluster molecules by fingerprint similarity (leader algorithm) |
77
+
78
+ ### Example Score Blocks ๐Ÿ“Š
79
+
80
+ | ScoreBlock | Purpose |
81
+ |------------|---------|
82
+ | `EnrichmentScoreBlock` | Enrichment AUC for virtual screening |
83
+ | `AverageScoreBlock` | Mean of a molecular property |
84
+ | `ShapeOverlayScoreBlock` | Average 3D shape similarity |
85
+ | `ClusterScoreBlock` | Cluster quality from representative clustering |
86
+
87
+ ## Features ๐Ÿš€
88
+
89
+ - **Composable Pipelines** - Chain blocks with `workflow.add()`
90
+ - **Bayesian Optimization** - Find optimal parameters via Optuna
91
+ - **Parallel Execution** - `make_parallel()` for compute-intensive blocks
92
+ - **Mutable Parameters** - Categorical, Integer, and Continuous types
93
+ - **Serialization** - `save_workflow()` and `load_workflow()` for persistence
94
+ - **MCP Server** - Agentic workflow building via `build_workflow`, `run_workflow`, `optimize_workflow`
95
+
96
+ ## Environment Variables ๐Ÿ”ง
97
+
98
+ | Variable | Default | Description |
99
+ |----------|---------|-------------|
100
+ | `CMXFLOW_WORKER_TIMEOUT` | `30` | Seconds to wait for a single parallel worker before treating it as failed. Set to `0` to disable the timeout. Applies to all `make_parallel()` and `@parallel` blocks. |
101
+
102
+ ## Getting Started ๐Ÿ“–
103
+
104
+ See [`examples/basic_usage.ipynb`](examples/basic_usage.ipynb) for a complete tutorial covering:
105
+
106
+ - Building your first workflow
107
+ - 2D similarity search
108
+ - Mutable parameters and optimization
109
+ - Parallel execution
110
+ - Analyzing results with Optuna
111
+
112
+ The tutorial uses the ABL1 kinase benchmark from the wonderful [DUD-E](http://dude.docking.org/) database.
113
+
114
+ ## Installation ๐Ÿ› ๏ธ
115
+
116
+ ```bash
117
+ pip install cmxflow
118
+ ```
119
+
120
+ ### MCP Server
121
+
122
+ To use cmxflow as an agentic tool with Claude Code:
123
+
124
+ ```bash
125
+ claude mcp add cmxflow -- cmxflow-mcp
126
+ ```
127
+
128
+ ### Optional Dependencies
129
+
130
+ **PyMOL** โ€” Required only for 3D structure visualization (`view_structures` MCP tool). Install via conda:
131
+
132
+ ```bash
133
+ conda install -c conda-forge pymol-open-source
134
+ ```
135
+
136
+ All other functionality works without PyMOL.
137
+
138
+ ## Contributing ๐Ÿค
139
+
140
+ Contributions are welcome! This is a side project, so reviews may take some time, but PRs are appreciated.
141
+
142
+ ### Before Submitting
143
+
144
+ 1. **Open an issue first** for significant changes to discuss the approach
145
+ 2. **Fork the repo** and create a feature branch from `main`
146
+ 3. **Follow the code style** - run `mypy`, `black`, and `ruff` before committing (or install provided precommit hooks)
147
+
148
+ ### PR Requirements
149
+
150
+ - **Clear description** of the bug fixed or feature added
151
+ - **Minimal reproducible example** demonstrating the change
152
+ - **Tests** covering new functionality (`pytest`)
153
+ - **Type hints** for all new code
154
+ - **Docstrings** following Google conventions
155
+
156
+ ### Development Setup
157
+
158
+ ```bash
159
+ conda config --set solver libmamba
160
+ conda env create -f conda.yml
161
+ conda activate cmxflow
162
+ poetry install
163
+ pre-commit install # Ensures formatting/linting on commit
164
+ ```
165
+
166
+ ### Running Tests
167
+
168
+ ```bash
169
+ pytest tests/
170
+ ```
171
+
172
+ ## Releases
173
+
174
+ Releases are published to PyPI automatically when a pull request is merged into `main` with a version bump tag in the PR title:
175
+
176
+ | Tag in PR title | Version bump | Example |
177
+ |---|---|---|
178
+ | `[patch]` | Bug fixes, docs (0.1.0 โ†’ 0.1.1) | `Fix conformer bug [patch]` |
179
+ | `[minor]` | New features, backwards-compatible (0.1.0 โ†’ 0.2.0) | `Add ProtonationBlock [minor]` |
180
+ | `[major]` | Breaking changes (0.1.0 โ†’ 1.0.0) | `Redesign block API [major]` |
181
+
182
+ PRs without a tag merge normally without triggering a release.
183
+
184
+ ## License ๐Ÿ“„
185
+
186
+ MIT
187
+
@@ -0,0 +1,164 @@
1
+ # cmxflow ๐Ÿงช
2
+
3
+ [![Docs](https://img.shields.io/badge/docs-b--shields.github.io%2Fcmxflow-teal)](https://b-shields.github.io/cmxflow/)
4
+ [![CI](https://github.com/b-shields/cmxflow/actions/workflows/ci.yml/badge.svg)](https://github.com/b-shields/cmxflow/actions/workflows/ci.yml)
5
+ [![codecov](https://codecov.io/gh/b-shields/cmxflow/branch/main/graph/badge.svg)](https://codecov.io/gh/b-shields/cmxflow)
6
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)]()
7
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
9
+
10
+ Composable cheminformatics workflows with Bayesian optimization.
11
+
12
+ ## Overview ๐Ÿ”ฌ
13
+
14
+ **cmxflow** is a Python framework for building and optimizing cheminformatics pipelines. Chain together molecular operations as blocks, then let Bayesian optimization find the best parameters for your task.
15
+
16
+ **[Read the full documentation &rarr;](https://b-shields.github.io/cmxflow/)**
17
+
18
+ ### Two Usage Modes โš—๏ธ
19
+
20
+ cmxflow is designed to work both as:
21
+
22
+ 1. **An Agentic Tool** - via MCP (Model Context Protocol) server, allowing LLM agents to build and optimize workflows conversationally
23
+ 2. **A Programmatic API** - for direct Python usage in scripts and notebooks
24
+
25
+ ## Block Types ๐Ÿงฌ
26
+
27
+ Workflows are built from four types of blocks:
28
+
29
+ | Block Type | Purpose |
30
+ |------------|---------|
31
+ | **SourceBlock** | Read molecules from files (SDF, SMILES, CSV, Parquet) |
32
+ | **Block** | Transform molecules (1:1 or N:M) |
33
+ | **SinkBlock** | Write molecules to files |
34
+ | **ScoreBlock** | Compute optimization objective |
35
+
36
+ ### Example Operators ๐Ÿ’Š
37
+
38
+ | Block | Purpose |
39
+ |-------|---------|
40
+ | `MoleculeStandardizeBlock` | Standardize molecules (metals, salts, charges, tautomers) |
41
+ | `MoleculeDeduplicateBlock` | Remove duplicate molecules by canonical SMILES |
42
+ | `RDKitBlock` | Apply any RDKit method (descriptors, transformations) |
43
+ | `SubstructureFilterBlock` | Filter by SMARTS patterns or catalogs (PAINS, BRENK, etc.) |
44
+ | `PropertyFilterBlock` | Filter molecules by property conditions |
45
+ | `PropertyHeadBlock` | Select top N molecules by property |
46
+ | `PropertyTailBlock` | Select bottom N molecules by property |
47
+ | `MoleculeSimilarityBlock` | Compute 2D fingerprint similarity |
48
+ | `Molecule3DSimilarityBlock` | Compute 3D shape similarity |
49
+ | `IonizeMoleculeBlock` | Generate pH-dependent ionization states |
50
+ | `EnumerateStereoBlock` | Enumerate all stereoisomers |
51
+ | `ConformerGenerationBlock` | Generate 3D conformers (ETKDGv3) |
52
+ | `MoleculeAlignBlock` | Align molecules to 3D reference |
53
+ | `MoleculeDockBlock` | Dock into protein binding pocket |
54
+ | `RepresentativeClusterBlock` | Cluster molecules by fingerprint similarity (leader algorithm) |
55
+
56
+ ### Example Score Blocks ๐Ÿ“Š
57
+
58
+ | ScoreBlock | Purpose |
59
+ |------------|---------|
60
+ | `EnrichmentScoreBlock` | Enrichment AUC for virtual screening |
61
+ | `AverageScoreBlock` | Mean of a molecular property |
62
+ | `ShapeOverlayScoreBlock` | Average 3D shape similarity |
63
+ | `ClusterScoreBlock` | Cluster quality from representative clustering |
64
+
65
+ ## Features ๐Ÿš€
66
+
67
+ - **Composable Pipelines** - Chain blocks with `workflow.add()`
68
+ - **Bayesian Optimization** - Find optimal parameters via Optuna
69
+ - **Parallel Execution** - `make_parallel()` for compute-intensive blocks
70
+ - **Mutable Parameters** - Categorical, Integer, and Continuous types
71
+ - **Serialization** - `save_workflow()` and `load_workflow()` for persistence
72
+ - **MCP Server** - Agentic workflow building via `build_workflow`, `run_workflow`, `optimize_workflow`
73
+
74
+ ## Environment Variables ๐Ÿ”ง
75
+
76
+ | Variable | Default | Description |
77
+ |----------|---------|-------------|
78
+ | `CMXFLOW_WORKER_TIMEOUT` | `30` | Seconds to wait for a single parallel worker before treating it as failed. Set to `0` to disable the timeout. Applies to all `make_parallel()` and `@parallel` blocks. |
79
+
80
+ ## Getting Started ๐Ÿ“–
81
+
82
+ See [`examples/basic_usage.ipynb`](examples/basic_usage.ipynb) for a complete tutorial covering:
83
+
84
+ - Building your first workflow
85
+ - 2D similarity search
86
+ - Mutable parameters and optimization
87
+ - Parallel execution
88
+ - Analyzing results with Optuna
89
+
90
+ The tutorial uses the ABL1 kinase benchmark from the wonderful [DUD-E](http://dude.docking.org/) database.
91
+
92
+ ## Installation ๐Ÿ› ๏ธ
93
+
94
+ ```bash
95
+ pip install cmxflow
96
+ ```
97
+
98
+ ### MCP Server
99
+
100
+ To use cmxflow as an agentic tool with Claude Code:
101
+
102
+ ```bash
103
+ claude mcp add cmxflow -- cmxflow-mcp
104
+ ```
105
+
106
+ ### Optional Dependencies
107
+
108
+ **PyMOL** โ€” Required only for 3D structure visualization (`view_structures` MCP tool). Install via conda:
109
+
110
+ ```bash
111
+ conda install -c conda-forge pymol-open-source
112
+ ```
113
+
114
+ All other functionality works without PyMOL.
115
+
116
+ ## Contributing ๐Ÿค
117
+
118
+ Contributions are welcome! This is a side project, so reviews may take some time, but PRs are appreciated.
119
+
120
+ ### Before Submitting
121
+
122
+ 1. **Open an issue first** for significant changes to discuss the approach
123
+ 2. **Fork the repo** and create a feature branch from `main`
124
+ 3. **Follow the code style** - run `mypy`, `black`, and `ruff` before committing (or install provided precommit hooks)
125
+
126
+ ### PR Requirements
127
+
128
+ - **Clear description** of the bug fixed or feature added
129
+ - **Minimal reproducible example** demonstrating the change
130
+ - **Tests** covering new functionality (`pytest`)
131
+ - **Type hints** for all new code
132
+ - **Docstrings** following Google conventions
133
+
134
+ ### Development Setup
135
+
136
+ ```bash
137
+ conda config --set solver libmamba
138
+ conda env create -f conda.yml
139
+ conda activate cmxflow
140
+ poetry install
141
+ pre-commit install # Ensures formatting/linting on commit
142
+ ```
143
+
144
+ ### Running Tests
145
+
146
+ ```bash
147
+ pytest tests/
148
+ ```
149
+
150
+ ## Releases
151
+
152
+ Releases are published to PyPI automatically when a pull request is merged into `main` with a version bump tag in the PR title:
153
+
154
+ | Tag in PR title | Version bump | Example |
155
+ |---|---|---|
156
+ | `[patch]` | Bug fixes, docs (0.1.0 โ†’ 0.1.1) | `Fix conformer bug [patch]` |
157
+ | `[minor]` | New features, backwards-compatible (0.1.0 โ†’ 0.2.0) | `Add ProtonationBlock [minor]` |
158
+ | `[major]` | Breaking changes (0.1.0 โ†’ 1.0.0) | `Redesign block API [major]` |
159
+
160
+ PRs without a tag merge normally without triggering a release.
161
+
162
+ ## License ๐Ÿ“„
163
+
164
+ MIT
@@ -0,0 +1,62 @@
1
+ [tool.poetry]
2
+ name = "cmxflow"
3
+ version = "0.1.0"
4
+ description = "A Python package for building and optimizing cheminformatics workflows using Bayesian optimization and LLM agents"
5
+ authors = ["Benjamin J. Shields"]
6
+ readme = "README.md"
7
+ packages = [{include = "cmxflow", from = "src"}]
8
+
9
+ [tool.poetry.dependencies]
10
+ python = "^3.10"
11
+ rdkit = "^2025.4"
12
+ pandas = "^2.0"
13
+ pyarrow = "*"
14
+ scikit-learn = "^1.7"
15
+ optuna = "^3.0"
16
+ dimorphite-dl = "*"
17
+ fastmcp = "^2.0"
18
+
19
+ [tool.poetry.scripts]
20
+ cmxflow-mcp = "cmxflow.mcp:run"
21
+
22
+ [tool.poetry.group.dev.dependencies]
23
+ pytest = "^8.0"
24
+ pytest-cov = "^6.0"
25
+ black = "^24.0"
26
+ ruff = "^0.4"
27
+ mypy = "^1.10"
28
+ pre-commit = "^4.0"
29
+
30
+ [tool.poetry.group.docs.dependencies]
31
+ mkdocs-material = "^9.0"
32
+ mkdocstrings = {extras = ["python"], version = "^0.27"}
33
+
34
+ [build-system]
35
+ requires = ["poetry-core"]
36
+ build-backend = "poetry.core.masonry.api"
37
+
38
+ [tool.black]
39
+ line-length = 88
40
+
41
+ [tool.ruff]
42
+ line-length = 88
43
+
44
+ [tool.ruff.lint]
45
+ select = ["E", "F", "I", "W"]
46
+
47
+ [tool.mypy]
48
+ python_version = "3.10"
49
+ warn_return_any = true
50
+ warn_unused_configs = true
51
+ ignore_missing_imports = true
52
+
53
+ # rdkit stubs are incomplete โ€” suppress false positives from stub mismatches
54
+ [[tool.mypy.overrides]]
55
+ module = [
56
+ "cmxflow.cmxmol",
57
+ "cmxflow.sinks.molecule",
58
+ "cmxflow.operators.confgen",
59
+ "cmxflow.operators.dock.ec",
60
+ "cmxflow.operators.dock.dock",
61
+ ]
62
+ disable_error_code = ["override", "assignment", "no-any-return", "attr-defined"]
@@ -0,0 +1,21 @@
1
+ """cmxflow: Automated cheminformatics workflow optimization."""
2
+
3
+ from cmxflow.block import Block, BlockBase, SinkBlock, SourceBlock
4
+ from cmxflow.cmxmol import Mol, unwrap_mol, wrap_mol
5
+ from cmxflow.utils.serial import load_workflow, save_workflow
6
+ from cmxflow.workflow import Workflow, WorkflowValidationError
7
+
8
+ __version__ = "0.1.0"
9
+ __all__ = [
10
+ "Block",
11
+ "BlockBase",
12
+ "Mol",
13
+ "SinkBlock",
14
+ "SourceBlock",
15
+ "Workflow",
16
+ "WorkflowValidationError",
17
+ "load_workflow",
18
+ "save_workflow",
19
+ "unwrap_mol",
20
+ "wrap_mol",
21
+ ]