File size: 4,433 Bytes
ab9bea9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
[project]
name = "morph"
version = "0.1.0"
description = "Flow-matching molecular generation and scaffold decoration with a molecular DiT"
readme = "README.md"
keywords = ["molecular-generation", "flow-matching", "scaffold-decoration"]
requires-python = ">=3.11"
dependencies = [
    "click>=8.3.1",
    "hydra-core>=1.3.2",
    "lightning>=2.5.5",
    "omegaconf>=2.3.0",
    "numpy>=2.0",
    "pandas>=2.3.3",
    "rdkit>=2025.9.1",
    "scipy>=1.15.0",
    # Pre-release allowed: the NVIDIA 25.10 container ships a CUDA-enabled
    # 2.9.0a0 build. Preserve that container build instead of replacing it with
    # a mismatched PyPI Torch/torchvision pair.
    "torch>=2.9.0a0, <2.9.1",
    "torch-geometric>=2.7.0",
    "torchmetrics>=1.8.0",
    "wandb>=0.22.2",
    "posebusters>=0.6.0",
    "matplotlib>=3.10.8",
    "lmdb>=2.2.0",
    "py3dmol>=2.5.4",
    "ipykernel>=7.2.0",
    "ase>=3.28.0",
]

[dependency-groups]
dev = ["pytest>=9.1.1", "ruff>=0.16.5"]

[project.optional-dependencies]
flash-attn = ["flash-attn>=2.8.3, <2.8.4"]

[project.scripts]
morph = "morph.cli:cli"

[tool.uv.extra-build-dependencies]
flash-attn = [{ requirement = "torch", match-runtime = true }]

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build.targets.wheel]
packages = ["src/morph"]

[tool.hatch.build.targets.wheel.force-include]
"configs" = "morph/configs"

[tool.ruff]
# Allow lines to be as long as 88.
line-length = 88
# Keep attributed third-party implementations close to their upstream sources.
extend-exclude = ["src/morph/_vendor"]

[tool.ruff.format]
docstring-code-format = true

# Correctness, readability, and public API documentation.
[tool.ruff.lint]
# consider selecting "ISC", for implicit string concat
# consider selecting "T201", for print in production code
select = [
    "B",    # flake8-bugbear
    "C4",   # flake8-comprehensions
    "D",    # pydocstyle
    "E",    # pycodestyle error
    "E501", # line too long
    "EXE",  # flake8-executable
    "F",    # pyflakes
    "FLY",  # flynt
    "I",    # isort
    "ICN",  # flake8-import-conventions
    "PD",   # pandas-vet
    "PERF", # perflint
    "PIE",  # flake8-pie
    "PL",   # pylint
    "PT",   # flake8-pytest-style
    "PYI",  # flakes8-pyi
    "Q",    # flake8-quotes
    "RSE",  # flake8-raise
    "RUF",  # Ruff-specific rules
    "SIM",  # flake8-simplify
    "SLOT", # flakes8-slot
    "TCH",  # flake8-type-checking
    "TID",  # flake8-tidy-imports
    "UP",   # pyupgrade
    "W",    # pycodestyle warning
    "W505", # line too long
    "YTT",  # flake8-2020
]
# also consider ignoring "C901", for high mccabe function complexity
# also consider ignoring "ERA001", for found commented out code
ignore = [
    "EXE002",   # shebang is not a python interpreter
    "RUF012",  # missing classvar type
    "RUF013",  # Optional prohibited by PEP484
    "B006",    # Do not use mutable data structures for argument defaults
    "ANN003",  # missing type annotations for kwargs
    "B019",    # Use of functools.lru_cache on methods can lead to memory leaks
    "C408",    # unnecessary-collection-call
    "COM812",  # trailing comma missing
    "D205",    # 1 blank line required between summary line and description
    "D415",    # first line of docstring must end with punctuation
    "DTZ005",  # use of datetime.now() without timezone
    "E731",    # do not assign a lambda expression, use a def
    "EM",      # flake8-errmsg
    "FBT001",  # Boolean positional argument in function
    "FBT002",  # Boolean keyword argument in function
    "NPY002",  # TODO replace legacy np.random.seed
    "PLR",     # pylint refactor
    "PLW2901", # Outer for loop variable overwritten by inner assignment target
    "PT006",   # pytest-parametrize-names-wrong-type
    "PT011",   # pytest-raises-too-broad
    "PT013",   # pytest-incorrect-pytest-import
    "PT019",   # pytest-fixture-param-without-value
    "PTH",     # prefer Path to os.path
    "S301",    # pickle can be unsafe
    "S310",    # url open functions can be unsafe
    "TRY003",  # long exception messages not defined in the exception class itself
    "UP015",   # unnecessary "r" in open call
    "D107",    # docstring for __init__ 
    "D212",    # remove whitespace after opening quotes
    "D202",    # no blank lines after docstring
    "D301", 
    "D100",
    "D103",
]
pydocstyle.convention = "google"

[env]
PROJECT_ROOT = "."