[build-system] requires = ["setuptools>=77", "setuptools-scm>=8"] build-backend = "setuptools.build_meta" [tool.uv] required-version = ">=0.12.8" [project] name = "datamol" description = "A python library to work with molecules. Built on top of RDKit." authors = [{ name = "Hadrien Mary", email = "hadrien@valencediscovery.com" }] readme = "README.md" dynamic = ["version"] requires-python = ">=3.11" license = "Apache-2.0" license-files = ["LICENSE"] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: Healthcare Industry", "Intended Audience :: Science/Research", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Scientific/Engineering :: Bio-Informatics", "Topic :: Scientific/Engineering :: Information Analysis", "Topic :: Scientific/Engineering :: Medical Science Apps.", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", ] dependencies = [ "tqdm>=4.66", "loguru>=0.7", "joblib>=1.3", "fsspec[http]>=2023.9.2", "pandas>=2.2", "numpy>=1.26", "scipy>=1.11", "platformdirs>=4", "scikit-learn>=1.4", "packaging>=23.2", "rdkit>=2024.9.1", # I/O backends: cloud filesystems, Excel and Parquet. "gcsfs>=2024.3", "s3fs>=2024.3", "openpyxl>=3.1", "xlsxwriter>=3.2", "pyarrow>=15", # Visualization. "matplotlib>=3.8", "networkx>=3.2", "nglview>=3.1", "pillow>=10", # SELFIES conversion. "selfies>=2.1", ] [project.optional-dependencies] test = [ "ipykernel>=6.29", "ipywidgets>=8.1", "nbconvert>=7.16", "nbformat>=5.10", "pytest>=8", "pytest-cov>=6", "pytest-xdist>=3.6", ] docs = [ "markdown-include>=0.8.1", "mdx-truly-sane-lists>=1.3", "mike>=2", "mkdocs>=1.6", "mkdocs-jupyter>=0.25", "mkdocs-material>=9.5", "mkdocs-material-extensions>=1.3", "mkdocstrings[python]>=0.30", "seaborn>=0.13", ] dev = [ "black>=25", "build>=1.2", "mypy>=1.15", "pre-commit>=4", "pyright>=1.1.400", "ruff>=0.11", "twine>=6", ] [project.urls] Website = "https://datamol.io" "Source Code" = "https://github.com/datamol-io/datamol" "Bug Tracker" = "https://github.com/datamol-io/datamol/issues" Documentation = "https://docs.datamol.io" [tool.setuptools] include-package-data = true [tool.setuptools_scm] fallback_version = "0.0.0" [tool.setuptools.packages.find] where = ["."] include = ["datamol", "datamol.*"] exclude = [] namespaces = true [tool.setuptools.package-data] "datamol.data" = ["*"] [tool.black] line-length = 100 target-version = ['py311'] include = '\.pyi?$' [tool.pytest.ini_options] minversion = "8.0" addopts = "--verbose --cov=datamol --cov-fail-under=85 --cov-report xml --cov-report term --durations=10 -n auto" testpaths = ["tests"] markers = [ "integration: runs the executable tutorial suite", "notebook: executes a tutorial notebook", ] filterwarnings = [ "ignore::DeprecationWarning:rdkit.Chem.MolStandardize", "ignore::DeprecationWarning:jupyter_client", "ignore::DeprecationWarning:pkg_resources", "ignore::DeprecationWarning:joblib.externals.loky.backend", "ignore::DeprecationWarning:dateutil.tz.tz", "ignore::DeprecationWarning:joblib._utils", "ignore::DeprecationWarning:openpyxl.packaging.core", "ignore::DeprecationWarning:tqdm.std", ] [tool.coverage.run] source = ["datamol/"] disable_warnings = ["no-data-collected"] data_file = ".coverage/coverage" [tool.coverage.report] omit = ["datamol/__init__.py", "datamol/_version.py"] [tool.coverage.xml] output = "coverage.xml" [tool.mypy] exclude = [] ignore_missing_imports = true python_version = "3.11" [tool.pyright] reportShadowedImports = false [tool.ruff] line-length = 110 target-version = "py311" [tool.ruff.lint] select = ["E4", "E7", "E9", "F"] ignore = [ "E501", # Never enforce `E501` (line length violations). "E731", # Do not assign a lambda expression, use a def ] [tool.ruff.lint.per-file-ignores] "__init__.py" = [ "F401", # imported but unused "E402", # Module level import not at top of file ] [tool.ruff.lint.pycodestyle] max-doc-length = 150