From 8a162f4c4264748440db7be01fbea128d28a87c9 Mon Sep 17 00:00:00 2001 From: Alex Maldonado Date: Thu, 28 Mar 2024 22:47:54 -0400 Subject: [PATCH 1/3] Add new framework --- .editorconfig | 36 + .github/ISSUE_TEMPLATE/bug_report.md | 42 + .github/ISSUE_TEMPLATE/config.yml | 3 + .github/ISSUE_TEMPLATE/feature_request.md | 23 + .github/ISSUE_TEMPLATE/question.md | 25 + .github/PULL_REQUEST_TEMPLATE.md | 29 + .github/release-drafter.yml | 28 + .github/workflows/build.yml | 43 + .github/workflows/codecov.yml | 49 + .github/workflows/deploy-docs.yml | 71 + .github/workflows/linter.yml | 41 + .gitignore | 122 +- .markdownlint.yaml | 20 + .pre-commit-config.yaml | 31 + CHANGELOG.md | 128 +- CODE_OF_CONDUCT.md | 105 + CONTRIBUTORS.md | 17 +- LICENSE.md | 208 + LICENSE.txt | 157 - Makefile | 194 + README.md | 46 +- __init__.py | 1 - conda-lock.yml | 4739 +++++++++++++++++ docs/.overrides/main.html | 1 + docs/.pages | 3 + docs/css/base.css | 5 + docs/css/colors.css | 134 + docs/css/mkdocstrings.css | 27 + docs/gen_ref_pages.py | 36 + docs/index.md | 1 + docs/js/mathjax-config.js | 19 + environment.yml | 11 + gypsum_dl/MolContainer.py | 4 +- gypsum_dl/MolObjectHandling.py | 3 +- gypsum_dl/MyMol.py | 24 +- gypsum_dl/Parallelizer.py | 9 +- gypsum_dl/Start.py | 16 +- gypsum_dl/Steps/IO/LoadFiles.py | 1 + gypsum_dl/Steps/IO/ProcessOutput.py | 6 +- gypsum_dl/Steps/IO/SaveToPDB.py | 5 +- gypsum_dl/Steps/IO/SaveToSDF.py | 1 + gypsum_dl/Steps/IO/Web2DOutput.py | 8 +- gypsum_dl/Steps/IO/__init__.py | 6 +- gypsum_dl/Steps/SMILES/AddHydrogens.py | 7 +- gypsum_dl/Steps/SMILES/DeSaltOrigSmiles.py | 4 +- gypsum_dl/Steps/SMILES/DurrantLabFilter.py | 2 +- gypsum_dl/Steps/SMILES/EnumerateChiralMols.py | 6 +- .../Steps/SMILES/EnumerateDoubleBonds.py | 8 +- gypsum_dl/Steps/SMILES/MakeTautomers.py | 6 +- gypsum_dl/Steps/SMILES/PrepareSmiles.py | 6 +- gypsum_dl/Steps/SMILES/__init__.py | 3 +- .../Steps/SMILES/dimorphite_dl/CHANGES.md | 46 +- .../SMILES/dimorphite_dl/CONTRIBUTORS.md | 10 +- .../Steps/SMILES/dimorphite_dl/LICENSE.txt | 4 +- .../Steps/SMILES/dimorphite_dl/README.md | 16 +- .../SMILES/dimorphite_dl/dimorphite_dl.py | 20 +- gypsum_dl/Steps/SMILES/site_structures.smarts | 2 +- gypsum_dl/Steps/ThreeD/Convert2DTo3D.py | 3 +- ...GenerateAlternate3DNonaromaticRingConfs.py | 4 +- gypsum_dl/Steps/ThreeD/Minimize3D.py | 2 +- gypsum_dl/Steps/ThreeD/__init__.py | 3 +- gypsum_dl/Steps/__init__.py | 5 +- gypsum_dl/Test/Tester.py | 3 +- gypsum_dl/Utils.py | 4 +- gypsum_dl/__init__.py | 3 +- gypsum_dl/molvs/CHANGELOG.md | 28 +- gypsum_dl/molvs/__init__.py | 27 +- gypsum_dl/molvs/charge.py | 160 +- gypsum_dl/molvs/cli.py | 89 +- gypsum_dl/molvs/errors.py | 5 +- gypsum_dl/molvs/fragment.py | 180 +- gypsum_dl/molvs/metal.py | 24 +- gypsum_dl/molvs/normalize.py | 124 +- gypsum_dl/molvs/resonance.py | 30 +- gypsum_dl/molvs/standardize.py | 63 +- gypsum_dl/molvs/tautomer.py | 251 +- gypsum_dl/molvs/utils.py | 8 +- gypsum_dl/molvs/validate.py | 19 +- gypsum_dl/molvs/validations.py | 54 +- gypsum_dl/run.py | 307 ++ poetry.lock | 2223 ++++++++ pyproject.toml | 264 + run_gypsum_dl.py | 307 -- tests/conftest.py | 12 + tests/test_example.py | 2 + 85 files changed, 9730 insertions(+), 1092 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/question.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/release-drafter.yml create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/codecov.yml create mode 100644 .github/workflows/deploy-docs.yml create mode 100644 .github/workflows/linter.yml create mode 100644 .markdownlint.yaml create mode 100644 .pre-commit-config.yaml create mode 100644 CODE_OF_CONDUCT.md create mode 100644 LICENSE.md delete mode 100644 LICENSE.txt create mode 100644 Makefile delete mode 100755 __init__.py create mode 100644 conda-lock.yml create mode 100644 docs/.overrides/main.html create mode 100644 docs/.pages create mode 100644 docs/css/base.css create mode 100644 docs/css/colors.css create mode 100644 docs/css/mkdocstrings.css create mode 100644 docs/gen_ref_pages.py create mode 100644 docs/index.md create mode 100644 docs/js/mathjax-config.js create mode 100644 environment.yml create mode 100755 gypsum_dl/run.py create mode 100644 poetry.lock create mode 100644 pyproject.toml delete mode 100755 run_gypsum_dl.py create mode 100644 tests/conftest.py create mode 100644 tests/test_example.py diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..5973eb7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,36 @@ +# Check http://editorconfig.org for more information + +root = true + +[*] +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 +end_of_line = lf + +[*.{py, pyi}] +indent_style = space +indent_size = 4 + +[*.bat] +indent_style = tab +end_of_line = crlf + +[Makefile] +indent_style = tab + +[*.{yml, yaml}] +indent_size = 2 +trim_trailing_whitespace = true + +[*.md] +indent_size = 4 +trim_trailing_whitespace = true + +[LICENSE] +insert_final_newline = false + +[*.{diff,patch}] +trim_trailing_whitespace = false diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..45831b1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,42 @@ +--- +name: 🐛 Bug report +about: If something isn't working 🔧 +title: '' +labels: bug +assignees: +--- + +## Bug Report + + + +## How To Reproduce + +Steps to reproduce the behavior: + +1. ... + +### Code sample + + + +### Environment + +- OS: [e.g. Linux / Windows / macOS] +- Python version, get it with: + +```bash +python --version +``` + +### Screenshots + + + +## Expected behavior + + + +## Additional context + + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..8f2da54 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,3 @@ +# Configuration: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository + +blank_issues_enabled: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..f17ec5a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,23 @@ +--- +name: 🚀 Feature request +about: Suggest an idea for this project 🏖 +title: '' +labels: enhancement +assignees: +--- + +## Feature Request + + + +## Motivation + + + +## Alternatives + + + +## Additional context + + diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..4ee5648 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,25 @@ +--- +name: ❓ Question +about: Ask a question about this project 🎓 +title: '' +labels: question +assignees: +--- + +## Checklist + + + +- [ ] I've searched the project's [`issues`](https://github.com/durrantlab/gypsum_dl/issues?q=is%3Aissue). + +## Question + + + +How can I [...]? + +Is it possible to [...]? + +## Additional context + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..9399b0e --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,29 @@ +## Description + + + +## Related Issue + + + +## Type of Change + + + +- [ ] 📚 Examples / docs / tutorials / dependencies update +- [ ] 🔧 Bug fix (non-breaking change which fixes an issue) +- [ ] 🥂 Improvement (non-breaking change which improves an existing feature) +- [ ] 🚀 New feature (non-breaking change which adds functionality) +- [ ] 💥 Breaking change (fix or feature that would cause existing functionality to change) +- [ ] 🔐 Security fix + +## Checklist + + + +- [ ] I have updated the code style using `make codestyle`. +- [ ] I have performed a self-review of my code. +- [ ] I have written tests for all new methods and classes that I created. +- [ ] New and existing unit tests pass locally with my changes. +- [ ] I have written the docstring in `NumPy` format for all the methods and classes that I used. +- [ ] I have made corresponding changes to the documentation. diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 0000000..adab82d --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,28 @@ +# Release drafter configuration https://github.com/release-drafter/release-drafter#configuration +# Emojis were chosen to match the https://gitmoji.carloscuesta.me/ + +name-template: "v$NEXT_PATCH_VERSION" +tag-template: "v$NEXT_PATCH_VERSION" + +categories: + - title: ":rocket: Features" + labels: [enhancement, feature] + - title: ":wrench: Fixes & Refactoring" + labels: [bug, refactoring, bugfix, fix] + - title: ":package: Build System & CI/CD" + labels: [build, ci, testing] + - title: ":boom: Breaking Changes" + labels: [breaking] + - title: ":pencil: Documentation" + labels: [documentation] + - title: ":arrow_up: Dependencies updates" + labels: [dependencies] + +template: | + ## What's Changed + + $CHANGES + + ## :busts_in_silhouette: List of contributors + + $CONTRIBUTORS diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..2dd061c --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,43 @@ + +name: build + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.9"] + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Install miniconda + uses: conda-incubator/setup-miniconda@v2 + with: + miniconda-version: "latest" + auto-update-conda: true + python-version: ${{ matrix.python-version }} + + - name: Initialize conda environment + run: make conda-create + + - name: Setup conda + run: make conda-setup + + - name: Install conda dependencies + run: make from-conda-lock + + - name: Poetry install + run: make install + + - name: Run tests + run: make test diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml new file mode 100644 index 0000000..e9a9bef --- /dev/null +++ b/.github/workflows/codecov.yml @@ -0,0 +1,49 @@ + +name: Codecov workflow + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + run: + name: codecov + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install miniconda + uses: conda-incubator/setup-miniconda@v2 + with: + miniconda-version: "latest" + auto-update-conda: true + # Set to the same as `PYTHON_VERSION` in `Makefile` + python-version: "3.12" + + - name: Initialize conda environment + run: make conda-create + + - name: Setup conda + run: make conda-setup + + - name: Install conda dependencies + run: make from-conda-lock + + - name: Poetry install + run: make install + + - name: Run tests and coverage + run: make test + + - name: Upload to Codecov + uses: codecov/codecov-action@v3 + with: + env_vars: OS,PYTHON + fail_ci_if_error: true + verbose: true diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 0000000..83e584b --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,71 @@ + +# Simple workflow for deploying static content to GitHub Pages +name: Deploy content to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + deploy: + name: docs + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4.0.0 + with: + fetch-depth: 0 + + - name: Install miniconda + uses: conda-incubator/setup-miniconda@v2 + with: + miniconda-version: "latest" + auto-update-conda: true + python-version: "3.12" + + - name: Initialize conda environment + run: make conda-create + + - name: Setup conda + run: make conda-setup + + - name: Install conda dependencies + run: make from-conda-lock + + - name: Poetry install + run: make install + + - name: Build documentation + run: make docs-versioned + + - name: Setup Pages + uses: actions/configure-pages@v3 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v2 + with: + # Upload entire repository + path: './docs/html/' + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml new file mode 100644 index 0000000..2125f00 --- /dev/null +++ b/.github/workflows/linter.yml @@ -0,0 +1,41 @@ + +name: Lint Code Base + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + build: + name: lint + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Install miniconda + uses: conda-incubator/setup-miniconda@v2 + with: + miniconda-version: "latest" + auto-update-conda: true + python-version: "3.12" + + - name: Initialize conda environment + run: make conda-create + + - name: Setup conda + run: make conda-setup + + - name: Install conda dependencies + run: make from-conda-lock + + - name: Poetry install + run: make install + + - name: Style checks + run: make check-codestyle diff --git a/.gitignore b/.gitignore index 818254f..12700c2 100755 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,123 @@ *.pyc -working_on_tests .DS_Store + +.vscode + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# dotenv +.env + +# virtualenv +.venv +venv/ +ENV/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +# IDE settings +.vscode/ +.idea/ + +# Doc builds +docs/source/_build +docs/html +docs/source/doc +public/ + +# psi4 +timer.dat +psi.*.clean + +# Pytest tmp +tests/tmp/ +tests/files/tmp/* +!tests/files/tmp/.gitkeep +report.xml diff --git a/.markdownlint.yaml b/.markdownlint.yaml new file mode 100644 index 0000000..1fa301f --- /dev/null +++ b/.markdownlint.yaml @@ -0,0 +1,20 @@ +# https://github.com/DavidAnson/markdownlint/blob/main/schema/.markdownlint.yaml +MD007: + indent: 4 +MD013: false +MD022: false +MD024: false +MD026: false +MD028: false +MD030: + ol_multi: 2 + ol_single: 2 + ul_multi: 3 + ul_single: 3 +MD031: false +MD032: false +MD033: false +MD036: false +MD038: false +MD041: false +MD046: false diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..1ab021a --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,31 @@ +default_language_version: + python: python3.12 + +default_stages: [commit, push] + +repos: + + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: mixed-line-ending + - id: trailing-whitespace + - id: end-of-file-fixer + # - id: check-executables-have-shebangs + - id: check-json + - id: check-toml + - id: check-yaml + exclude: "mkdocs.yml" + - id: detect-private-key + + - repo: https://github.com/pycqa/isort + rev: 5.13.2 + hooks: + - id: isort + name: isort (python) + + - repo: https://github.com/psf/black-pre-commit-mirror + rev: 23.11.0 + hooks: + - id: black + language_version: python3.12 diff --git a/CHANGELOG.md b/CHANGELOG.md index 2764e2b..7f6c9d7 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,160 +1,151 @@ -Changes -======= +# Changelog -1.2.1 ------ +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -* Fixed a bug in generating multiple non-aromatic ring conformations. This +## [Unreleased] + +## [1.2.1] + +- Fixed a bug in generating multiple non-aromatic ring conformations. This functionality worked correctly when Gypsum-DL was originally published (e.g., with rdkit 2020.03.1). But due to changes made to more recent versions of rdkit, Gypsum-DL produced only one ring conformation, even if multiple were reasonably possible. It now produces multiple ring conformations even on recent versions of rdkit (e.g., `2023.03.1`). We recommend using the lastest version of rdkit. -* Gypsum-DL now uses `AllChem.ETKDGv3` if it's available. -* Modernized codebase some. Python2 no longer officially supported. -* Updated copyright year to 2023. +- Gypsum-DL now uses `AllChem.ETKDGv3` if it's available. +- Modernized codebase some. Python2 no longer officially supported. +- Updated copyright year to 2023. -1.2.0 ------ +## [1.2.0] -* Added to the Durrant-lab filters to compensate for an amide-related bug in +- Added to the Durrant-lab filters to compensate for an amide-related bug in MolVS, one of Gypsum-DL's dependencies. MolVS sometimes tautomerizes `NC(=O)C[*]` to `N\C(O)=C\[*]`, so the Durrant-lab filters now remove any tautomers with substructures that match the SMARTS string `[$(N)]C(=C)[$([OH]),$([O-])]`. -* Previously, the Durrant-lab filters only removed terminal iminols, which are +- Previously, the Durrant-lab filters only removed terminal iminols, which are improbable tautomers of terminal amides. According to [DataWarrior](https://openmolecules.org/datawarrior/), internal iminols (e.g., `C\N=C(\C)O`) are also improbable, so these are now removed as well. -1.1.9 ------ +## [1.1.9] -* Improved error handling when loading SDF files that are poorly formatted +- Improved error handling when loading SDF files that are poorly formatted (e.g., that do not specify charged nitrogen atoms). Gypsum-DL depends on RDKit for SDF loading, and RDKit apparently cannot handle these errors. If you find that Gypsum-DL skips many of your compounds with a `Warning: Could not convert some SDF-formatted files to SMILES...` error, consider using an SMI (SMILES) file instead. -1.1.8 ------ +## [1.1.8] Updated `README.md` to help some users who were having trouble installing RDKit. -1.1.7 ------ +## [1.1.7] -* Updated the `README.md` file, specifically the `Important Caveats` section. -* Modest speed improvements when enumerating compounds with many chiral +- Updated the `README.md` file, specifically the `Important Caveats` section. +- Modest speed improvements when enumerating compounds with many chiral centers. (No need to enumerate far more compounds than will ultimately be used, given the values of the `thoroughness` and `max_variants_per_compound` user parameters.) This update should also allow Gypsum-DL to more efficiently use available memory. -* Similar speed and memory improvements when enumerating compounds with many +- Similar speed and memory improvements when enumerating compounds with many double bonds that have unspecified stereochemistries. -1.1.6 ------ +## [1.1.6] -* Corrected minor bug that caused Durrant-lab filters to inappropriately +- Corrected minor bug that caused Durrant-lab filters to inappropriately retain some compounds when running in multiprocessing mode. -* Fixed testing scripts, now that Durrant-lab filters remove iminols. +- Fixed testing scripts, now that Durrant-lab filters remove iminols. -1.1.5 ------ +## [1.1.5] -* Updated Dimorphite-DL to 1.2.4. Now better handles compounds with +- Updated Dimorphite-DL to 1.2.4. Now better handles compounds with polyphosphate chains (e.g., ATP). -* Minor updates to the Durrant-lab filters: - * When running Gypsum-DL without the `--use_durrant_lab_filters` parameter, +- Minor updates to the Durrant-lab filters: +- When running Gypsum-DL without the `--use_durrant_lab_filters` parameter, Gypsum-DL now displays a warning. We strongly recommend using these filters, but we choose not to turn them on by default in order to maintain backwards compatibility. - * Added filter to compensate for a phosphate-related bug in MolVS, one of +- Added filter to compensate for a phosphate-related bug in MolVS, one of Gypsum-DL's dependencies. MolVS sometimes tautomerizes `[O]P(O)([O])=O` to `[O][PH](=O)([O])=O`, so the Durrant-lab filters now remove any tautomers with substructures that match the SMARTS string `O=[PH](=O)([#8])([#8])`. - * Added filters to compensate for frequently seen, unusual MolVS +- Added filters to compensate for frequently seen, unusual MolVS tautomerization of adenine. The Durrant-lab filters now remove tautomers with substructures that match `[#7]=C1[#7]=C[#7]C=C1` and `N=c1cc[#7]c[#7]1`. - * Added filter to remove terminal iminols. While amide-iminol +- Added filter to remove terminal iminols. While amide-iminol tautomerization is valid, amides are far more common, and accounting for this tautomerization produces many improbable iminol compounds. The Durrant-lab filters now remove compounds with substructures that match `[$([NX2H1]),$([NX3H2])]=C[$([OH]),$([O-])]`. - * Added filter to remove molecules containing `[Bi]`. -* Gypsum-DL now outputs molecules with total charges between -4e and +4e. +- Added filter to remove molecules containing `[Bi]`. +- Gypsum-DL now outputs molecules with total charges between -4e and +4e. Before, the cutoff was -2e to 2e. We expanded the range to permit ATP and other similar molecules. -1.1.4 ------ +## [1.1.4] -* Updated Dimorphite-DL to 1.2.3. -* Added `sys.stdout.flush()` commands to ParallelMPI.run (see +- Updated Dimorphite-DL to 1.2.3. +- Added `sys.stdout.flush()` commands to ParallelMPI.run (see `gypsum_dl/gypsum_dl/Parallelizer.py`) to ensure that print statements properly output in large MPI runs. -1.1.3 ------ +## [1.1.3] -* Gypsum-DL used to crash when provided with certain mal-formed SMILES +- Gypsum-DL used to crash when provided with certain mal-formed SMILES strings. It now just skips those SMILES and warns the user that they are poorly formed. See Start.py:303 and MyMol.py:747. -* Durrant-lab filters now remove molecules containing metal and boron atoms. -* Some Durrant-lab filters are now applied immediately after desalting. We +- Durrant-lab filters now remove molecules containing metal and boron atoms. +- Some Durrant-lab filters are now applied immediately after desalting. We discovered that certain substructures cause Gypsum-DL to delay during the add-hydrogens step, specifically when Gypsum-DL generates the 3D structures required to rank conformers. Removing these compounds before adding hydrogens avoids the problem. -* Improved code formatting. -* Made minor spelling corrections to the output. +- Improved code formatting. +- Made minor spelling corrections to the output. -1.1.2 ------ +## [1.1.2] -* Bug fix: thoroughness parameter is now correctly recognized as an int when +- Bug fix: thoroughness parameter is now correctly recognized as an int when specified from the command line. -1.1.1 ------ +## [1.1.1] -* Updated Dimorphite-DL to version 1.2.2. -* Corrected spelling in user-parameter names. Parameters that previously used +- Updated Dimorphite-DL to version 1.2.2. +- Corrected spelling in user-parameter names. Parameters that previously used "ennumerate" now use "enumerate". -* Updated MolVS-generated tautomer filters. Previous versions of Gypsum-DL +- Updated MolVS-generated tautomer filters. Previous versions of Gypsum-DL rejected tautomers that changed the number of _specified_ chiral centers. By default, Gypsum now rejects tautomers that change the total number of chiral centers, _both specified and unspecified_. To override the new default behavior (i.e., to allow tautomers that change the total number of chiral centers), use `--let_tautomers_change_chirality`. See `README.md` for important information about how Gypsum-DL treats tautomers. -* Added Durrant-lab filters. In looking over many Gypsum-DL-generated +- Added Durrant-lab filters. In looking over many Gypsum-DL-generated variants, we have identified several substructures that, though technically possible, strike us as improbable. See `README.md` for examples. To discard molecular variants with these substructures, use the `--use_durrant_lab_filters` flag. -* Rather than RDKit's PDB flavor=4, now using flavor=32. -* PDB files now contain 2 REMARK lines describing the input SMILES string and +- Rather than RDKit's PDB flavor=4, now using flavor=32. +- PDB files now contain 2 REMARK lines describing the input SMILES string and the final SMILES of the ligand. -* Added comment to `README.md` re. the need to first use drug-like filters to +- Added comment to `README.md` re. the need to first use drug-like filters to remove large molecules before Gypsum-DL processing. -* Added comment to `README.md` re. advanced approaches for eliminating +- Added comment to `README.md` re. advanced approaches for eliminating problematic compounds. -1.1.0 ------ +## [1.1.0] -* Updated Dimorphite-DL dependency from version 1.0.0 to version 1.2.0. See +- Updated Dimorphite-DL dependency from version 1.0.0 to version 1.2.0. See `$PATH/gypsum_dl/gypsum_dl/Steps/SMILES/dimorphite_dl/CHANGES.md` for more information. -* Updated MolVS dependency from version v0.1.0 to v0.1.1 2019 release. See +- Updated MolVS dependency from version v0.1.0 to v0.1.1 2019 release. See `$PATH/gypsum_dl/gypsum_dl/molvs/CHANGELOG.md` for more information. -* Gypsum-DL now requires mpi4py version 2.1.0 or higher. Older mpi4py versions +- Gypsum-DL now requires mpi4py version 2.1.0 or higher. Older mpi4py versions can [result in deadlock if a `raise Exception` is triggered while multiprocessing](https://mpi4py.readthedocs.io/en/stable/mpi4py.run.html). Newer mpi4py versions (2.1.0 and higher) provide an alternative command line @@ -173,11 +164,10 @@ RDKit. >>> ``` -* Updated the examples and documentation (`-h`) to reflect the above changes. -* Added a Gypsum-DL citation to the print statement. +- Updated the examples and documentation (`-h`) to reflect the above changes. +- Added a Gypsum-DL citation to the print statement. -1.0.0 ------ +## [1.0.0] The original version described in: diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..ff579b7 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,105 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience +- Focusing on what is best not just for us as individuals but for the overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery and sexual attention or advances of any kind; +- Trolling, insulting or derogatory comments, and personal or political attacks; +- Public or private harassment; +- Publishing others' private information, such as a physical or email address, without their explicit permission; +- Other conduct that could reasonably be considered inappropriate in a professional setting. + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior. +They will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned with this Code of Conduct and will communicate reasons for moderation decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces and when an individual officially represents the community in public spaces. +Examples of representing our community include: + +- using an official email address, +- posting via an official social media account, +- or acting as an appointed representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at . +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders must respect the privacy and security of the reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: +Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. + +**Consequence**: +A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. +A public apology may be requested. + +### 2. Warning + +**Community Impact**: +A violation through a single incident or series of actions. + +**Consequence**: +A warning with consequences for continued behavior. +No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. +This includes avoiding interactions in community spaces and external channels like social media. +Violating these terms may lead to a temporary or permanent ban. + +### 3. Temporary Ban + +**Community Impact**: +A severe violation of community standards, including sustained inappropriate behavior. + +**Consequence**: +A temporary ban from any sort of interaction or public communication with the community for a specified period of time. +No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: +Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: +A permanent ban from any sort of public interaction within the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. +Translations are available at [https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 4221203..d43c2c1 100755 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,10 +1,9 @@ -Contributors in Alphabetical Order -================================== +# Contributors in Alphabetical Order -* Jacob Durrant -* Erich Hellemann -* Katherine Milliken -* John Ringe -* Patrick Ropp -* Jacob Spigel -* Jennifer Walker +- Jacob Durrant +- Erich Hellemann +- Katherine Milliken +- John Ringe +- Patrick Ropp +- Jacob Spigel +- Jennifer Walker diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..193fd62 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,208 @@ +# Apache License + +*Version 2.0, January 2004* +<[http://www.apache.org/licenses](http://www.apache.org/licenses)> + +## Terms and Conditions for use, reproduction, and distribution + +### 1. Definitions + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the +copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other +entities that control, are controlled by, or are under common control with +that entity. For the purposes of this definition, "control" means (i) the +power, direct or indirect, to cause the direction or management of such +entity, whether by contract or otherwise, or (ii) ownership of +fifty percent (50%) or more of the outstanding shares, or (iii) beneficial +ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation source, +and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation +or translation of a Source form, including but not limited to compiled +object code, generated documentation, and conversions to +other media types. + +"Work" shall mean the work of authorship, whether in Source or Object +form, made available under the License, as indicated by a copyright notice +that is included in or attached to the work (an example is provided in the +Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, +that is based on (or derived from) the Work and for which the editorial +revisions, annotations, elaborations, or other modifications represent, +as a whole, an original work of authorship. For the purposes of this +License, Derivative Works shall not include works that remain separable +from, or merely link (or bind by name) to the interfaces of, the Work and +Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original +version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor for +inclusion in the Work by the copyright owner or by an individual or +Legal Entity authorized to submit on behalf of the copyright owner. +For the purposes of this definition, "submitted" means any form of +electronic, verbal, or written communication sent to the Licensor or its +representatives, including but not limited to communication on electronic +mailing lists, source code control systems, and issue tracking systems +that are managed by, or on behalf of, the Licensor for the purpose of +discussing and improving the Work, but excluding communication that is +conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on +behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +### 2. Grant of Copyright License + +Subject to the terms and conditions of this License, each Contributor +hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, +royalty-free, irrevocable copyright license to reproduce, prepare +Derivative Works of, publicly display, publicly perform, sublicense, +and distribute the Work and such Derivative Works in +Source or Object form. + +### 3. Grant of Patent License + +Subject to the terms and conditions of this License, each Contributor +hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, +royalty-free, irrevocable (except as stated in this section) patent +license to make, have made, use, offer to sell, sell, import, and +otherwise transfer the Work, where such license applies only to those +patent claims licensable by such Contributor that are necessarily +infringed by their Contribution(s) alone or by combination of their +Contribution(s) with the Work to which such Contribution(s) was submitted. +If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or +contributory patent infringement, then any patent licenses granted to +You under this License for that Work shall terminate as of the date such +litigation is filed. + +### 4. Redistribution + +You may reproduce and distribute copies of the Work or Derivative Works +thereof in any medium, with or without modifications, and in Source or +Object form, provided that You meet the following conditions: + +1. You must give any other recipients of the Work or Derivative Works a +copy of this License; and + +2. You must cause any modified files to carry prominent notices stating +that You changed the files; and + +3. You must retain, in the Source form of any Derivative Works that You +distribute, all copyright, patent, trademark, and attribution notices from +the Source form of the Work, excluding those notices that do not pertain +to any part of the Derivative Works; and + +4. If the Work includes a "NOTICE" text file as part of its distribution, +then any Derivative Works that You distribute must include a readable copy +of the attribution notices contained within such NOTICE file, excluding +those notices that do not pertain to any part of the Derivative Works, +in at least one of the following places: within a NOTICE text file +distributed as part of the Derivative Works; within the Source form or +documentation, if provided along with the Derivative Works; or, within a +display generated by the Derivative Works, if and wherever such +third-party notices normally appear. The contents of the NOTICE file are +for informational purposes only and do not modify the License. +You may add Your own attribution notices within Derivative Works that You +distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed +as modifying the License. + +You may add Your own copyright statement to Your modifications and may +provide additional or different license terms and conditions for use, +reproduction, or distribution of Your modifications, or for any such +Derivative Works as a whole, provided Your use, reproduction, and +distribution of the Work otherwise complies with the conditions +stated in this License. + +### 5. Submission of Contributions + +Unless You explicitly state otherwise, any Contribution intentionally +submitted for inclusion in the Work by You to the Licensor shall be under +the terms and conditions of this License, without any additional +terms or conditions. Notwithstanding the above, nothing herein shall +supersede or modify the terms of any separate license agreement you may +have executed with Licensor regarding such Contributions. + +### 6. Trademarks + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +### 7. Disclaimer of Warranty + +Unless required by applicable law or agreed to in writing, Licensor +provides the Work (and each Contributor provides its Contributions) +on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +either express or implied, including, without limitation, any warranties +or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS +FOR A PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any risks +associated with Your exercise of permissions under this License. + +### 8. Limitation of Liability + +In no event and under no legal theory, whether in tort +(including negligence), contract, or otherwise, unless required by +applicable law (such as deliberate and grossly negligent acts) or agreed +to in writing, shall any Contributor be liable to You for damages, +including any direct, indirect, special, incidental, or consequential +damages of any character arising as a result of this License or out of +the use or inability to use the Work (including but not limited to damages +for loss of goodwill, work stoppage, computer failure or malfunction, +or any and all other commercial damages or losses), even if such +Contributor has been advised of the possibility of such damages. + +### 9. Accepting Warranty or Additional Liability + +While redistributing the Work or Derivative Works thereof, You may choose +to offer, and charge a fee for, acceptance of support, warranty, +indemnity, or other liability obligations and/or rights consistent with +this License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf of any +other Contributor, and only if You agree to indemnify, defend, and hold +each Contributor harmless for any liability incurred by, or claims +asserted against, such Contributor by reason of your accepting any such +warranty or additional liability. + +*END OF TERMS AND CONDITIONS* + +## APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included +on the same "printed page" as the copyright notice for easier +identification within third-party archives. + + Copyright 2024 durrantlab + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the License for the specific language governing + permissions and limitations under the License. diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index bebc887..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,157 +0,0 @@ -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the -copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other -entities that control, are controlled by, or are under common control with -that entity. For the purposes of this definition, "control" means (i) the -power, direct or indirect, to cause the direction or management of such -entity, whether by contract or otherwise, or (ii) ownership of fifty percent -(50%) or more of the outstanding shares, or (iii) beneficial ownership of such -entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, -including but not limited to software source code, documentation source, and -configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object -code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, -made available under the License, as indicated by a copyright notice that is -included in or attached to the work (an example is provided in the Appendix -below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative -Works shall not include works that remain separable from, or merely link (or -bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original -version of the Work and any modifications or additions to that Work or -Derivative Works thereof, that is intentionally submitted to Licensor for -inclusion in the Work by the copyright owner or by an individual or Legal -Entity authorized to submit on behalf of the copyright owner. For the purposes -of this definition, "submitted" means any form of electronic, verbal, or -written communication sent to the Licensor or its representatives, including -but not limited to communication on electronic mailing lists, source code -control systems, and issue tracking systems that are managed by, or on behalf -of, the Licensor for the purpose of discussing and improving the Work, but -excluding communication that is conspicuously marked or otherwise designated -in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this -License, each Contributor hereby grants to You a perpetual, worldwide, -non-exclusive, no-charge, royalty-free, irrevocable copyright license to -reproduce, prepare Derivative Works of, publicly display, publicly perform, -sublicense, and distribute the Work and such Derivative Works in Source or -Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this -License, each Contributor hereby grants to You a perpetual, worldwide, -non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this -section) patent license to make, have made, use, offer to sell, sell, import, -and otherwise transfer the Work, where such license applies only to those -patent claims licensable by such Contributor that are necessarily infringed by -their Contribution(s) alone or by combination of their Contribution(s) with -the Work to which such Contribution(s) was submitted. If You institute patent -litigation against any entity (including a cross-claim or counterclaim in a -lawsuit) alleging that the Work or a Contribution incorporated within the Work -constitutes direct or contributory patent infringement, then any patent -licenses granted to You under this License for that Work shall terminate as of -the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or -Derivative Works thereof in any medium, with or without modifications, and in -Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and You must cause any modified files to carry prominent notices -stating that You changed the files; and You must retain, in the Source form of -any Derivative Works that You distribute, all copyright, patent, trademark, -and attribution notices from the Source form of the Work, excluding those -notices that do not pertain to any part of the Derivative Works; and If the -Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of -the following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents -of the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. - -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a -whole, provided Your use, reproduction, and distribution of the Work otherwise -complies with the conditions stated in this License. 5. Submission of -Contributions. Unless You explicitly state otherwise, any Contribution -intentionally submitted for inclusion in the Work by You to the Licensor shall -be under the terms and conditions of this License, without any additional -terms or conditions. Notwithstanding the above, nothing herein shall supersede -or modify the terms of any separate license agreement you may have executed -with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, -trademarks, service marks, or product names of the Licensor, except as -required for reasonable and customary use in describing the origin of the Work -and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in -writing, Licensor provides the Work (and each Contributor provides its -Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied, including, without limitation, any warranties -or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A -PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any risks -associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in -tort (including negligence), contract, or otherwise, unless required by -applicable law (such as deliberate and grossly negligent acts) or agreed to in -writing, shall any Contributor be liable to You for damages, including any -direct, indirect, special, incidental, or consequential damages of any -character arising as a result of this License or out of the use or inability -to use the Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all other -commercial damages or losses), even if such Contributor has been advised of -the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work -or Derivative Works thereof, You may choose to offer, and charge a fee for, -acceptance of support, warranty, indemnity, or other liability obligations -and/or rights consistent with this License. However, in accepting such -obligations, You may act only on Your own behalf and on Your sole -responsibility, not on behalf of any other Contributor, and only if You agree -to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1532038 --- /dev/null +++ b/Makefile @@ -0,0 +1,194 @@ +SHELL := /usr/bin/env bash +PYTHON_VERSION := 3.12 +PYTHON_VERSION_CONDENSED := 312 +PACKAGE_NAME := gypsum_dl +PACKAGE_PATH := $(PACKAGE_NAME)/ +TESTS_PATH := tests/ +CONDA_NAME := $(PACKAGE_NAME)-dev +CONDA := conda run -n $(CONDA_NAME) +CONDA_LOCK_OPTIONS := -p linux-64 -p osx-64 -p win-64 --channel conda-forge + + +### ENVIRONMENT ### + +# See https://github.com/pypa/pip/issues/7883#issuecomment-643319919 +export PYTHON_KEYRING_BACKEND := keyring.backends.null.Keyring + +.PHONY: conda-create +conda-create: + - conda deactivate + conda remove -y -n $(CONDA_NAME) --all + conda create -y -n $(CONDA_NAME) + $(CONDA) conda install -y python=$(PYTHON_VERSION) + $(CONDA) conda install -y conda-lock + +# Default packages that we always need. +.PHONY: conda-setup +conda-setup: + $(CONDA) conda install -y -c conda-forge poetry + $(CONDA) conda install -y -c conda-forge pre-commit + $(CONDA) conda install -y -c conda-forge conda-poetry-liaison + +# Conda-only packages specific to this project. +.PHONY: conda-dependencies +conda-dependencies: + $(CONDA) conda install -y -c conda-forge mpi4py + +.PHONY: nodejs-dependencies +nodejs-dependencies: + $(CONDA) conda install -y -c conda-forge nodejs + $(CONDA) npm install markdownlint-cli2 --global + +.PHONY: conda-lock +conda-lock: + - rm conda-lock.yml + $(CONDA) conda env export --from-history | grep -v "^prefix" > environment.yml + $(CONDA) conda-lock -f environment.yml $(CONDA_LOCK_OPTIONS) + $(CONDA) cpl-deps pyproject.toml --env_name $(CONDA_NAME) + $(CONDA) cpl-clean --env_name $(CONDA_NAME) + +.PHONY: from-conda-lock +from-conda-lock: + $(CONDA) conda-lock install -n $(CONDA_NAME) conda-lock.yml + $(CONDA) cpl-clean --env_name $(CONDA_NAME) + +.PHONY: pre-commit-install +pre-commit-install: + $(CONDA) pre-commit install + +# Reads `pyproject.toml`, solves environment, then writes lock file. +.PHONY: poetry-lock +poetry-lock: + $(CONDA) poetry lock --no-interaction + +.PHONY: install +install: + $(CONDA) poetry install --no-interaction + - mkdir .mypy_cache + - $(CONDA) mypy --install-types --non-interactive --explicit-package-bases $(PACKAGE_NAME) + +.PHONY: environment +environment: conda-create from-conda-lock pre-commit-install install + +.PHONY: locks +locks: conda-create conda-setup conda-dependencies nodejs-dependencies conda-lock pre-commit-install poetry-lock install + + + +### FORMATTING ### + +.PHONY: validate +validate: + - $(CONDA) markdownlint-cli2 "**.md" --config ./.markdownlint.yaml --fix + - $(CONDA) pre-commit run --all-files + +.PHONY: formatting +formatting: + - $(CONDA) isort --settings-path pyproject.toml ./ + - $(CONDA) black --config pyproject.toml ./ + + + +### TESTING ### + +.PHONY: test +test: + $(CONDA) pytest -c pyproject.toml --cov=$(PACKAGE_NAME) --cov-report=xml --junit-xml=report.xml --color=yes $(TESTS_PATH) + +.PHONY: coverage +coverage: + $(CONDA) coverage report + + + +### LINTING ### + +.PHONY: check-codestyle +check-codestyle: + $(CONDA) isort --diff --check-only $(PACKAGE_PATH) + $(CONDA) black --diff --check --config pyproject.toml $(PACKAGE_PATH) + - $(CONDA) pylint --rcfile pyproject.toml $(PACKAGE_PATH) + +.PHONY: mypy +mypy: + - $(CONDA) mypy --config-file pyproject.toml $(PACKAGE_PATH) + +.PHONY: lint +lint: check-codestyle mypy + + + +### BUILDING ### + +.PHONY: build +build: + $(CONDA) poetry build + + + +### CLEANING ### + +.PHONY: pycache-remove +pycache-remove: + find . | grep -E "(__pycache__|\.pyc|\.pyo$$)" | xargs rm -rf + +.PHONY: dsstore-remove +dsstore-remove: + find . | grep -E ".DS_Store" | xargs rm -rf + +.PHONY: mypycache-remove +mypycache-remove: + find . | grep -E ".mypy_cache" | xargs rm -rf + +.PHONY: ipynbcheckpoints-remove +ipynbcheckpoints-remove: + find . | grep -E ".ipynb_checkpoints" | xargs rm -rf + +.PHONY: pytestcache-remove +pytestcache-remove: + find . | grep -E ".pytest_cache" | xargs rm -rf + +.PHONY: pytest-coverage +pytest-coverage: + rm report.xml coverage.xml .coverage + +.PHONY: build-remove +build-remove: + rm -rf build/ + +.PHONY: cleanup +cleanup: pycache-remove dsstore-remove mypycache-remove ipynbcheckpoints-remove pytestcache-remove + + + +### DOCS ### + +mkdocs_port := $(shell \ + start_port=3000; \ + max_attempts=100; \ + for i in $$(seq 0 $$(($$max_attempts - 1))); do \ + current_port=$$(($$start_port + i)); \ + if ! lsof -i :$$current_port > /dev/null; then \ + echo $$current_port; \ + break; \ + fi; \ + if [ $$i -eq $$(($$max_attempts - 1)) ]; then \ + echo "Error: Unable to find an available port after $$max_attempts attempts."; \ + exit 1; \ + fi; \ + done \ +) + +.PHONY: serve +serve: + echo "Served at http://127.0.0.1:$(mkdocs_port)/" + $(CONDA) mkdocs serve -a localhost:$(mkdocs_port) + +.PHONY: docs +docs: + $(CONDA) mkdocs build -d public/ + - rm -f public/gen_ref_pages.py + +.PHONY: open-docs +open-docs: + xdg-open public/index.html 2>/dev/null diff --git a/README.md b/README.md index 9a7d6b6..2567414 100755 --- a/README.md +++ b/README.md @@ -120,13 +120,13 @@ Prepare a virtual library and save all 3D models to a single SDF file in the present directory: ```bash -python run_gypsum_dl.py --source ./examples/sample_molecules.smi +gypsum-dl --source ./examples/sample_molecules.smi ``` Instead save all 3D models to a different, existing folder: ```bash -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \ +gypsum-dl --source ./examples/sample_molecules.smi \ --output_folder /my/folder/ ``` @@ -134,7 +134,7 @@ Additionally save the models associated with each input molecule to separate files: ```bash -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \ +gypsum-dl --source ./examples/sample_molecules.smi \ --output_folder /my/folder/ --separate_output_files ``` @@ -142,35 +142,35 @@ In addition to saving a 3D SDF file, also save 3D PDB files and an HTML file with 2D structures (for debugging). ```bash -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \ +gypsum-dl --source ./examples/sample_molecules.smi \ --output_folder /my/folder/ --add_pdb_output --add_html_output ``` Save at most two variants per input molecule: ```bash -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \ +gypsum-dl --source ./examples/sample_molecules.smi \ --output_folder /my/folder/ --max_variants_per_compound 2 ``` Control how Gypsum-DL ionizes the input molecules: ```bash -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \ +gypsum-dl --source ./examples/sample_molecules.smi \ --output_folder /my/folder/ --min_ph 12 --max_ph 14 --pka_precision 1 ``` Run Gypsum-DL in serial mode (using only one processor): ```bash -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \ +gypsum-dl --source ./examples/sample_molecules.smi \ --job_manager serial ``` Run Gypsum-DL in multiprocessing mode, using 4 processors: ```bash -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \ +gypsum-dl --source ./examples/sample_molecules.smi \ --job_manager multiprocessing --num_processors 4 ``` @@ -184,7 +184,7 @@ mpirun -n $NTASKS python -m mpi4py run_gypsum_dl.py --source ./examples/sample_ Gypsum-DL can also take parameters from a JSON file: ```bash -python run_gypsum_dl.py --json myparams.json +gypsum-dl --json myparams.json ``` Where `myparams.json` might look like: @@ -233,17 +233,17 @@ In looking over many Gypsum-DL-generated variants, we have identified a number of substructures that, though technically possible, strike us as improbable or otherwise poorly suited for virtual screening. Here are some examples: -* `C=[N-]` -* `[N-]C=[N+]` -* `[nH+]c[n-]` -* `[#7+]~[#7+]` -* `[#7-]~[#7-]` -* `[!#7]~[#7+]~[#7-]~[!#7]` -* `[#5]` (boron) -* `O=[PH](=O)([#8])([#8])` -* `N=c1cc[#7]c[#7]1` -* `[$([NX2H1]),$([NX3H2])]=C[$([OH]),$([O-])]` -* Metals +* `C=[N-]` +* `[N-]C=[N+]` +* `[nH+]c[n-]` +* `[#7+]~[#7+]` +* `[#7-]~[#7-]` +* `[!#7]~[#7+]~[#7-]~[!#7]` +* `[#5]` (boron) +* `O=[PH](=O)([#8])([#8])` +* `N=c1cc[#7]c[#7]1` +* `[$([NX2H1]),$([NX3H2])]=C[$([OH]),$([O-])]` +* Metals If you'd like to discard molecular variants with substructures such as these, use the `--use_durrant_lab_filters` flag. @@ -269,19 +269,19 @@ Gypsum-DL aims to enumerate many possible variant forms, including forms that are not necessarily probable. Beyond applying Durrant-Lab filters, several methods allow users to exclude other potentially problematic forms: -1. Identify the steps Gypsum-DL takes to generate a given problematic form +1. Identify the steps Gypsum-DL takes to generate a given problematic form (see the "Genealogy" field of every output SDF file). Then use parameters such as `--skip_optimize_geometry`, `--skip_alternate_ring_conformations`, `--skip_adding_hydrogen`, `--skip_making_tautomers`, `--skip_enumerate_chiral_mol`, or `--skip_enumerate_double_bonds` to skip the problem-causing step. This fix is easy, but it may unexpectedly impact unrelated compounds. -2. Consider adjusting the `--min_ph`, `--max_ph`, or `--pka_precision` +2. Consider adjusting the `--min_ph`, `--max_ph`, or `--pka_precision` parameters if Gypsum-DL is producing compounds with undesired protonation states. Alternatively, you can delete specific protonation rules by modifying the `gypsum_dl/Steps/SMILES/dimorphite_dl/site_substructures.smarts` file. -3. Add to the Durrant-Lab filters if there is a specific substructure you +3. Add to the Durrant-Lab filters if there is a specific substructure you would like to avoid (e.g., imidic acid due to amide/imidic-acid tautomerization). Simplify modify the `gypsum_dl/Steps/SMILES/DurrantLabFilter.py` file. diff --git a/__init__.py b/__init__.py deleted file mode 100755 index 8d1c8b6..0000000 --- a/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/conda-lock.yml b/conda-lock.yml new file mode 100644 index 0000000..52f0874 --- /dev/null +++ b/conda-lock.yml @@ -0,0 +1,4739 @@ +# This lock file was generated by conda-lock (https://github.com/conda/conda-lock). DO NOT EDIT! +# +# A "lock file" contains a concrete list of package versions (with checksums) to be installed. Unlike +# e.g. `conda env create`, the resulting environment will not change as new package versions become +# available, unless you explicitly update the lock file. +# +# Install this environment as "YOURENV" with: +# conda-lock install -n YOURENV conda-lock.yml +# To update a single package to the latest version compatible with the version constraints in the source: +# conda-lock lock --lockfile conda-lock.yml --update PACKAGE +# To re-solve the entire environment, e.g. after changing a version constraint in the source file: +# conda-lock -f environment.yml --lockfile conda-lock.yml +version: 1 +metadata: + content_hash: + linux-64: 7946667a75b8638f163a9fef15e34b10c27e3b0467a58ae621870401a4e11c25 + osx-64: cdd5fa0daca0518a9ebd7f4a7d2c4d38b5aba390c2941e6b3195b4a865274ac1 + win-64: 7ece94793aa986b29f83e9e705ad7fefdc802e6420378a247cd6c618fefb8338 + channels: + - url: conda-forge + used_env_vars: [] + platforms: + - linux-64 + - osx-64 + - win-64 + sources: + - environment.yml +package: +- name: _libgcc_mutex + version: '0.1' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + hash: + md5: d7c89558ba9fa0495403155b64376d81 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + category: main + optional: false +- name: _openmp_mutex + version: '4.5' + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + libgomp: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + hash: + md5: 73aaf86a425cc6e73fcf236a5a46396d + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + category: main + optional: false +- name: annotated-types + version: 0.6.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + typing-extensions: '>=4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + hash: + md5: 997c29372bdbe2afee073dff71f35923 + sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd + category: main + optional: false +- name: annotated-types + version: 0.6.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + typing-extensions: '>=4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + hash: + md5: 997c29372bdbe2afee073dff71f35923 + sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd + category: main + optional: false +- name: annotated-types + version: 0.6.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + typing-extensions: '>=4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.6.0-pyhd8ed1ab_0.conda + hash: + md5: 997c29372bdbe2afee073dff71f35923 + sha256: 3a2c98154d95cfd54daba6b7d507d31f5ba07ac2ad955c44eb041b66563193cd + category: main + optional: false +- name: appdirs + version: 1.4.4 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 + hash: + md5: 5f095bc6454094e96f146491fd03633b + sha256: ae9fb8f68281f84482f2c234379aa12405a9e365151d43af20b3ae1f17312111 + category: main + optional: false +- name: appdirs + version: 1.4.4 + manager: conda + platform: osx-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 + hash: + md5: 5f095bc6454094e96f146491fd03633b + sha256: ae9fb8f68281f84482f2c234379aa12405a9e365151d43af20b3ae1f17312111 + category: main + optional: false +- name: appdirs + version: 1.4.4 + manager: conda + platform: win-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 + hash: + md5: 5f095bc6454094e96f146491fd03633b + sha256: ae9fb8f68281f84482f2c234379aa12405a9e365151d43af20b3ae1f17312111 + category: main + optional: false +- name: brotli-python + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda + hash: + md5: 45801a89533d3336a365284d93298e36 + sha256: b68706698b6ac0d31196a8bcb061f0d1f35264bcd967ea45e03e108149a74c6f + category: main + optional: false +- name: brotli-python + version: 1.1.0 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=15.0.7' + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py312heafc425_1.conda + hash: + md5: a288b88f06b8bfe0dedaf5c4b6ac6b7a + sha256: fc55988f9bc05a938ea4b8c20d6545bed6e9c6c10aa5147695f981136ca894c1 + category: main + optional: false +- name: brotli-python + version: 1.1.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py312h53d5487_1.conda + hash: + md5: d01a6667b99f0e8ad4097af66c938e62 + sha256: 769e276ecdebf86f097786cbde1ebd11e018cd6cd838800995954fe6360e0797 + category: main + optional: false +- name: bzip2 + version: 1.0.8 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda + hash: + md5: 69b8b6202a07720f448be700e300ccf4 + sha256: 242c0c324507ee172c0e0dd2045814e746bb303d1eb78870d182ceb0abc726a8 + category: main + optional: false +- name: bzip2 + version: 1.0.8 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda + hash: + md5: 6097a6ca9ada32699b5fc4312dd6ef18 + sha256: 61fb2b488928a54d9472113e1280b468a309561caa54f33825a3593da390b242 + category: main + optional: false +- name: bzip2 + version: 1.0.8 + manager: conda + platform: win-64 + dependencies: + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + hash: + md5: 26eb8ca6ea332b675e11704cce84a3be + sha256: ae5f47a5c86fd6db822931255dcf017eb12f60c77f07dc782ccb477f7808aab2 + category: main + optional: false +- name: ca-certificates + version: 2024.2.2 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda + hash: + md5: 2f4327a1cbe7f022401b236e915a5fef + sha256: 91d81bfecdbb142c15066df70cc952590ae8991670198f92c66b62019b251aeb + category: main + optional: false +- name: ca-certificates + version: 2024.2.2 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.2.2-h8857fd0_0.conda + hash: + md5: f2eacee8c33c43692f1ccfd33d0f50b1 + sha256: 54a794aedbb4796afeabdf54287b06b1d27f7b13b3814520925f4c2c80f58ca9 + category: main + optional: false +- name: ca-certificates + version: 2024.2.2 + manager: conda + platform: win-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda + hash: + md5: 63da060240ab8087b60d1357051ea7d6 + sha256: 4d587088ecccd393fec3420b64f1af4ee1a0e6897a45cfd5ef38055322cea5d0 + category: main + optional: false +- name: cachecontrol + version: 0.14.0 + manager: conda + platform: linux-64 + dependencies: + msgpack-python: '>=0.5.2' + python: '>=3.7' + requests: '>=2.16.0' + url: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.0-pyhd8ed1ab_0.conda + hash: + md5: a661c39e223bf3038b38126b0bbf43d9 + sha256: 3318732d60456c5ecc0db14a7343a320ea88e05ae168aea4164d7f9ec7907142 + category: main + optional: false +- name: cachecontrol + version: 0.14.0 + manager: conda + platform: osx-64 + dependencies: + msgpack-python: '>=0.5.2' + python: '>=3.7' + requests: '>=2.16.0' + url: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.0-pyhd8ed1ab_0.conda + hash: + md5: a661c39e223bf3038b38126b0bbf43d9 + sha256: 3318732d60456c5ecc0db14a7343a320ea88e05ae168aea4164d7f9ec7907142 + category: main + optional: false +- name: cachecontrol + version: 0.14.0 + manager: conda + platform: win-64 + dependencies: + msgpack-python: '>=0.5.2' + python: '>=3.7' + requests: '>=2.16.0' + url: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.0-pyhd8ed1ab_0.conda + hash: + md5: a661c39e223bf3038b38126b0bbf43d9 + sha256: 3318732d60456c5ecc0db14a7343a320ea88e05ae168aea4164d7f9ec7907142 + category: main + optional: false +- name: cachecontrol-with-filecache + version: 0.14.0 + manager: conda + platform: linux-64 + dependencies: + cachecontrol: 0.14.0 + filelock: '>=3.8.0' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-with-filecache-0.14.0-pyhd8ed1ab_0.conda + hash: + md5: 4c08fa6e7d1d3f124ad815e21b2210e9 + sha256: 89a9061aafc28c0e0e2db49a5b99e99797ed3a7127c31deda0cceb4696ae627f + category: main + optional: false +- name: cachecontrol-with-filecache + version: 0.14.0 + manager: conda + platform: osx-64 + dependencies: + cachecontrol: 0.14.0 + filelock: '>=3.8.0' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-with-filecache-0.14.0-pyhd8ed1ab_0.conda + hash: + md5: 4c08fa6e7d1d3f124ad815e21b2210e9 + sha256: 89a9061aafc28c0e0e2db49a5b99e99797ed3a7127c31deda0cceb4696ae627f + category: main + optional: false +- name: cachecontrol-with-filecache + version: 0.14.0 + manager: conda + platform: win-64 + dependencies: + cachecontrol: 0.14.0 + filelock: '>=3.8.0' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/cachecontrol-with-filecache-0.14.0-pyhd8ed1ab_0.conda + hash: + md5: 4c08fa6e7d1d3f124ad815e21b2210e9 + sha256: 89a9061aafc28c0e0e2db49a5b99e99797ed3a7127c31deda0cceb4696ae627f + category: main + optional: false +- name: cachy + version: 0.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/cachy-0.3.0-pyhd8ed1ab_1.tar.bz2 + hash: + md5: 5dfee17f24e2dfd18d7392b48c9351e2 + sha256: 9b193a4e483c4d0004bc5b88fac7a02516b6311137ab61b8db85aa9741422e35 + category: main + optional: false +- name: cachy + version: 0.3.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/cachy-0.3.0-pyhd8ed1ab_1.tar.bz2 + hash: + md5: 5dfee17f24e2dfd18d7392b48c9351e2 + sha256: 9b193a4e483c4d0004bc5b88fac7a02516b6311137ab61b8db85aa9741422e35 + category: main + optional: false +- name: cachy + version: 0.3.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/cachy-0.3.0-pyhd8ed1ab_1.tar.bz2 + hash: + md5: 5dfee17f24e2dfd18d7392b48c9351e2 + sha256: 9b193a4e483c4d0004bc5b88fac7a02516b6311137ab61b8db85aa9741422e35 + category: main + optional: false +- name: certifi + version: 2024.2.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + hash: + md5: 0876280e409658fc6f9e75d035960333 + sha256: f1faca020f988696e6b6ee47c82524c7806380b37cfdd1def32f92c326caca54 + category: main + optional: false +- name: certifi + version: 2024.2.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + hash: + md5: 0876280e409658fc6f9e75d035960333 + sha256: f1faca020f988696e6b6ee47c82524c7806380b37cfdd1def32f92c326caca54 + category: main + optional: false +- name: certifi + version: 2024.2.2 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + hash: + md5: 0876280e409658fc6f9e75d035960333 + sha256: f1faca020f988696e6b6ee47c82524c7806380b37cfdd1def32f92c326caca54 + category: main + optional: false +- name: cffi + version: 1.16.0 + manager: conda + platform: linux-64 + dependencies: + libffi: '>=3.4,<4.0a0' + libgcc-ng: '>=12' + pycparser: '' + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda + hash: + md5: 56b0ca764ce23cc54f3f7e2a7b970f6d + sha256: 5a36e2c254603c367d26378fa3a205bd92263e30acf195f488749562b4c44251 + category: main + optional: false +- name: cffi + version: 1.16.0 + manager: conda + platform: osx-64 + dependencies: + libffi: '>=3.4,<4.0a0' + pycparser: '' + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.16.0-py312h38bf5a0_0.conda + hash: + md5: a45759c013ab20b9017ef9539d234dd7 + sha256: 8b856583b56fc30f064a7cb286f85e4b5725f2bd4fda8ba0c4e94bffe258741e + category: main + optional: false +- name: cffi + version: 1.16.0 + manager: conda + platform: win-64 + dependencies: + pycparser: '' + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/cffi-1.16.0-py312he70551f_0.conda + hash: + md5: 5a51096925d52332c62bfd8904899055 + sha256: dd39e594f5c6bca52dfed343de2af9326a99700ce2ba3404bd89706926fc0137 + category: main + optional: false +- name: cfgv + version: 3.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6.1' + url: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: ebb5f5f7dc4f1a3780ef7ea7738db08c + sha256: fbc03537a27ef756162c49b1d0608bf7ab12fa5e38ceb8563d6f4859e835ac5c + category: main + optional: false +- name: cfgv + version: 3.3.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6.1' + url: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: ebb5f5f7dc4f1a3780ef7ea7738db08c + sha256: fbc03537a27ef756162c49b1d0608bf7ab12fa5e38ceb8563d6f4859e835ac5c + category: main + optional: false +- name: cfgv + version: 3.3.1 + manager: conda + platform: win-64 + dependencies: + python: '>=3.6.1' + url: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: ebb5f5f7dc4f1a3780ef7ea7738db08c + sha256: fbc03537a27ef756162c49b1d0608bf7ab12fa5e38ceb8563d6f4859e835ac5c + category: main + optional: false +- name: charset-normalizer + version: 3.3.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + hash: + md5: 7f4a9e3fcff3f6356ae99244a014da6a + sha256: 20cae47d31fdd58d99c4d2e65fbdcefa0b0de0c84e455ba9d6356a4bdbc4b5b9 + category: main + optional: false +- name: charset-normalizer + version: 3.3.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + hash: + md5: 7f4a9e3fcff3f6356ae99244a014da6a + sha256: 20cae47d31fdd58d99c4d2e65fbdcefa0b0de0c84e455ba9d6356a4bdbc4b5b9 + category: main + optional: false +- name: charset-normalizer + version: 3.3.2 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + hash: + md5: 7f4a9e3fcff3f6356ae99244a014da6a + sha256: 20cae47d31fdd58d99c4d2e65fbdcefa0b0de0c84e455ba9d6356a4bdbc4b5b9 + category: main + optional: false +- name: cleo + version: 2.1.0 + manager: conda + platform: linux-64 + dependencies: + crashtest: '>=0.4.1,<0.5.0' + python: '>=3.7,<4.0' + rapidfuzz: '>=3.0.0,<4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/cleo-2.1.0-pyhd8ed1ab_0.conda + hash: + md5: 69569ea8a6d1465193345a40421d138b + sha256: eed2d2cb8792b3ae6434ce49bf5fe1ae5d885253f6bd2e56da933c427705fcbc + category: main + optional: false +- name: cleo + version: 2.1.0 + manager: conda + platform: osx-64 + dependencies: + crashtest: '>=0.4.1,<0.5.0' + python: '>=3.7,<4.0' + rapidfuzz: '>=3.0.0,<4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/cleo-2.1.0-pyhd8ed1ab_0.conda + hash: + md5: 69569ea8a6d1465193345a40421d138b + sha256: eed2d2cb8792b3ae6434ce49bf5fe1ae5d885253f6bd2e56da933c427705fcbc + category: main + optional: false +- name: cleo + version: 2.1.0 + manager: conda + platform: win-64 + dependencies: + crashtest: '>=0.4.1,<0.5.0' + python: '>=3.7,<4.0' + rapidfuzz: '>=3.0.0,<4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/cleo-2.1.0-pyhd8ed1ab_0.conda + hash: + md5: 69569ea8a6d1465193345a40421d138b + sha256: eed2d2cb8792b3ae6434ce49bf5fe1ae5d885253f6bd2e56da933c427705fcbc + category: main + optional: false +- name: click + version: 8.1.7 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + hash: + md5: f3ad426304898027fc619827ff428eca + sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec + category: main + optional: false +- name: click + version: 8.1.7 + manager: conda + platform: osx-64 + dependencies: + __unix: '' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + hash: + md5: f3ad426304898027fc619827ff428eca + sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec + category: main + optional: false +- name: click + version: 8.1.7 + manager: conda + platform: win-64 + dependencies: + __win: '' + colorama: '' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda + hash: + md5: 3549ecbceb6cd77b91a105511b7d0786 + sha256: 90236b113b9a20041736e80b80ee965167f9aac0468315c55e2bad902d673fb0 + category: main + optional: false +- name: click-default-group + version: 1.2.4 + manager: conda + platform: linux-64 + dependencies: + click: '' + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda + hash: + md5: 7c2b6931f9b3548ed78478332095c3e9 + sha256: b36e35d735ddd29d7c592eb3de4b3979e13a9f76f1b4bc939f2cb4402758d6d0 + category: main + optional: false +- name: click-default-group + version: 1.2.4 + manager: conda + platform: osx-64 + dependencies: + click: '' + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda + hash: + md5: 7c2b6931f9b3548ed78478332095c3e9 + sha256: b36e35d735ddd29d7c592eb3de4b3979e13a9f76f1b4bc939f2cb4402758d6d0 + category: main + optional: false +- name: click-default-group + version: 1.2.4 + manager: conda + platform: win-64 + dependencies: + click: '' + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda + hash: + md5: 7c2b6931f9b3548ed78478332095c3e9 + sha256: b36e35d735ddd29d7c592eb3de4b3979e13a9f76f1b4bc939f2cb4402758d6d0 + category: main + optional: false +- name: clikit + version: 0.6.2 + manager: conda + platform: linux-64 + dependencies: + pastel: '>=0.2.0,<0.3.0' + pylev: '>=1.3,<2.0' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/clikit-0.6.2-pyhd8ed1ab_2.conda + hash: + md5: 02abb7b66b02e8b9f5a9b05454400087 + sha256: 2d582bc15d9116ec5467b565fb87d9034c8b56f60943e8eb69407f55f1ab5a78 + category: main + optional: false +- name: clikit + version: 0.6.2 + manager: conda + platform: osx-64 + dependencies: + pastel: '>=0.2.0,<0.3.0' + pylev: '>=1.3,<2.0' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/clikit-0.6.2-pyhd8ed1ab_2.conda + hash: + md5: 02abb7b66b02e8b9f5a9b05454400087 + sha256: 2d582bc15d9116ec5467b565fb87d9034c8b56f60943e8eb69407f55f1ab5a78 + category: main + optional: false +- name: clikit + version: 0.6.2 + manager: conda + platform: win-64 + dependencies: + pastel: '>=0.2.0,<0.3.0' + pylev: '>=1.3,<2.0' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/clikit-0.6.2-pyhd8ed1ab_2.conda + hash: + md5: 02abb7b66b02e8b9f5a9b05454400087 + sha256: 2d582bc15d9116ec5467b565fb87d9034c8b56f60943e8eb69407f55f1ab5a78 + category: main + optional: false +- name: colorama + version: 0.4.6 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 3faab06a954c2a04039983f2c4a50d99 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + category: main + optional: false +- name: colorama + version: 0.4.6 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 3faab06a954c2a04039983f2c4a50d99 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + category: main + optional: false +- name: colorama + version: 0.4.6 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 3faab06a954c2a04039983f2c4a50d99 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + category: main + optional: false +- name: conda-lock + version: 2.5.6 + manager: conda + platform: linux-64 + dependencies: + cachecontrol-with-filecache: '>=0.12.9' + cachy: '>=0.3.0' + click: '>=8.0' + click-default-group: '' + clikit: '>=0.6.2' + crashtest: '>=0.3.0' + ensureconda: '>=1.3' + gitpython: '>=3.1.30' + html5lib: '>=1.0' + jinja2: '' + keyring: '>=21.2.0' + packaging: '>=20.4' + pkginfo: '>=1.4' + pydantic: '>=1.10' + python: '>=3.8' + pyyaml: '>=5.1' + requests: '>=2.18' + ruamel.yaml: '' + setuptools: '' + tomli: '' + tomlkit: '>=0.7.0' + toolz: '>=0.12.0,<1.0.0' + typing_extensions: '' + urllib3: '>=1.26.5,<2.0' + virtualenv: '>=20.0.26' + url: https://conda.anaconda.org/conda-forge/noarch/conda-lock-2.5.6-pyhd8ed1ab_0.conda + hash: + md5: 16195242f8b17c9ca49f1ea34f1c027f + sha256: 0aeaac3aea1284444cee0145c9db266091ad1af55864b69372500bb3f0edc3fc + category: main + optional: false +- name: conda-lock + version: 2.5.6 + manager: conda + platform: osx-64 + dependencies: + cachecontrol-with-filecache: '>=0.12.9' + cachy: '>=0.3.0' + click: '>=8.0' + click-default-group: '' + clikit: '>=0.6.2' + crashtest: '>=0.3.0' + ensureconda: '>=1.3' + gitpython: '>=3.1.30' + html5lib: '>=1.0' + jinja2: '' + keyring: '>=21.2.0' + packaging: '>=20.4' + pkginfo: '>=1.4' + pydantic: '>=1.10' + python: '>=3.8' + pyyaml: '>=5.1' + requests: '>=2.18' + ruamel.yaml: '' + setuptools: '' + tomli: '' + tomlkit: '>=0.7.0' + toolz: '>=0.12.0,<1.0.0' + typing_extensions: '' + urllib3: '>=1.26.5,<2.0' + virtualenv: '>=20.0.26' + url: https://conda.anaconda.org/conda-forge/noarch/conda-lock-2.5.6-pyhd8ed1ab_0.conda + hash: + md5: 16195242f8b17c9ca49f1ea34f1c027f + sha256: 0aeaac3aea1284444cee0145c9db266091ad1af55864b69372500bb3f0edc3fc + category: main + optional: false +- name: conda-lock + version: 2.5.6 + manager: conda + platform: win-64 + dependencies: + cachecontrol-with-filecache: '>=0.12.9' + cachy: '>=0.3.0' + click: '>=8.0' + click-default-group: '' + clikit: '>=0.6.2' + crashtest: '>=0.3.0' + ensureconda: '>=1.3' + gitpython: '>=3.1.30' + html5lib: '>=1.0' + jinja2: '' + keyring: '>=21.2.0' + packaging: '>=20.4' + pkginfo: '>=1.4' + pydantic: '>=1.10' + python: '>=3.8' + pyyaml: '>=5.1' + requests: '>=2.18' + ruamel.yaml: '' + setuptools: '' + tomli: '' + tomlkit: '>=0.7.0' + toolz: '>=0.12.0,<1.0.0' + typing_extensions: '' + urllib3: '>=1.26.5,<2.0' + virtualenv: '>=20.0.26' + url: https://conda.anaconda.org/conda-forge/noarch/conda-lock-2.5.6-pyhd8ed1ab_0.conda + hash: + md5: 16195242f8b17c9ca49f1ea34f1c027f + sha256: 0aeaac3aea1284444cee0145c9db266091ad1af55864b69372500bb3f0edc3fc + category: main + optional: false +- name: conda-poetry-liaison + version: 0.1.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9.0,<4.0.0' + tomli: '>=2.0.1,<3.0.0' + tomli-w: '>=1.0.0,<2.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/conda-poetry-liaison-0.1.2-pyhd8ed1ab_0.conda + hash: + md5: a7e7aaf023212f470e5e477458b5eedc + sha256: 1771dcab93cde5deef59d9b52a67db46a6b6faeb43e32ca2f726064a68e11770 + category: main + optional: false +- name: conda-poetry-liaison + version: 0.1.2 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.9.0,<4.0.0' + tomli: '>=2.0.1,<3.0.0' + tomli-w: '>=1.0.0,<2.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/conda-poetry-liaison-0.1.2-pyhd8ed1ab_0.conda + hash: + md5: a7e7aaf023212f470e5e477458b5eedc + sha256: 1771dcab93cde5deef59d9b52a67db46a6b6faeb43e32ca2f726064a68e11770 + category: main + optional: false +- name: conda-poetry-liaison + version: 0.1.2 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9.0,<4.0.0' + tomli: '>=2.0.1,<3.0.0' + tomli-w: '>=1.0.0,<2.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/conda-poetry-liaison-0.1.2-pyhd8ed1ab_0.conda + hash: + md5: a7e7aaf023212f470e5e477458b5eedc + sha256: 1771dcab93cde5deef59d9b52a67db46a6b6faeb43e32ca2f726064a68e11770 + category: main + optional: false +- name: crashtest + version: 0.4.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6,<4.0' + url: https://conda.anaconda.org/conda-forge/noarch/crashtest-0.4.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 709a2295dd907bb34afb57d54320642f + sha256: 2f05954a3faf0700c14c1deddc085385160ee32abe111699c78d9cb277e915cc + category: main + optional: false +- name: crashtest + version: 0.4.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6,<4.0' + url: https://conda.anaconda.org/conda-forge/noarch/crashtest-0.4.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 709a2295dd907bb34afb57d54320642f + sha256: 2f05954a3faf0700c14c1deddc085385160ee32abe111699c78d9cb277e915cc + category: main + optional: false +- name: crashtest + version: 0.4.1 + manager: conda + platform: win-64 + dependencies: + python: '>=3.6,<4.0' + url: https://conda.anaconda.org/conda-forge/noarch/crashtest-0.4.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 709a2295dd907bb34afb57d54320642f + sha256: 2f05954a3faf0700c14c1deddc085385160ee32abe111699c78d9cb277e915cc + category: main + optional: false +- name: cryptography + version: 42.0.5 + manager: conda + platform: linux-64 + dependencies: + cffi: '>=1.12' + libgcc-ng: '>=12' + openssl: '>=3.2.1,<4.0a0' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/linux-64/cryptography-42.0.5-py312h241aef2_0.conda + hash: + md5: 0d8c0e4e8c1b2796eaf6770a76a9d1e4 + sha256: 5dc135fc6ea57bf94cf32313f91c93f8a4af15133879dd86e6c8c16e4e07c55e + category: main + optional: false +- name: dbus + version: 1.13.6 + manager: conda + platform: linux-64 + dependencies: + expat: '>=2.4.2,<3.0a0' + libgcc-ng: '>=9.4.0' + libglib: '>=2.70.2,<3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + hash: + md5: ecfff944ba3960ecb334b9a2663d708d + sha256: 8f5f995699a2d9dbdd62c61385bfeeb57c82a681a7c8c5313c395aa0ccab68a5 + category: main + optional: false +- name: distlib + version: 0.3.8 + manager: conda + platform: linux-64 + dependencies: + python: 2.7|>=3.6 + url: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda + hash: + md5: db16c66b759a64dc5183d69cc3745a52 + sha256: 3ff11acdd5cc2f80227682966916e878e45ced94f59c402efb94911a5774e84e + category: main + optional: false +- name: distlib + version: 0.3.8 + manager: conda + platform: osx-64 + dependencies: + python: 2.7|>=3.6 + url: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda + hash: + md5: db16c66b759a64dc5183d69cc3745a52 + sha256: 3ff11acdd5cc2f80227682966916e878e45ced94f59c402efb94911a5774e84e + category: main + optional: false +- name: distlib + version: 0.3.8 + manager: conda + platform: win-64 + dependencies: + python: 2.7|>=3.6 + url: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda + hash: + md5: db16c66b759a64dc5183d69cc3745a52 + sha256: 3ff11acdd5cc2f80227682966916e878e45ced94f59c402efb94911a5774e84e + category: main + optional: false +- name: dulwich + version: 0.21.7 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + urllib3: '>=1.25' + url: https://conda.anaconda.org/conda-forge/linux-64/dulwich-0.21.7-py312h98912ed_0.conda + hash: + md5: d9768d62ebbeb330f1b67d8ab4832ff7 + sha256: 404e14e6c7f41a6cf8f2bbe0b6e55d9934f9fa572f0f6937955d15b64080a960 + category: main + optional: false +- name: dulwich + version: 0.21.7 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + urllib3: '>=1.25' + url: https://conda.anaconda.org/conda-forge/osx-64/dulwich-0.21.7-py312h41838bb_0.conda + hash: + md5: 4937c7a86084772c09af1f536a4c5a54 + sha256: 13710740df5bec401f4efb60eaa5fa3017789d369ceed93a10ed66d44ff4c405 + category: main + optional: false +- name: dulwich + version: 0.21.7 + manager: conda + platform: win-64 + dependencies: + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + urllib3: '>=1.25' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/dulwich-0.21.7-py312he70551f_0.conda + hash: + md5: 1e0108590564c5c3b7235bb735d1b334 + sha256: b34a1d1639e80bcaaceac7fa93bd60873a3035edabfff7fe93ecb330000677a2 + category: main + optional: false +- name: ensureconda + version: 1.4.4 + manager: conda + platform: linux-64 + dependencies: + appdirs: '' + click: '>=5.1' + filelock: '' + packaging: '' + python: '>=3.7' + requests: '>=2' + url: https://conda.anaconda.org/conda-forge/noarch/ensureconda-1.4.4-pyhd8ed1ab_0.conda + hash: + md5: e54a91c3a65491b13c68f7696425bac8 + sha256: a115afdc676c95a17ab63bbda84b7b724bc8817ae54fa34f8991339252424959 + category: main + optional: false +- name: ensureconda + version: 1.4.4 + manager: conda + platform: osx-64 + dependencies: + appdirs: '' + click: '>=5.1' + filelock: '' + packaging: '' + python: '>=3.7' + requests: '>=2' + url: https://conda.anaconda.org/conda-forge/noarch/ensureconda-1.4.4-pyhd8ed1ab_0.conda + hash: + md5: e54a91c3a65491b13c68f7696425bac8 + sha256: a115afdc676c95a17ab63bbda84b7b724bc8817ae54fa34f8991339252424959 + category: main + optional: false +- name: ensureconda + version: 1.4.4 + manager: conda + platform: win-64 + dependencies: + appdirs: '' + click: '>=5.1' + filelock: '' + packaging: '' + python: '>=3.7' + requests: '>=2' + url: https://conda.anaconda.org/conda-forge/noarch/ensureconda-1.4.4-pyhd8ed1ab_0.conda + hash: + md5: e54a91c3a65491b13c68f7696425bac8 + sha256: a115afdc676c95a17ab63bbda84b7b724bc8817ae54fa34f8991339252424959 + category: main + optional: false +- name: expat + version: 2.6.2 + manager: conda + platform: linux-64 + dependencies: + libexpat: 2.6.2 + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda + hash: + md5: 53fb86322bdb89496d7579fe3f02fd61 + sha256: 89916c536ae5b85bb8bf0cfa27d751e274ea0911f04e4a928744735c14ef5155 + category: main + optional: false +- name: filelock + version: 3.13.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + hash: + md5: ff15f46b0d34308f4d40c1c51df07592 + sha256: 3bb2b4b8b97160ee7d2ed40b9dbc78555932274e82ef314c8a400a1d17aa4626 + category: main + optional: false +- name: filelock + version: 3.13.3 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + hash: + md5: ff15f46b0d34308f4d40c1c51df07592 + sha256: 3bb2b4b8b97160ee7d2ed40b9dbc78555932274e82ef314c8a400a1d17aa4626 + category: main + optional: false +- name: filelock + version: 3.13.3 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + hash: + md5: ff15f46b0d34308f4d40c1c51df07592 + sha256: 3bb2b4b8b97160ee7d2ed40b9dbc78555932274e82ef314c8a400a1d17aa4626 + category: main + optional: false +- name: gitdb + version: 4.0.11 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + smmap: '>=3.0.1,<6' + url: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + hash: + md5: 623b19f616f2ca0c261441067e18ae40 + sha256: 52ab2798be31b8f509eeec458712f447ced4f96ecb672c6c9a42778f47e07b1b + category: main + optional: false +- name: gitdb + version: 4.0.11 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + smmap: '>=3.0.1,<6' + url: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + hash: + md5: 623b19f616f2ca0c261441067e18ae40 + sha256: 52ab2798be31b8f509eeec458712f447ced4f96ecb672c6c9a42778f47e07b1b + category: main + optional: false +- name: gitdb + version: 4.0.11 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + smmap: '>=3.0.1,<6' + url: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + hash: + md5: 623b19f616f2ca0c261441067e18ae40 + sha256: 52ab2798be31b8f509eeec458712f447ced4f96ecb672c6c9a42778f47e07b1b + category: main + optional: false +- name: gitpython + version: 3.1.42 + manager: conda + platform: linux-64 + dependencies: + gitdb: '>=4.0.1,<5' + python: '>=3.7' + typing_extensions: '>=3.7.4.3' + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.42-pyhd8ed1ab_0.conda + hash: + md5: 6bc8e496351bafd761c0922c3ebd989a + sha256: a11e1cf4404157467d0f51906d1db80bcb8bfe4bb3d3eba703b28e981ea7e308 + category: main + optional: false +- name: gitpython + version: 3.1.42 + manager: conda + platform: osx-64 + dependencies: + gitdb: '>=4.0.1,<5' + python: '>=3.7' + typing_extensions: '>=3.7.4.3' + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.42-pyhd8ed1ab_0.conda + hash: + md5: 6bc8e496351bafd761c0922c3ebd989a + sha256: a11e1cf4404157467d0f51906d1db80bcb8bfe4bb3d3eba703b28e981ea7e308 + category: main + optional: false +- name: gitpython + version: 3.1.42 + manager: conda + platform: win-64 + dependencies: + gitdb: '>=4.0.1,<5' + python: '>=3.7' + typing_extensions: '>=3.7.4.3' + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.42-pyhd8ed1ab_0.conda + hash: + md5: 6bc8e496351bafd761c0922c3ebd989a + sha256: a11e1cf4404157467d0f51906d1db80bcb8bfe4bb3d3eba703b28e981ea7e308 + category: main + optional: false +- name: html5lib + version: '1.1' + manager: conda + platform: linux-64 + dependencies: + python: '' + six: '>=1.9' + webencodings: '' + url: https://conda.anaconda.org/conda-forge/noarch/html5lib-1.1-pyh9f0ad1d_0.tar.bz2 + hash: + md5: b2355343d6315c892543200231d7154a + sha256: 9ad06446fe9847e86cb20d220bf11614afcd2cbe9f58096f08d5d4018877bee4 + category: main + optional: false +- name: html5lib + version: '1.1' + manager: conda + platform: osx-64 + dependencies: + python: '' + six: '>=1.9' + webencodings: '' + url: https://conda.anaconda.org/conda-forge/noarch/html5lib-1.1-pyh9f0ad1d_0.tar.bz2 + hash: + md5: b2355343d6315c892543200231d7154a + sha256: 9ad06446fe9847e86cb20d220bf11614afcd2cbe9f58096f08d5d4018877bee4 + category: main + optional: false +- name: html5lib + version: '1.1' + manager: conda + platform: win-64 + dependencies: + python: '' + six: '>=1.9' + webencodings: '' + url: https://conda.anaconda.org/conda-forge/noarch/html5lib-1.1-pyh9f0ad1d_0.tar.bz2 + hash: + md5: b2355343d6315c892543200231d7154a + sha256: 9ad06446fe9847e86cb20d220bf11614afcd2cbe9f58096f08d5d4018877bee4 + category: main + optional: false +- name: icu + version: '73.2' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda + hash: + md5: cc47e1facc155f91abd89b11e48e72ff + sha256: e12fd90ef6601da2875ebc432452590bc82a893041473bc1c13ef29001a73ea8 + category: main + optional: false +- name: icu + version: '73.2' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda + hash: + md5: 5cc301d759ec03f28328428e28f65591 + sha256: f66362dc36178ac9b7c7a9b012948a9d2d050b3debec24bbd94aadbc44854185 + category: main + optional: false +- name: identify + version: 2.5.35 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + ukkonen: '' + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda + hash: + md5: 9472bfd206a2b7bb8143835e37667054 + sha256: 971683b13d1b820157bef9993c63dd8b0611d2d60fc4b522da163aee2e70e518 + category: main + optional: false +- name: identify + version: 2.5.35 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + ukkonen: '' + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda + hash: + md5: 9472bfd206a2b7bb8143835e37667054 + sha256: 971683b13d1b820157bef9993c63dd8b0611d2d60fc4b522da163aee2e70e518 + category: main + optional: false +- name: identify + version: 2.5.35 + manager: conda + platform: win-64 + dependencies: + python: '>=3.6' + ukkonen: '' + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda + hash: + md5: 9472bfd206a2b7bb8143835e37667054 + sha256: 971683b13d1b820157bef9993c63dd8b0611d2d60fc4b522da163aee2e70e518 + category: main + optional: false +- name: idna + version: '3.6' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + hash: + md5: 1a76f09108576397c41c0b0c5bd84134 + sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07 + category: main + optional: false +- name: idna + version: '3.6' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + hash: + md5: 1a76f09108576397c41c0b0c5bd84134 + sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07 + category: main + optional: false +- name: idna + version: '3.6' + manager: conda + platform: win-64 + dependencies: + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + hash: + md5: 1a76f09108576397c41c0b0c5bd84134 + sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07 + category: main + optional: false +- name: importlib-metadata + version: 7.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + zipp: '>=0.5' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda + hash: + md5: 0896606848b2dc5cebdf111b6543aa04 + sha256: cc2e7d1f7f01cede30feafc1118b7aefa244d0a12224513734e24165ae12ba49 + category: main + optional: false +- name: importlib-metadata + version: 7.1.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + zipp: '>=0.5' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda + hash: + md5: 0896606848b2dc5cebdf111b6543aa04 + sha256: cc2e7d1f7f01cede30feafc1118b7aefa244d0a12224513734e24165ae12ba49 + category: main + optional: false +- name: importlib-metadata + version: 7.1.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.8' + zipp: '>=0.5' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda + hash: + md5: 0896606848b2dc5cebdf111b6543aa04 + sha256: cc2e7d1f7f01cede30feafc1118b7aefa244d0a12224513734e24165ae12ba49 + category: main + optional: false +- name: intel-openmp + version: 2024.0.0 + manager: conda + platform: win-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.0.0-h57928b3_49841.conda + hash: + md5: e3255c8cdaf1d52f15816d1970f9c77a + sha256: 6ee8eb9080bb3268654e015dd17ad79d0c1ea98b2eee6b928ecd27f01d6b38e8 + category: main + optional: false +- name: jaraco.classes + version: 3.3.1 + manager: conda + platform: linux-64 + dependencies: + more-itertools: '' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.3.1-pyhd8ed1ab_0.conda + hash: + md5: c541ae264c9f1f21d83fc30dffb908ee + sha256: 232b40de8176fa7fb66a893653f8ae03c29616e04a83dae5a47df94b74e256ca + category: main + optional: false +- name: jaraco.classes + version: 3.3.1 + manager: conda + platform: osx-64 + dependencies: + more-itertools: '' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.3.1-pyhd8ed1ab_0.conda + hash: + md5: c541ae264c9f1f21d83fc30dffb908ee + sha256: 232b40de8176fa7fb66a893653f8ae03c29616e04a83dae5a47df94b74e256ca + category: main + optional: false +- name: jaraco.classes + version: 3.3.1 + manager: conda + platform: win-64 + dependencies: + more-itertools: '' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.3.1-pyhd8ed1ab_0.conda + hash: + md5: c541ae264c9f1f21d83fc30dffb908ee + sha256: 232b40de8176fa7fb66a893653f8ae03c29616e04a83dae5a47df94b74e256ca + category: main + optional: false +- name: jeepney + version: 0.8.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 9800ad1699b42612478755a2d26c722d + sha256: 16639759b811866d63315fe1391f6fb45f5478b823972f4d3d9f0392b7dd80b8 + category: main + optional: false +- name: jinja2 + version: 3.1.3 + manager: conda + platform: linux-64 + dependencies: + markupsafe: '>=2.0' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + hash: + md5: e7d8df6509ba635247ff9aea31134262 + sha256: fd517b7dd3a61eca34f8a6f9f92f306397149cae1204fce72ac3d227107dafdc + category: main + optional: false +- name: jinja2 + version: 3.1.3 + manager: conda + platform: osx-64 + dependencies: + markupsafe: '>=2.0' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + hash: + md5: e7d8df6509ba635247ff9aea31134262 + sha256: fd517b7dd3a61eca34f8a6f9f92f306397149cae1204fce72ac3d227107dafdc + category: main + optional: false +- name: jinja2 + version: 3.1.3 + manager: conda + platform: win-64 + dependencies: + markupsafe: '>=2.0' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + hash: + md5: e7d8df6509ba635247ff9aea31134262 + sha256: fd517b7dd3a61eca34f8a6f9f92f306397149cae1204fce72ac3d227107dafdc + category: main + optional: false +- name: keyring + version: 24.3.1 + manager: conda + platform: linux-64 + dependencies: + jaraco.classes: '' + jeepney: '>=0.4.2' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + secretstorage: '>=3.2' + url: https://conda.anaconda.org/conda-forge/linux-64/keyring-24.3.1-py312h7900ff3_0.conda + hash: + md5: 7548ce5655764c5fdd98d98a677e68bf + sha256: 23d00575adf8a0974e5e1e5f0859a31e6bfa4178d2ef9f8e0c8c3e405e73c021 + category: main + optional: false +- name: keyring + version: 24.3.1 + manager: conda + platform: osx-64 + dependencies: + jaraco.classes: '' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/osx-64/keyring-24.3.1-py312hb401068_0.conda + hash: + md5: 4d44c57781677af60d7c16eceb1e4937 + sha256: a534dc09ea7afc89da779b8c5e276c904101cde2a689c1055cedaff2f537dfb3 + category: main + optional: false +- name: keyring + version: 24.3.1 + manager: conda + platform: win-64 + dependencies: + jaraco.classes: '' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + pywin32-ctypes: '>=0.2.0' + url: https://conda.anaconda.org/conda-forge/win-64/keyring-24.3.1-py312h2e8e312_0.conda + hash: + md5: bf404ac9e8bcd9dd183bd9b20ee1e561 + sha256: 68394727fb7737e4c657062393df2b1f917ed1dc3ca79f8cd56e67bcfc349a4d + category: main + optional: false +- name: ld_impl_linux-64 + version: '2.40' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda + hash: + md5: 7aca3059a1729aa76c597603f10b0dd3 + sha256: f6cc89d887555912d6c61b295d398cff9ec982a3417d38025c45d5dd9b9e79cd + category: main + optional: false +- name: libblas + version: 3.9.0 + manager: conda + platform: linux-64 + dependencies: + libopenblas: '>=0.3.26,<1.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda + hash: + md5: 0ac9f44fc096772b0aa092119b00c3ca + sha256: ebd5c91f029f779fb88a1fcbd1e499559a9c258e3674ff58a2fbb4e375ae56d9 + category: main + optional: false +- name: libblas + version: 3.9.0 + manager: conda + platform: osx-64 + dependencies: + libopenblas: '>=0.3.26,<1.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-21_osx64_openblas.conda + hash: + md5: 23286066c595986aa0df6452a8416c08 + sha256: 5381eab20f4793996cf22e58461ea8a3a4dff1442bb45663b5920f2d26288688 + category: main + optional: false +- name: libblas + version: 3.9.0 + manager: conda + platform: win-64 + dependencies: + mkl: 2024.0.0 + url: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-21_win64_mkl.conda + hash: + md5: ebba3846d11201fe54277e4965ba5250 + sha256: ad47053cee17802df875203aba191b04d97a50d820dbf75a114a50972c517334 + category: main + optional: false +- name: libcblas + version: 3.9.0 + manager: conda + platform: linux-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda + hash: + md5: 4a3816d06451c4946e2db26b86472cb6 + sha256: 467bbfbfe1a1aeb8b1f9f6485eedd8ed1b6318941bf3702da72336ccf4dc25a6 + category: main + optional: false +- name: libcblas + version: 3.9.0 + manager: conda + platform: osx-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-21_osx64_openblas.conda + hash: + md5: 7a1b54774bad723e8ba01ca48eb301b5 + sha256: e2b1455612d4cfb3ac3170f0c538516ebd0b113780ac6603338245354e1b2f02 + category: main + optional: false +- name: libcblas + version: 3.9.0 + manager: conda + platform: win-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-21_win64_mkl.conda + hash: + md5: 38e5ec23bc2b62f9dd971143aa9dddb7 + sha256: 886505d0a4a5b508b2255991395aadecdad140719ba0d413411fec86491a9283 + category: main + optional: false +- name: libcxx + version: 16.0.6 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda + hash: + md5: 7d6972792161077908b62971802f289a + sha256: 9063271847cf05f3a6cc6cae3e7f0ced032ab5f3a3c9d3f943f876f39c5c2549 + category: main + optional: false +- name: libexpat + version: 2.6.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + hash: + md5: e7ba12deb7020dd080c6c70e7b6f6a3d + sha256: 331bb7c7c05025343ebd79f86ae612b9e1e74d2687b8f3179faec234f986ce19 + category: main + optional: false +- name: libexpat + version: 2.6.2 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda + hash: + md5: 3d1d51c8f716d97c864d12f7af329526 + sha256: a188a77b275d61159a32ab547f7d17892226e7dac4518d2c6ac3ac8fc8dfde92 + category: main + optional: false +- name: libexpat + version: 2.6.2 + manager: conda + platform: win-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda + hash: + md5: bc592d03f62779511d392c175dcece64 + sha256: 79f612f75108f3e16bbdc127d4885bb74729cf66a8702fca0373dad89d40c4b7 + category: main + optional: false +- name: libffi + version: 3.4.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.4.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + hash: + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + category: main + optional: false +- name: libffi + version: 3.4.2 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + hash: + md5: ccb34fb14960ad8b125962d3d79b31a9 + sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f + category: main + optional: false +- name: libffi + version: 3.4.2 + manager: conda + platform: win-64 + dependencies: + vc: '>=14.1,<15.0a0' + vs2015_runtime: '>=14.16.27012' + url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + hash: + md5: 2c96d1b6915b408893f9472569dee135 + sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 + category: main + optional: false +- name: libgcc-ng + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + _openmp_mutex: '>=4.5' + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda + hash: + md5: d4ff227c46917d3b4565302a2bbb276b + sha256: d32f78bfaac282cfe5205f46d558704ad737b8dbf71f9227788a5ca80facaba4 + category: main + optional: false +- name: libgfortran + version: 5.0.0 + manager: conda + platform: osx-64 + dependencies: + libgfortran5: 13.2.0 + url: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda + hash: + md5: 0b6e23a012ee7a9a5f6b244f5a92c1d5 + sha256: 4874422e567b68334705c135c17e5acdca1404de8255673ce30ad3510e00be0d + category: main + optional: false +- name: libgfortran-ng + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + libgfortran5: 13.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda + hash: + md5: e73e9cfd1191783392131e6238bdb3e9 + sha256: 238c16c84124d58307376715839aa152bd4a1bf5a043052938ad6c3137d30245 + category: main + optional: false +- name: libgfortran5 + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=13.2.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda + hash: + md5: 7a6bd7a12a4bd359e2afe6c0fa1acace + sha256: ba8d94e8493222ce155bb264d9de4200e41498a458e866fedf444de809bde8b6 + category: main + optional: false +- name: libgfortran5 + version: 13.2.0 + manager: conda + platform: osx-64 + dependencies: + llvm-openmp: '>=8.0.0' + url: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda + hash: + md5: e4fb4d23ec2870ff3c40d10afe305aec + sha256: da3db4b947e30aec7596a3ef92200d17e774cccbbf7efc47802529a4ca5ca31b + category: main + optional: false +- name: libglib + version: 2.80.0 + manager: conda + platform: linux-64 + dependencies: + libffi: '>=3.4,<4.0a0' + libgcc-ng: '>=12' + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + pcre2: '>=10.43,<10.44.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_1.conda + hash: + md5: 0725f6081030c29b109088639824ff90 + sha256: 636d984568a1e5d915098a5020712f82bb3988635015765c3caf70f1a91340c5 + category: main + optional: false +- name: libgomp + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda + hash: + md5: d211c42b9ce49aee3734fdc828731689 + sha256: 0d3d4b1b0134283ea02d58e8eb5accf3655464cf7159abf098cc694002f8d34e + category: main + optional: false +- name: libhwloc + version: 2.9.3 + manager: conda + platform: win-64 + dependencies: + libxml2: '>=2.11.5,<3.0.0a0' + pthreads-win32: '' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.9.3-default_haede6df_1009.conda + hash: + md5: 87da045f6d26ce9fe20ad76a18f6a18a + sha256: 2e8c4bb7173f281a8e13f333a23c9fb7a1c86d342d7dccdd74f2eb583ddde450 + category: main + optional: false +- name: libiconv + version: '1.17' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + hash: + md5: d66573916ffcf376178462f1b61c941e + sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 + category: main + optional: false +- name: libiconv + version: '1.17' + manager: conda + platform: win-64 + dependencies: + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda + hash: + md5: e1eb10b1cca179f2baa3601e4efc8712 + sha256: 5f844dd19b046d43174ad80c6ea75b5d504020e3b63cfbc4ace97b8730d35c7b + category: main + optional: false +- name: liblapack + version: 3.9.0 + manager: conda + platform: linux-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda + hash: + md5: 1a42f305615c3867684e049e85927531 + sha256: 64b5c35dce00dd6f9f53178b2fe87116282e00967970bd6551a5a42923806ded + category: main + optional: false +- name: liblapack + version: 3.9.0 + manager: conda + platform: osx-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-21_osx64_openblas.conda + hash: + md5: cf0e4d82cfca6cd9d6c9ed3df45907c9 + sha256: 5d0ef4743e8684ad436e31bd3c378d48642815a20c260d358668ba29cd80987a + category: main + optional: false +- name: liblapack + version: 3.9.0 + manager: conda + platform: win-64 + dependencies: + libblas: 3.9.0 + url: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-21_win64_mkl.conda + hash: + md5: c4740f091cb75987390087934354a621 + sha256: 3fa7c08dd4edf59cb0907d2e5b74e6be890e0671f845e1bae892d212d118a7e9 + category: main + optional: false +- name: libnsl + version: 2.0.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + hash: + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + category: main + optional: false +- name: libopenblas + version: 0.3.26 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=12.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda + hash: + md5: 760ae35415f5ba8b15d09df5afe8b23a + sha256: b626954b5a1113dafec8df89fa8bf18ce9b4701464d9f084ddd7fc9fac404bbd + category: main + optional: false +- name: libopenblas + version: 0.3.26 + manager: conda + platform: osx-64 + dependencies: + libgfortran: 5.* + libgfortran5: '>=12.3.0' + llvm-openmp: '>=16.0.6' + url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.26-openmp_hfef2a42_0.conda + hash: + md5: 9df60162aea811087267b515f359536c + sha256: 4a5994cc608708eca19b90b642a144bb073e4a1cd27b824281dfcae67917204e + category: main + optional: false +- name: libsqlite + version: 3.45.2 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda + hash: + md5: 866983a220e27a80cb75e85cb30466a1 + sha256: 8cdbeb7902729e319510a82d7c642402981818702b58812af265ef55d1315473 + category: main + optional: false +- name: libsqlite + version: 3.45.2 + manager: conda + platform: osx-64 + dependencies: + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.2-h92b6c6a_0.conda + hash: + md5: 086f56e13a96a6cfb1bf640505ae6b70 + sha256: 320ec73a4e3dd377757a2595770b8137ec4583df4d7782472d76377cdbdc4543 + category: main + optional: false +- name: libsqlite + version: 3.45.2 + manager: conda + platform: win-64 + dependencies: + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.2-hcfcfb64_0.conda + hash: + md5: f95359f8dc5abf7da7776ece9ef10bc5 + sha256: 4bb24b986550275a6d02835150d943c4c675808d05c0efc5c2a22154d007a69f + category: main + optional: false +- name: libstdcxx-ng + version: 13.2.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda + hash: + md5: f6f6600d18a4047b54f803cf708b868a + sha256: a56c5b11f1e73a86e120e6141a42d9e935a99a2098491ac9e15347a1476ce777 + category: main + optional: false +- name: libuuid + version: 2.38.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + hash: + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + category: main + optional: false +- name: libuv + version: 1.48.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.48.0-hd590300_0.conda + hash: + md5: 7e8b914b1062dd4386e3de4d82a3ead6 + sha256: b7c0e8a0c93c2621be7645b37123d4e8d27e8a974da26a3fba47a9c37711aa7f + category: main + optional: false +- name: libuv + version: 1.48.0 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.48.0-h67532ce_0.conda + hash: + md5: c8e7344c74f0d86584f7ecdc9f25c198 + sha256: fb87f7bfd464a3a841d23f418c86a206818da0c4346984392071d9342c9ea367 + category: main + optional: false +- name: libxcrypt + version: 4.4.36 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + hash: + md5: 5aa797f8787fe7a17d1b0821485b5adc + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + category: main + optional: false +- name: libxml2 + version: 2.12.6 + manager: conda + platform: win-64 + dependencies: + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_1.conda + hash: + md5: eb9f59dd51f50f5aa369813fa63ba569 + sha256: 1846c1318a5987e7315ca3648b55b38e5cfd9853370803a0f5159bc0071609c1 + category: main + optional: false +- name: libzlib + version: 1.2.13 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda + hash: + md5: f36c115f1ee199da648e0597ec2047ad + sha256: 370c7c5893b737596fd6ca0d9190c9715d89d888b8c88537ae1ef168c25e82e4 + category: main + optional: false +- name: libzlib + version: 1.2.13 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda + hash: + md5: 4a3ad23f6e16f99c04e166767193d700 + sha256: fc58ad7f47ffea10df1f2165369978fba0a1cc32594aad778f5eec725f334867 + category: main + optional: false +- name: libzlib + version: 1.2.13 + manager: conda + platform: win-64 + dependencies: + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + hash: + md5: 5fdb9c6a113b6b6cb5e517fd972d5f41 + sha256: c161822ee8130b71e08b6d282b9919c1de2c5274b29921a867bca0f7d30cad26 + category: main + optional: false +- name: llvm-openmp + version: 18.1.2 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.2-hb6ac08f_0.conda + hash: + md5: e7f7e91cfabd8c7172c9ae405214dd68 + sha256: dc40b678f5be2caf4e89ee3dc9037399d0bcd46543bc258dc46e1b92d241c6a6 + category: main + optional: false +- name: m2w64-gcc-libgfortran + version: 5.3.0 + manager: conda + platform: win-64 + dependencies: + m2w64-gcc-libs-core: '' + msys2-conda-epoch: '20160418' + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 + hash: + md5: 066552ac6b907ec6d72c0ddab29050dc + sha256: 9de95a7996d5366ae0808eef2acbc63f9b11b874aa42375f55379e6715845dc6 + category: main + optional: false +- name: m2w64-gcc-libs + version: 5.3.0 + manager: conda + platform: win-64 + dependencies: + m2w64-gcc-libgfortran: '' + m2w64-gcc-libs-core: '' + m2w64-gmp: '' + m2w64-libwinpthread-git: '' + msys2-conda-epoch: '20160418' + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 + hash: + md5: fe759119b8b3bfa720b8762c6fdc35de + sha256: 3bd1ab02b7c89a5b153a17be03b36d833f1517ff2a6a77ead7c4a808b88196aa + category: main + optional: false +- name: m2w64-gcc-libs-core + version: 5.3.0 + manager: conda + platform: win-64 + dependencies: + m2w64-gmp: '' + m2w64-libwinpthread-git: '' + msys2-conda-epoch: '20160418' + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 + hash: + md5: 4289d80fb4d272f1f3b56cfe87ac90bd + sha256: 58afdfe859ed2e9a9b1cc06bc408720cb2c3a6a132e59d4805b090d7574f4ee0 + category: main + optional: false +- name: m2w64-gmp + version: 6.1.0 + manager: conda + platform: win-64 + dependencies: + msys2-conda-epoch: '20160418' + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 + hash: + md5: 53a1c73e1e3d185516d7e3af177596d9 + sha256: 7e3cd95f554660de45f8323fca359e904e8d203efaf07a4d311e46d611481ed1 + category: main + optional: false +- name: m2w64-libwinpthread-git + version: 5.0.0.4634.697f757 + manager: conda + platform: win-64 + dependencies: + msys2-conda-epoch: '20160418' + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 + hash: + md5: 774130a326dee16f1ceb05cc687ee4f0 + sha256: f63a09b2cae7defae0480f1740015d6235f1861afa6fe2e2d3e10bd0d1314ee0 + category: main + optional: false +- name: markupsafe + version: 2.1.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda + hash: + md5: 6ff0b9582da2d4a74a1f9ae1f9ce2af6 + sha256: 273d8efd6c089c534ccbede566394c0ac1e265bfe5d89fe76e80332f3d75a636 + category: main + optional: false +- name: markupsafe + version: 2.1.5 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.5-py312h41838bb_0.conda + hash: + md5: c4a9c25c09cef3901789ca818d9beb10 + sha256: 8dc8f31f78d00713300da000b6ebaa1943a17c112f267de310d5c3d82950079c + category: main + optional: false +- name: markupsafe + version: 2.1.5 + manager: conda + platform: win-64 + dependencies: + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py312he70551f_0.conda + hash: + md5: 4950a739b19edaac1ed29ca9474e49ac + sha256: f8690a3c87e2e96cebd434a829bb95cac43afe6c439530b336dc3452fe4ce4af + category: main + optional: false +- name: mkl + version: 2024.0.0 + manager: conda + platform: win-64 + dependencies: + intel-openmp: 2024.* + tbb: 2021.* + url: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.0.0-h66d3029_49657.conda + hash: + md5: 006b65d9cd436247dfe053df772e041d + sha256: 928bed978827e4c891d0879d79ecda6c9104ed7df1f1d4e2e392c9c80b471be7 + category: main + optional: false +- name: more-itertools + version: 10.2.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.2.0-pyhd8ed1ab_0.conda + hash: + md5: d5c98e9706fdc5328d49a9bf2ce5fb42 + sha256: 9e49e9484ff279453f0b55323a3f0c7cb97440c74f69eecda1f4ad29fae5cd3c + category: main + optional: false +- name: more-itertools + version: 10.2.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.2.0-pyhd8ed1ab_0.conda + hash: + md5: d5c98e9706fdc5328d49a9bf2ce5fb42 + sha256: 9e49e9484ff279453f0b55323a3f0c7cb97440c74f69eecda1f4ad29fae5cd3c + category: main + optional: false +- name: more-itertools + version: 10.2.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.2.0-pyhd8ed1ab_0.conda + hash: + md5: d5c98e9706fdc5328d49a9bf2ce5fb42 + sha256: 9e49e9484ff279453f0b55323a3f0c7cb97440c74f69eecda1f4ad29fae5cd3c + category: main + optional: false +- name: mpi + version: '1.0' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-mpich.tar.bz2 + hash: + md5: c1fcff3417b5a22bbc4cf6e8c23648cf + sha256: cbe8f3bff576ce067141dc34811a6c5c9b56d0da50f28b3cdcc1d6d9661d484c + category: main + optional: false +- name: mpi + version: '1.0' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/mpi-1.0-openmpi.tar.bz2 + hash: + md5: 8c3bc725bf4d10fc6e56031f7543771f + sha256: 1326b28195e8808cebc18a593f84c5cbd606826a150dd7e0365f11b86238b5df + category: main + optional: false +- name: mpi + version: '1.0' + manager: conda + platform: win-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/win-64/mpi-1.0-msmpi.tar.bz2 + hash: + md5: ecf470117289595887c7efda5de48a38 + sha256: afea9b23310bd86b8bf5f2f400fc1eb5c7e2ac60a00edf75ec1a2a6ab5ab065e + category: main + optional: false +- name: mpi4py + version: 3.1.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + mpich: '>=4.2.0,<5.0a0' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-3.1.5-py312h5256a87_1.conda + hash: + md5: 199fd9e8ed4f0042496662eb15b402c3 + sha256: b2122330ec47165cb915767423b1f317c039a0bc1dd34936600d05480d48c855 + category: main + optional: false +- name: mpi4py + version: 3.1.5 + manager: conda + platform: osx-64 + dependencies: + openmpi: '>=4.1.6,<5.0a0' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/osx-64/mpi4py-3.1.5-py312h7154f1a_1.conda + hash: + md5: ad5fdfa2602abde1cd44549c43278e1e + sha256: adbe35062567669f7881630b2312d9e4e584ee51219b0f927d2c71045abafb40 + category: main + optional: false +- name: mpi4py + version: 3.1.5 + manager: conda + platform: win-64 + dependencies: + msmpi: '' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/mpi4py-3.1.5-py312h1bc3dfc_1.conda + hash: + md5: 351595a509b1803f7e5d75c5d1b5088c + sha256: 624e1a007fe53df1d4b189c5a9f8909eddd122030c5fa8c1215657b3ad6df1b9 + category: main + optional: false +- name: mpich + version: 4.2.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libgfortran-ng: '' + libgfortran5: '>=12.3.0' + libstdcxx-ng: '>=12' + mpi: '1.0' + url: https://conda.anaconda.org/conda-forge/linux-64/mpich-4.2.0-h846660c_100.conda + hash: + md5: 9c9c0749155aff3aa3b26b9fd5474806 + sha256: d7384f8d35b540e6353aff65969be18ddfbd66aa5b7354dfdda97b45ce4c9fb6 + category: main + optional: false +- name: msgpack-python + version: 1.0.7 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.7-py312h8572e83_0.conda + hash: + md5: 1ae83e30fae86320e888cb4b1f2d3b47 + sha256: 7657237f2a4d73f48e8c63be9a30f7daf1043398adba8d950122ee70d091e265 + category: main + optional: false +- name: msgpack-python + version: 1.0.7 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/osx-64/msgpack-python-1.0.7-py312hbf0bb39_0.conda + hash: + md5: 2aa4afb76d89d1241e67385b17f6f6ba + sha256: 3eba88b0bcf7aefa830366071f1e19f98468a4be2e9b6fc5d78b69ccc92e3d8b + category: main + optional: false +- name: msgpack-python + version: 1.0.7 + manager: conda + platform: win-64 + dependencies: + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/msgpack-python-1.0.7-py312h0d7def4_0.conda + hash: + md5: d99e74b66f04a1413cff5161f65cd4c9 + sha256: 12e280e397ce9c67d94a9828368617e20ea5b920d94d9d5c6a50293fa32a806e + category: main + optional: false +- name: msmpi + version: 10.1.1 + manager: conda + platform: win-64 + dependencies: + m2w64-gcc-libs: '' + mpi: '1.0' + vc: '>=14.1,<15.0a0' + vs2015_runtime: '>=14.16.27012' + url: https://conda.anaconda.org/conda-forge/win-64/msmpi-10.1.1-h3502643_7.tar.bz2 + hash: + md5: 00c53b79e837c2b7b0b6edffb0bcb55e + sha256: 1c69dc018dbb249e988b4c9ce246ff51ad090eef0138798727632b4952f754a9 + category: main + optional: false +- name: msys2-conda-epoch + version: '20160418' + manager: conda + platform: win-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 + hash: + md5: b0309b72560df66f71a9d5e34a5efdfa + sha256: 99358d58d778abee4dca82ad29fb58058571f19b0f86138363c260049d4ac7f1 + category: main + optional: false +- name: ncurses + version: 6.4.20240210 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda + hash: + md5: 97da8860a0da5413c7c98a3b3838a645 + sha256: aa0f005b6727aac6507317ed490f0904430584fa8ca722657e7f0fb94741de81 + category: main + optional: false +- name: ncurses + version: 6.4.20240210 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4.20240210-h73e2aa4_0.conda + hash: + md5: 50f28c512e9ad78589e3eab34833f762 + sha256: 50b72acf08acbc4e5332807653e2ca6b26d4326e8af16fad1fd3f2ce9ea55503 + category: main + optional: false +- name: nodeenv + version: 1.8.0 + manager: conda + platform: linux-64 + dependencies: + python: 2.7|>=3.7 + setuptools: '' + url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda + hash: + md5: 2a75b296096adabbabadd5e9782e5fcc + sha256: 1320306234552717149f36f825ddc7e27ea295f24829e9db4cc6ceaff0b032bd + category: main + optional: false +- name: nodeenv + version: 1.8.0 + manager: conda + platform: osx-64 + dependencies: + python: 2.7|>=3.7 + setuptools: '' + url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda + hash: + md5: 2a75b296096adabbabadd5e9782e5fcc + sha256: 1320306234552717149f36f825ddc7e27ea295f24829e9db4cc6ceaff0b032bd + category: main + optional: false +- name: nodeenv + version: 1.8.0 + manager: conda + platform: win-64 + dependencies: + python: 2.7|>=3.7 + setuptools: '' + url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda + hash: + md5: 2a75b296096adabbabadd5e9782e5fcc + sha256: 1320306234552717149f36f825ddc7e27ea295f24829e9db4cc6ceaff0b032bd + category: main + optional: false +- name: nodejs + version: 20.9.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + icu: '>=73.2,<74.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libuv: '>=1.48.0,<1.49.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.2.1,<4.0a0' + zlib: '' + url: https://conda.anaconda.org/conda-forge/linux-64/nodejs-20.9.0-hb753e55_1.conda + hash: + md5: b1913a348ca9b487ffa637087806a50f + sha256: 51056ec0687effa5ec90e54460435f7f96975e7554df3489dce21a79a29be703 + category: main + optional: false +- name: nodejs + version: 20.9.0 + manager: conda + platform: osx-64 + dependencies: + icu: '>=73.2,<74.0a0' + libcxx: '>=16' + libuv: '>=1.48.0,<1.49.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.2.1,<4.0a0' + zlib: '' + url: https://conda.anaconda.org/conda-forge/osx-64/nodejs-20.9.0-hfc0f20e_1.conda + hash: + md5: a72caa23202a8160d773906ceb4f647b + sha256: 41619708807c11bce58741f89e087a80a2c01bb4c2536d78d7790b0f0aae1e41 + category: main + optional: false +- name: nodejs + version: 20.9.0 + manager: conda + platform: win-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/win-64/nodejs-20.9.0-h57928b3_1.conda + hash: + md5: 49cdc4313bb30e703f024ee0005e33ea + sha256: 144e5f8fb290c44dadda65e0bc43207be3b85b92749bbf9d92622917177a27a3 + category: main + optional: false +- name: numpy + version: 1.26.4 + manager: conda + platform: linux-64 + dependencies: + libblas: '>=3.9.0,<4.0a0' + libcblas: '>=3.9.0,<4.0a0' + libgcc-ng: '>=12' + liblapack: '>=3.9.0,<4.0a0' + libstdcxx-ng: '>=12' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + hash: + md5: d8285bea2a350f63fab23bf460221f3f + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + category: main + optional: false +- name: numpy + version: 1.26.4 + manager: conda + platform: osx-64 + dependencies: + libblas: '>=3.9.0,<4.0a0' + libcblas: '>=3.9.0,<4.0a0' + libcxx: '>=16' + liblapack: '>=3.9.0,<4.0a0' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py312he3a82b2_0.conda + hash: + md5: 96c61a21c4276613748dba069554846b + sha256: 6152b73fba3e227afa4952df8753128fc9669bbaf142ee8f9972bf9df3bf8856 + category: main + optional: false +- name: numpy + version: 1.26.4 + manager: conda + platform: win-64 + dependencies: + libblas: '>=3.9.0,<4.0a0' + libcblas: '>=3.9.0,<4.0a0' + liblapack: '>=3.9.0,<4.0a0' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py312h8753938_0.conda + hash: + md5: f9ac74c3b07c396014434aca1e58d362 + sha256: 73570817a5109d396b4ebbe5124a89525959269fd33fa33fd413700289fbe0ef + category: main + optional: false +- name: openmpi + version: 4.1.6 + manager: conda + platform: osx-64 + dependencies: + __osx: '>=10.9' + libcxx: '>=16.0.6' + libgfortran: 5.* + libgfortran5: '>=13.2.0' + libzlib: '>=1.2.13,<1.3.0a0' + mpi: '1.0' + zlib: '' + url: https://conda.anaconda.org/conda-forge/osx-64/openmpi-4.1.6-h7406208_101.conda + hash: + md5: ed5a66d291ed28e1e1f9153ab24c3132 + sha256: ec9826d23e72acc6311e3e8a96a340d22b8ec9b72a66567c7fe21853e422851e + category: main + optional: false +- name: openssl + version: 3.2.1 + manager: conda + platform: linux-64 + dependencies: + ca-certificates: '' + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda + hash: + md5: 9d731343cff6ee2e5a25c4a091bf8e2a + sha256: 2c689444ed19a603be457284cf2115ee728a3fafb7527326e96054dee7cdc1a7 + category: main + optional: false +- name: openssl + version: 3.2.1 + manager: conda + platform: osx-64 + dependencies: + ca-certificates: '' + url: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.2.1-hd75f5a5_1.conda + hash: + md5: 570a6f04802df580be529f3a72d2bbf7 + sha256: 7ae0ac6a1673584a8a380c2ff3d46eca48ed53bc7174c0d4eaa0dd2f247a0984 + category: main + optional: false +- name: openssl + version: 3.2.1 + manager: conda + platform: win-64 + dependencies: + ca-certificates: '' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_1.conda + hash: + md5: 958e0418e93e50c575bff70fbcaa12d8 + sha256: 61ce4e11c3c26ed4e4d9b7e7e2483121a1741ad0f9c8db0a91a28b6e05182ce6 + category: main + optional: false +- name: packaging + version: '24.0' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + hash: + md5: 248f521b64ce055e7feae3105e7abeb8 + sha256: a390182d74c31dfd713c16db888c92c277feeb6d1fe96ff9d9c105f9564be48a + category: main + optional: false +- name: packaging + version: '24.0' + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + hash: + md5: 248f521b64ce055e7feae3105e7abeb8 + sha256: a390182d74c31dfd713c16db888c92c277feeb6d1fe96ff9d9c105f9564be48a + category: main + optional: false +- name: packaging + version: '24.0' + manager: conda + platform: win-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + hash: + md5: 248f521b64ce055e7feae3105e7abeb8 + sha256: a390182d74c31dfd713c16db888c92c277feeb6d1fe96ff9d9c105f9564be48a + category: main + optional: false +- name: pastel + version: 0.2.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/pastel-0.2.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: a4eea5bff523f26442405bc5d1f52adb + sha256: 9153f0f38c76a09da7688a61fdbf8f3d7504e2326bef53e4ec20d994311b15bd + category: main + optional: false +- name: pastel + version: 0.2.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/pastel-0.2.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: a4eea5bff523f26442405bc5d1f52adb + sha256: 9153f0f38c76a09da7688a61fdbf8f3d7504e2326bef53e4ec20d994311b15bd + category: main + optional: false +- name: pastel + version: 0.2.1 + manager: conda + platform: win-64 + dependencies: + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/pastel-0.2.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: a4eea5bff523f26442405bc5d1f52adb + sha256: 9153f0f38c76a09da7688a61fdbf8f3d7504e2326bef53e4ec20d994311b15bd + category: main + optional: false +- name: pcre2 + version: '10.43' + manager: conda + platform: linux-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda + hash: + md5: 8292dea9e022d9610a11fce5e0896ed8 + sha256: 766dd986a7ed6197676c14699000bba2625fd26c8a890fcb7a810e5cf56155bc + category: main + optional: false +- name: pexpect + version: 4.9.0 + manager: conda + platform: linux-64 + dependencies: + ptyprocess: '>=0.5' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda + hash: + md5: 629f3203c99b32e0988910c93e77f3b6 + sha256: 90a09d134a4a43911b716d4d6eb9d169238aff2349056f7323d9db613812667e + category: main + optional: false +- name: pexpect + version: 4.9.0 + manager: conda + platform: osx-64 + dependencies: + ptyprocess: '>=0.5' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda + hash: + md5: 629f3203c99b32e0988910c93e77f3b6 + sha256: 90a09d134a4a43911b716d4d6eb9d169238aff2349056f7323d9db613812667e + category: main + optional: false +- name: pexpect + version: 4.9.0 + manager: conda + platform: win-64 + dependencies: + ptyprocess: '>=0.5' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda + hash: + md5: 629f3203c99b32e0988910c93e77f3b6 + sha256: 90a09d134a4a43911b716d4d6eb9d169238aff2349056f7323d9db613812667e + category: main + optional: false +- name: pkginfo + version: 1.10.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.10.0-pyhd8ed1ab_0.conda + hash: + md5: 8c6a4a704308f5d91f3a974a72db1096 + sha256: 3e833f907039646e34d23203cd5c9cc487a451d955d8c8d6581e18a8ccef4cee + category: main + optional: false +- name: pkginfo + version: 1.10.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.10.0-pyhd8ed1ab_0.conda + hash: + md5: 8c6a4a704308f5d91f3a974a72db1096 + sha256: 3e833f907039646e34d23203cd5c9cc487a451d955d8c8d6581e18a8ccef4cee + category: main + optional: false +- name: pkginfo + version: 1.10.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.10.0-pyhd8ed1ab_0.conda + hash: + md5: 8c6a4a704308f5d91f3a974a72db1096 + sha256: 3e833f907039646e34d23203cd5c9cc487a451d955d8c8d6581e18a8ccef4cee + category: main + optional: false +- name: platformdirs + version: 4.2.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + hash: + md5: a0bc3eec34b0fab84be6b2da94e98e20 + sha256: 2ebfb971236ab825dd79dd6086ea742a9901008ffb9c6222c1f2b5172a8039d3 + category: main + optional: false +- name: platformdirs + version: 4.2.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + hash: + md5: a0bc3eec34b0fab84be6b2da94e98e20 + sha256: 2ebfb971236ab825dd79dd6086ea742a9901008ffb9c6222c1f2b5172a8039d3 + category: main + optional: false +- name: platformdirs + version: 4.2.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + hash: + md5: a0bc3eec34b0fab84be6b2da94e98e20 + sha256: 2ebfb971236ab825dd79dd6086ea742a9901008ffb9c6222c1f2b5172a8039d3 + category: main + optional: false +- name: poetry + version: 1.8.2 + manager: conda + platform: linux-64 + dependencies: + __linux: '' + cachecontrol: '>=0.14.0,<0.15.0' + cachecontrol-with-filecache: '' + cleo: '>=2.1.0,<3.0.0' + crashtest: '>=0.4.1,<0.5.0' + dulwich: '>=0.21.2,<0.22.0' + importlib-metadata: '>=4.4' + keyring: '>=24.0.0,<25.0.0' + packaging: '>=23.1' + pexpect: '>=4.7.0,<5.0.0' + pkginfo: '>=1.9.4,<2.0.0' + platformdirs: '>=3.0.0,<5' + poetry-core: 1.9.0.* + poetry-plugin-export: '>=1.6.0,<2.0.0' + pyproject_hooks: '>=1.0.0,<2.0.0' + python: '>=3.8,<4.0' + python-build: '>=1.0.3,<2.0.0' + python-fastjsonschema: '>=2.18.0,<3.0.0' + python-installer: '>=0.7.0,<0.8.0' + requests: '>=2.26.0,<3.0.0' + requests-toolbelt: '>=1.0.0,<2.0.0' + shellingham: '>=1.5.0,<2.0.0' + tomli: '>=2.0.1,<3.0.0' + tomlkit: '>=0.11.4,<1.0.0' + trove-classifiers: '>=2022.5.19' + virtualenv: '>=20.23.0,<21.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/poetry-1.8.2-linux_pyha804496_0.conda + hash: + md5: 7ced2e0d172efd9b108b1fed18e4bea6 + sha256: 6012430d2dc1af9ed821496f05b81bf4ca679eba74c91faf9d16711e86b04c01 + category: main + optional: false +- name: poetry + version: 1.8.2 + manager: conda + platform: osx-64 + dependencies: + __osx: '' + cachecontrol: '>=0.14.0,<0.15.0' + cachecontrol-with-filecache: '' + cleo: '>=2.1.0,<3.0.0' + crashtest: '>=0.4.1,<0.5.0' + dulwich: '>=0.21.2,<0.22.0' + importlib-metadata: '>=4.4' + keyring: '>=24.0.0,<25.0.0' + packaging: '>=23.1' + pexpect: '>=4.7.0,<5.0.0' + pkginfo: '>=1.9.4,<2.0.0' + platformdirs: '>=3.0.0,<5' + poetry-core: 1.9.0.* + poetry-plugin-export: '>=1.6.0,<2.0.0' + pyproject_hooks: '>=1.0.0,<2.0.0' + python: '>=3.8,<4.0' + python-build: '>=1.0.3,<2.0.0' + python-fastjsonschema: '>=2.18.0,<3.0.0' + python-installer: '>=0.7.0,<0.8.0' + requests: '>=2.26.0,<3.0.0' + requests-toolbelt: '>=1.0.0,<2.0.0' + shellingham: '>=1.5.0,<2.0.0' + tomli: '>=2.0.1,<3.0.0' + tomlkit: '>=0.11.4,<1.0.0' + trove-classifiers: '>=2022.5.19' + virtualenv: '>=20.23.0,<21.0.0' + xattr: '>=1.0.0,<2.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/poetry-1.8.2-osx_pyh534df25_0.conda + hash: + md5: 05c70f609ab7963a9301afc11e942519 + sha256: e7c857a05636e6207bbb0cf5bf12d139d9d6804d3a3a5a1a2f08131d792c4a56 + category: main + optional: false +- name: poetry + version: 1.8.2 + manager: conda + platform: win-64 + dependencies: + __win: '' + cachecontrol: '>=0.14.0,<0.15.0' + cachecontrol-with-filecache: '' + cleo: '>=2.1.0,<3.0.0' + crashtest: '>=0.4.1,<0.5.0' + dulwich: '>=0.21.2,<0.22.0' + importlib-metadata: '>=4.4' + keyring: '>=24.0.0,<25.0.0' + packaging: '>=23.1' + pexpect: '>=4.7.0,<5.0.0' + pkginfo: '>=1.9.4,<2.0.0' + platformdirs: '>=3.0.0,<5' + poetry-core: 1.9.0.* + poetry-plugin-export: '>=1.6.0,<2.0.0' + pyproject_hooks: '>=1.0.0,<2.0.0' + python: '>=3.8,<4.0' + python-build: '>=1.0.3,<2.0.0' + python-fastjsonschema: '>=2.18.0,<3.0.0' + python-installer: '>=0.7.0,<0.8.0' + requests: '>=2.26.0,<3.0.0' + requests-toolbelt: '>=1.0.0,<2.0.0' + shellingham: '>=1.5.0,<2.0.0' + tomli: '>=2.0.1,<3.0.0' + tomlkit: '>=0.11.4,<1.0.0' + trove-classifiers: '>=2022.5.19' + virtualenv: '>=20.23.0,<21.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/poetry-1.8.2-win_pyh7428d3b_0.conda + hash: + md5: 26779c1e64baa95a275a6bc85e53a342 + sha256: 3fffafdcc3f6db9d63bbc70b4f910b3c0437775afa2d6a08f4bc9244ca51f80b + category: main + optional: false +- name: poetry-core + version: 1.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8.0,<4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/poetry-core-1.9.0-pyhd8ed1ab_0.conda + hash: + md5: f9f26b837a81a128648353803950929e + sha256: eb1a1351bda0157257c3cf6074e7203812736319e664b6bbe78befc863b2d542 + category: main + optional: false +- name: poetry-core + version: 1.9.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8.0,<4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/poetry-core-1.9.0-pyhd8ed1ab_0.conda + hash: + md5: f9f26b837a81a128648353803950929e + sha256: eb1a1351bda0157257c3cf6074e7203812736319e664b6bbe78befc863b2d542 + category: main + optional: false +- name: poetry-core + version: 1.9.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.8.0,<4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/poetry-core-1.9.0-pyhd8ed1ab_0.conda + hash: + md5: f9f26b837a81a128648353803950929e + sha256: eb1a1351bda0157257c3cf6074e7203812736319e664b6bbe78befc863b2d542 + category: main + optional: false +- name: poetry-plugin-export + version: 1.7.1 + manager: conda + platform: linux-64 + dependencies: + poetry-core: '>=1.7.0,<2.0.0' + python: '>=3.8.0,<4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/poetry-plugin-export-1.7.1-pyhd8ed1ab_0.conda + hash: + md5: fcf1aa3bd31aefa3b1c520684be244a9 + sha256: 05b9a3de7e84cdc640b230f96c05939e101fc5a7ef964442c8ff0717206c88f0 + category: main + optional: false +- name: poetry-plugin-export + version: 1.7.1 + manager: conda + platform: osx-64 + dependencies: + poetry-core: '>=1.7.0,<2.0.0' + python: '>=3.8.0,<4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/poetry-plugin-export-1.7.1-pyhd8ed1ab_0.conda + hash: + md5: fcf1aa3bd31aefa3b1c520684be244a9 + sha256: 05b9a3de7e84cdc640b230f96c05939e101fc5a7ef964442c8ff0717206c88f0 + category: main + optional: false +- name: poetry-plugin-export + version: 1.7.1 + manager: conda + platform: win-64 + dependencies: + poetry-core: '>=1.7.0,<2.0.0' + python: '>=3.8.0,<4.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/poetry-plugin-export-1.7.1-pyhd8ed1ab_0.conda + hash: + md5: fcf1aa3bd31aefa3b1c520684be244a9 + sha256: 05b9a3de7e84cdc640b230f96c05939e101fc5a7ef964442c8ff0717206c88f0 + category: main + optional: false +- name: pre-commit + version: 3.7.0 + manager: conda + platform: linux-64 + dependencies: + cfgv: '>=2.0.0' + identify: '>=1.0.0' + nodeenv: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + virtualenv: '>=20.10.0' + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda + hash: + md5: 846ba0877cda9c4f11e13720cacd1968 + sha256: b7a1d56fb1374df77019521bbcbe109ff17337181c4d392918e5ec1a10a9df87 + category: main + optional: false +- name: pre-commit + version: 3.7.0 + manager: conda + platform: osx-64 + dependencies: + cfgv: '>=2.0.0' + identify: '>=1.0.0' + nodeenv: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + virtualenv: '>=20.10.0' + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda + hash: + md5: 846ba0877cda9c4f11e13720cacd1968 + sha256: b7a1d56fb1374df77019521bbcbe109ff17337181c4d392918e5ec1a10a9df87 + category: main + optional: false +- name: pre-commit + version: 3.7.0 + manager: conda + platform: win-64 + dependencies: + cfgv: '>=2.0.0' + identify: '>=1.0.0' + nodeenv: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + virtualenv: '>=20.10.0' + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda + hash: + md5: 846ba0877cda9c4f11e13720cacd1968 + sha256: b7a1d56fb1374df77019521bbcbe109ff17337181c4d392918e5ec1a10a9df87 + category: main + optional: false +- name: pthreads-win32 + version: 2.9.1 + manager: conda + platform: win-64 + dependencies: + vc: 14.* + url: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2 + hash: + md5: e2da8758d7d51ff6aa78a14dfb9dbed4 + sha256: 576a228630a72f25d255a5e345e5f10878e153221a96560f2498040cd6f54005 + category: main + optional: false +- name: ptyprocess + version: 0.7.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + hash: + md5: 359eeb6536da0e687af562ed265ec263 + sha256: fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a + category: main + optional: false +- name: ptyprocess + version: 0.7.0 + manager: conda + platform: osx-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + hash: + md5: 359eeb6536da0e687af562ed265ec263 + sha256: fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a + category: main + optional: false +- name: ptyprocess + version: 0.7.0 + manager: conda + platform: win-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + hash: + md5: 359eeb6536da0e687af562ed265ec263 + sha256: fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a + category: main + optional: false +- name: pycparser + version: '2.21' + manager: conda + platform: linux-64 + dependencies: + python: 2.7.*|>=3.4 + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 076becd9e05608f8dc72757d5f3a91ff + sha256: 74c63fd03f1f1ea2b54e8bc529fd1a600aaafb24027b738d0db87909ee3a33dc + category: main + optional: false +- name: pycparser + version: '2.21' + manager: conda + platform: osx-64 + dependencies: + python: 2.7.*|>=3.4 + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 076becd9e05608f8dc72757d5f3a91ff + sha256: 74c63fd03f1f1ea2b54e8bc529fd1a600aaafb24027b738d0db87909ee3a33dc + category: main + optional: false +- name: pycparser + version: '2.21' + manager: conda + platform: win-64 + dependencies: + python: 2.7.*|>=3.4 + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 076becd9e05608f8dc72757d5f3a91ff + sha256: 74c63fd03f1f1ea2b54e8bc529fd1a600aaafb24027b738d0db87909ee3a33dc + category: main + optional: false +- name: pydantic + version: 2.6.4 + manager: conda + platform: linux-64 + dependencies: + annotated-types: '>=0.4.0' + pydantic-core: 2.16.3 + python: '>=3.7' + typing-extensions: '>=4.6.1' + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.6.4-pyhd8ed1ab_0.conda + hash: + md5: 2e8e9f16431085f4b5a218b31fe557a3 + sha256: 9747044e91a607c175bbce67fdb5865de5373151098bbb4a2cd79bc05666a299 + category: main + optional: false +- name: pydantic + version: 2.6.4 + manager: conda + platform: osx-64 + dependencies: + annotated-types: '>=0.4.0' + pydantic-core: 2.16.3 + python: '>=3.7' + typing-extensions: '>=4.6.1' + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.6.4-pyhd8ed1ab_0.conda + hash: + md5: 2e8e9f16431085f4b5a218b31fe557a3 + sha256: 9747044e91a607c175bbce67fdb5865de5373151098bbb4a2cd79bc05666a299 + category: main + optional: false +- name: pydantic + version: 2.6.4 + manager: conda + platform: win-64 + dependencies: + annotated-types: '>=0.4.0' + pydantic-core: 2.16.3 + python: '>=3.7' + typing-extensions: '>=4.6.1' + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.6.4-pyhd8ed1ab_0.conda + hash: + md5: 2e8e9f16431085f4b5a218b31fe557a3 + sha256: 9747044e91a607c175bbce67fdb5865de5373151098bbb4a2cd79bc05666a299 + category: main + optional: false +- name: pydantic-core + version: 2.16.3 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + typing-extensions: '>=4.6.0,!=4.7.0' + url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.16.3-py312h4b3b743_0.conda + hash: + md5: 891952a48cded31e909dac06a1e0311f + sha256: 1a20fada51e2edd5019900b566a7140ab07e1fc687fbd12f6a5f344295846d93 + category: main + optional: false +- name: pydantic-core + version: 2.16.3 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + typing-extensions: '>=4.6.0,!=4.7.0' + url: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.16.3-py312h1b0e595_0.conda + hash: + md5: de58d43f5fa908c07e2462c8401b9a7c + sha256: 5445c03a37c01c36c4f1afa1947d573a58fb4b75d98619b198f51a410133a1fd + category: main + optional: false +- name: pydantic-core + version: 2.16.3 + manager: conda + platform: win-64 + dependencies: + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + typing-extensions: '>=4.6.0,!=4.7.0' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.16.3-py312hfccd98a_0.conda + hash: + md5: de81a2ee8910c861b461edc12d7d7a41 + sha256: bdc8a0e2c280caaa6fa347d1ccc3427a9000d6351f3e95a0881fc577479ca97e + category: main + optional: false +- name: pylev + version: 1.4.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.3' + url: https://conda.anaconda.org/conda-forge/noarch/pylev-1.4.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: edf8651c4379d9d1495ad6229622d150 + sha256: 50bd91767686bfe769e50a5a1b883e238d944a6163fea43e7c0beaac54ca674f + category: main + optional: false +- name: pylev + version: 1.4.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.3' + url: https://conda.anaconda.org/conda-forge/noarch/pylev-1.4.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: edf8651c4379d9d1495ad6229622d150 + sha256: 50bd91767686bfe769e50a5a1b883e238d944a6163fea43e7c0beaac54ca674f + category: main + optional: false +- name: pylev + version: 1.4.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.3' + url: https://conda.anaconda.org/conda-forge/noarch/pylev-1.4.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: edf8651c4379d9d1495ad6229622d150 + sha256: 50bd91767686bfe769e50a5a1b883e238d944a6163fea43e7c0beaac54ca674f + category: main + optional: false +- name: pyproject_hooks + version: 1.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.0.0-pyhd8ed1ab_0.conda + hash: + md5: 21de50391d584eb7f4441b9de1ad773f + sha256: 016340837fcfef57b351febcbe855eedf0c1f0ecfc910ed48c7fbd20535f9847 + category: main + optional: false +- name: pyproject_hooks + version: 1.0.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.0.0-pyhd8ed1ab_0.conda + hash: + md5: 21de50391d584eb7f4441b9de1ad773f + sha256: 016340837fcfef57b351febcbe855eedf0c1f0ecfc910ed48c7fbd20535f9847 + category: main + optional: false +- name: pyproject_hooks + version: 1.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.0.0-pyhd8ed1ab_0.conda + hash: + md5: 21de50391d584eb7f4441b9de1ad773f + sha256: 016340837fcfef57b351febcbe855eedf0c1f0ecfc910ed48c7fbd20535f9847 + category: main + optional: false +- name: pysocks + version: 1.7.1 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + hash: + md5: 2a7de29fb590ca14b5243c4c812c8025 + sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b + category: main + optional: false +- name: pysocks + version: 1.7.1 + manager: conda + platform: osx-64 + dependencies: + __unix: '' + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + hash: + md5: 2a7de29fb590ca14b5243c4c812c8025 + sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b + category: main + optional: false +- name: pysocks + version: 1.7.1 + manager: conda + platform: win-64 + dependencies: + __win: '' + python: '>=3.8' + win_inet_pton: '' + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 + hash: + md5: 56cd9fe388baac0e90c7149cfac95b60 + sha256: b3a612bc887f3dd0fb7c4199ad8e342bd148cf69a9b74fd9468a18cf2bef07b7 + category: main + optional: false +- name: python + version: 3.12.2 + manager: conda + platform: linux-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + ld_impl_linux-64: '>=2.36.1' + libexpat: '>=2.5.0,<3.0a0' + libffi: '>=3.4,<4.0a0' + libgcc-ng: '>=12' + libnsl: '>=2.0.1,<2.1.0a0' + libsqlite: '>=3.45.1,<4.0a0' + libuuid: '>=2.38.1,<3.0a0' + libxcrypt: '>=4.4.36' + libzlib: '>=1.2.13,<1.3.0a0' + ncurses: '>=6.4,<7.0a0' + openssl: '>=3.2.1,<4.0a0' + readline: '>=8.2,<9.0a0' + tk: '>=8.6.13,<8.7.0a0' + tzdata: '' + xz: '>=5.2.6,<6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.2-hab00c5b_0_cpython.conda + hash: + md5: ad7b68400f3a6ebe72b00be093c7f301 + sha256: ddb7a2d8d78046bda5d7631e6814f9468d2eb054e10f86f4648c9d1fdaa30c0f + category: main + optional: false +- name: python + version: 3.12.2 + manager: conda + platform: osx-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libexpat: '>=2.5.0,<3.0a0' + libffi: '>=3.4,<4.0a0' + libsqlite: '>=3.45.1,<4.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + ncurses: '>=6.4,<7.0a0' + openssl: '>=3.2.1,<4.0a0' + readline: '>=8.2,<9.0a0' + tk: '>=8.6.13,<8.7.0a0' + tzdata: '' + xz: '>=5.2.6,<6.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.2-h9f0c242_0_cpython.conda + hash: + md5: 0179b8007ba008cf5bec11f3b3853902 + sha256: 7647ac06c3798a182a4bcb1ff58864f1ef81eb3acea6971295304c23e43252fb + category: main + optional: false +- name: python + version: 3.12.2 + manager: conda + platform: win-64 + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libexpat: '>=2.5.0,<3.0a0' + libffi: '>=3.4,<4.0a0' + libsqlite: '>=3.45.1,<4.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.2.1,<4.0a0' + tk: '>=8.6.13,<8.7.0a0' + tzdata: '' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + xz: '>=5.2.6,<6.0a0' + url: https://conda.anaconda.org/conda-forge/win-64/python-3.12.2-h2628c8c_0_cpython.conda + hash: + md5: be8803e9f75a477df61d4aabea3c1246 + sha256: b8eda863b48ae4531635e23fd15e759d93212b6204c6847d591e25fa5fd67477 + category: main + optional: false +- name: python-build + version: 1.2.1 + manager: conda + platform: linux-64 + dependencies: + colorama: '' + importlib-metadata: '>=4.6' + packaging: '>=19.0' + pyproject_hooks: '' + python: '>=3.8' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.1-pyhd8ed1ab_0.conda + hash: + md5: d657cde3b3943fcedf6038138eea84de + sha256: 3104051be7279d1b15f0a4be79f4bfeaf3a42b2900d24a7ad8e980df903fe8db + category: main + optional: false +- name: python-build + version: 1.2.1 + manager: conda + platform: osx-64 + dependencies: + colorama: '' + importlib-metadata: '>=4.6' + packaging: '>=19.0' + pyproject_hooks: '' + python: '>=3.8' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.1-pyhd8ed1ab_0.conda + hash: + md5: d657cde3b3943fcedf6038138eea84de + sha256: 3104051be7279d1b15f0a4be79f4bfeaf3a42b2900d24a7ad8e980df903fe8db + category: main + optional: false +- name: python-build + version: 1.2.1 + manager: conda + platform: win-64 + dependencies: + colorama: '' + importlib-metadata: '>=4.6' + packaging: '>=19.0' + pyproject_hooks: '' + python: '>=3.8' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/python-build-1.2.1-pyhd8ed1ab_0.conda + hash: + md5: d657cde3b3943fcedf6038138eea84de + sha256: 3104051be7279d1b15f0a4be79f4bfeaf3a42b2900d24a7ad8e980df903fe8db + category: main + optional: false +- name: python-fastjsonschema + version: 2.19.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.3' + url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.1-pyhd8ed1ab_0.conda + hash: + md5: 4d3ceee3af4b0f9a1f48f57176bf8625 + sha256: 38b2db169d65cc5595e3ce63294c4fdb6a242ecf71f70b3ad8cad3bd4230d82f + category: main + optional: false +- name: python-fastjsonschema + version: 2.19.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.3' + url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.1-pyhd8ed1ab_0.conda + hash: + md5: 4d3ceee3af4b0f9a1f48f57176bf8625 + sha256: 38b2db169d65cc5595e3ce63294c4fdb6a242ecf71f70b3ad8cad3bd4230d82f + category: main + optional: false +- name: python-fastjsonschema + version: 2.19.1 + manager: conda + platform: win-64 + dependencies: + python: '>=3.3' + url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.1-pyhd8ed1ab_0.conda + hash: + md5: 4d3ceee3af4b0f9a1f48f57176bf8625 + sha256: 38b2db169d65cc5595e3ce63294c4fdb6a242ecf71f70b3ad8cad3bd4230d82f + category: main + optional: false +- name: python-installer + version: 0.7.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/python-installer-0.7.0-pyhd8ed1ab_0.conda + hash: + md5: 65dea78f903d686c8b0c2feaf0e15e1f + sha256: 822f95b7786cfa61a6519153117b21d93194890e02a884b9f66ee4275e4f1c0a + category: main + optional: false +- name: python-installer + version: 0.7.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/python-installer-0.7.0-pyhd8ed1ab_0.conda + hash: + md5: 65dea78f903d686c8b0c2feaf0e15e1f + sha256: 822f95b7786cfa61a6519153117b21d93194890e02a884b9f66ee4275e4f1c0a + category: main + optional: false +- name: python-installer + version: 0.7.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/python-installer-0.7.0-pyhd8ed1ab_0.conda + hash: + md5: 65dea78f903d686c8b0c2feaf0e15e1f + sha256: 822f95b7786cfa61a6519153117b21d93194890e02a884b9f66ee4275e4f1c0a + category: main + optional: false +- name: python_abi + version: '3.12' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda + hash: + md5: dccc2d142812964fcc6abdc97b672dff + sha256: 182a329de10a4165f6e8a3804caf751f918f6ea6176dd4e5abcdae1ed3095bf6 + category: main + optional: false +- name: python_abi + version: '3.12' + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-4_cp312.conda + hash: + md5: 87201ac4314b911b74197e588cca3639 + sha256: 82c154d95c1637604671a02a89e72f1382e89a4269265a03506496bd928f6f14 + category: main + optional: false +- name: python_abi + version: '3.12' + manager: conda + platform: win-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-4_cp312.conda + hash: + md5: 17f4ccf6be9ded08bd0a376f489ac1a6 + sha256: 488f8519d04b48f59bd6fde21ebe2d7a527718ff28aac86a8b53aa63658bdef6 + category: main + optional: false +- name: pywin32-ctypes + version: 0.2.2 + manager: conda + platform: win-64 + dependencies: + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/win-64/pywin32-ctypes-0.2.2-py312h2e8e312_1.conda + hash: + md5: 93a37178188cd6521e5410763a18aaf4 + sha256: 238fffa911c4b78fd2153cfd1d0d376326379c98821da4b0cd12a3c6fbf3e9a6 + category: main + optional: false +- name: pyyaml + version: 6.0.1 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + yaml: '>=0.2.5,<0.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda + hash: + md5: e3fd78d8d490af1d84763b9fe3f2e552 + sha256: 7f347a10a7121b08d79d21cd4f438c07c23479ea0c74dfb89d6dc416f791bb7f + category: main + optional: false +- name: pyyaml + version: 6.0.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + yaml: '>=0.2.5,<0.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.1-py312h104f124_1.conda + hash: + md5: 260ed90aaf06061edabd7209638cf03b + sha256: 04aa180782cb675b960c0bf4aad439b4a7a08553c6af74d0b8e5df9a0c7cc4f4 + category: main + optional: false +- name: pyyaml + version: 6.0.1 + manager: conda + platform: win-64 + dependencies: + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + yaml: '>=0.2.5,<0.3.0a0' + url: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py312he70551f_1.conda + hash: + md5: f91e0baa89ba21166916624ba7bfb422 + sha256: a72fa8152791b4738432f270e70b3a9a4d583ef059a78aa1c62f4b4ab7b15494 + category: main + optional: false +- name: rapidfuzz + version: 3.7.0 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + numpy: '' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/linux-64/rapidfuzz-3.7.0-py312h30efb56_0.conda + hash: + md5: 021bf37fb5caa6b09832a6261565dc95 + sha256: 01f54f67ade67dbd8becabbbcf22aab01a50a47712a18d237d3cb29a579e4d5f + category: main + optional: false +- name: rapidfuzz + version: 3.7.0 + manager: conda + platform: osx-64 + dependencies: + libcxx: '>=16' + numpy: '' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/osx-64/rapidfuzz-3.7.0-py312hede676d_0.conda + hash: + md5: aec35d60da91195ead254662620dd819 + sha256: c96ee0608be54fd988a3f3af3f5e716642c2a25bf4f4d15bd0b035220bbc7297 + category: main + optional: false +- name: rapidfuzz + version: 3.7.0 + manager: conda + platform: win-64 + dependencies: + numpy: '' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/rapidfuzz-3.7.0-py312h53d5487_0.conda + hash: + md5: 0295d6b4b592edbd9e0735fe55743709 + sha256: f6fbf5a096eed3df011f8393a18ba6970987a3a8de7a8819e1af4542c40b6216 + category: main + optional: false +- name: readline + version: '8.2' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + ncurses: '>=6.3,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + hash: + md5: 47d31b792659ce70f470b5c82fdfb7a4 + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + category: main + optional: false +- name: readline + version: '8.2' + manager: conda + platform: osx-64 + dependencies: + ncurses: '>=6.3,<7.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + hash: + md5: f17f77f2acf4d344734bda76829ce14e + sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 + category: main + optional: false +- name: requests + version: 2.31.0 + manager: conda + platform: linux-64 + dependencies: + certifi: '>=2017.4.17' + charset-normalizer: '>=2,<4' + idna: '>=2.5,<4' + python: '>=3.7' + urllib3: '>=1.21.1,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + hash: + md5: a30144e4156cdbb236f99ebb49828f8b + sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad + category: main + optional: false +- name: requests + version: 2.31.0 + manager: conda + platform: osx-64 + dependencies: + certifi: '>=2017.4.17' + charset-normalizer: '>=2,<4' + idna: '>=2.5,<4' + python: '>=3.7' + urllib3: '>=1.21.1,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + hash: + md5: a30144e4156cdbb236f99ebb49828f8b + sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad + category: main + optional: false +- name: requests + version: 2.31.0 + manager: conda + platform: win-64 + dependencies: + certifi: '>=2017.4.17' + charset-normalizer: '>=2,<4' + idna: '>=2.5,<4' + python: '>=3.7' + urllib3: '>=1.21.1,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + hash: + md5: a30144e4156cdbb236f99ebb49828f8b + sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad + category: main + optional: false +- name: requests-toolbelt + version: 1.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.6' + requests: '>=2.0.1,<3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda + hash: + md5: 99c98318c8646b08cc764f90ce98906e + sha256: 20eaefc5dba74ff6c31e537533dde59b5b20f69e74df49dff19d43be59785fa3 + category: main + optional: false +- name: requests-toolbelt + version: 1.0.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.6' + requests: '>=2.0.1,<3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda + hash: + md5: 99c98318c8646b08cc764f90ce98906e + sha256: 20eaefc5dba74ff6c31e537533dde59b5b20f69e74df49dff19d43be59785fa3 + category: main + optional: false +- name: requests-toolbelt + version: 1.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.6' + requests: '>=2.0.1,<3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda + hash: + md5: 99c98318c8646b08cc764f90ce98906e + sha256: 20eaefc5dba74ff6c31e537533dde59b5b20f69e74df49dff19d43be59785fa3 + category: main + optional: false +- name: ruamel.yaml + version: 0.18.6 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ruamel.yaml.clib: '>=0.1.2' + url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.6-py312h98912ed_0.conda + hash: + md5: a99a06a875138829ef65f44bbe2c30ca + sha256: 26856daba883254736b7f3767c08f445b5d010eebbf4fc7aa384ee80e24aa663 + category: main + optional: false +- name: ruamel.yaml + version: 0.18.6 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ruamel.yaml.clib: '>=0.1.2' + url: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml-0.18.6-py312h41838bb_0.conda + hash: + md5: 9db93e711729ec70dacdfa58bf970cfd + sha256: 27ab446d39a46f7db365265a48ce74929c672e14c86b1ce8955f59e2d92dff39 + category: main + optional: false +- name: ruamel.yaml + version: 0.18.6 + manager: conda + platform: win-64 + dependencies: + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ruamel.yaml.clib: '>=0.1.2' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml-0.18.6-py312he70551f_0.conda + hash: + md5: 5833ba75a49ac40876242ccb5f77ab23 + sha256: 31a9e347107a46149ae334586430bebb3a769bb5792eba9ccb89c664dbce7970 + category: main + optional: false +- name: ruamel.yaml.clib + version: 0.2.8 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.8-py312h98912ed_0.conda + hash: + md5: 05f31c2a79ba61df8d6d903ce4a4ce7b + sha256: 5965302881d8b1049291e3ba3912286cdc72cb82303230cbbf0a048c6f6dd7c1 + category: main + optional: false +- name: ruamel.yaml.clib + version: 0.2.8 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml.clib-0.2.8-py312h41838bb_0.conda + hash: + md5: a134bf1778eb7add92ea760e801dc245 + sha256: c0a321d14505b3621d6301e1ed9bc0129b4c8b2812e7520040d2609aaeb07845 + category: main + optional: false +- name: ruamel.yaml.clib + version: 0.2.8 + manager: conda + platform: win-64 + dependencies: + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml.clib-0.2.8-py312he70551f_0.conda + hash: + md5: f8de34a829b65a8e3ac6ddc61ed0d2e0 + sha256: 7d5705ee3190a5b1c24eee2def964cc1d70b9e856488d971f0fd6df0224ca666 + category: main + optional: false +- name: secretstorage + version: 3.3.3 + manager: conda + platform: linux-64 + dependencies: + cryptography: '' + dbus: '' + jeepney: '>=0.6' + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py312h7900ff3_2.conda + hash: + md5: 39067833cbb620066d492f8bd6f11dbf + sha256: 0479e3f8c8e90049a6d92d4c7e67916c6d6cdafd11a1a31c54c785cce44aeb20 + category: main + optional: false +- name: setuptools + version: 69.2.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + hash: + md5: da214ecd521a720a9d521c68047682dc + sha256: 78a75c75a5dacda6de5f4056c9c990141bdaf4f64245673a590594d00bc63713 + category: main + optional: false +- name: setuptools + version: 69.2.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + hash: + md5: da214ecd521a720a9d521c68047682dc + sha256: 78a75c75a5dacda6de5f4056c9c990141bdaf4f64245673a590594d00bc63713 + category: main + optional: false +- name: setuptools + version: 69.2.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + hash: + md5: da214ecd521a720a9d521c68047682dc + sha256: 78a75c75a5dacda6de5f4056c9c990141bdaf4f64245673a590594d00bc63713 + category: main + optional: false +- name: shellingham + version: 1.5.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + hash: + md5: d08db09a552699ee9e7eec56b4eb3899 + sha256: 3c49a0a101c41b7cf6ac05a1872d7a1f91f1b6d02eecb4a36b605a19517862bb + category: main + optional: false +- name: shellingham + version: 1.5.4 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + hash: + md5: d08db09a552699ee9e7eec56b4eb3899 + sha256: 3c49a0a101c41b7cf6ac05a1872d7a1f91f1b6d02eecb4a36b605a19517862bb + category: main + optional: false +- name: shellingham + version: 1.5.4 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + hash: + md5: d08db09a552699ee9e7eec56b4eb3899 + sha256: 3c49a0a101c41b7cf6ac05a1872d7a1f91f1b6d02eecb4a36b605a19517862bb + category: main + optional: false +- name: six + version: 1.16.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + hash: + md5: e5f25f8dbc060e9a8d912e432202afc2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + category: main + optional: false +- name: six + version: 1.16.0 + manager: conda + platform: osx-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + hash: + md5: e5f25f8dbc060e9a8d912e432202afc2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + category: main + optional: false +- name: six + version: 1.16.0 + manager: conda + platform: win-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + hash: + md5: e5f25f8dbc060e9a8d912e432202afc2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + category: main + optional: false +- name: smmap + version: 5.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 62f26a3d1387acee31322208f0cfa3e0 + sha256: 23011cb3e064525bdb8787c75126a2e78d2344a72cd6773922006d1da1f2af16 + category: main + optional: false +- name: smmap + version: 5.0.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 62f26a3d1387acee31322208f0cfa3e0 + sha256: 23011cb3e064525bdb8787c75126a2e78d2344a72cd6773922006d1da1f2af16 + category: main + optional: false +- name: smmap + version: 5.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 62f26a3d1387acee31322208f0cfa3e0 + sha256: 23011cb3e064525bdb8787c75126a2e78d2344a72cd6773922006d1da1f2af16 + category: main + optional: false +- name: tbb + version: 2021.11.0 + manager: conda + platform: win-64 + dependencies: + libhwloc: '>=2.9.3,<2.9.4.0a0' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.11.0-h91493d7_1.conda + hash: + md5: 21069f3ed16812f9f4f2700667b6ec86 + sha256: aa30c089fdd6f66c7808592362e29963586e094159964a5fb61fb8efa9e349bc + category: main + optional: false +- name: tk + version: 8.6.13 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + hash: + md5: d453b98d9c83e71da0741bb0ff4d76bc + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + category: main + optional: false +- name: tk + version: 8.6.13 + manager: conda + platform: osx-64 + dependencies: + libzlib: '>=1.2.13,<1.3.0a0' + url: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + hash: + md5: bf830ba5afc507c6232d4ef0fb1a882d + sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 + category: main + optional: false +- name: tk + version: 8.6.13 + manager: conda + platform: win-64 + dependencies: + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + hash: + md5: fc048363eb8f03cd1737600a5d08aafe + sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 + category: main + optional: false +- name: tomli + version: 2.0.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 5844808ffab9ebdb694585b50ba02a96 + sha256: 4cd48aba7cd026d17e86886af48d0d2ebc67ed36f87f6534f4b67138f5a5a58f + category: main + optional: false +- name: tomli + version: 2.0.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 5844808ffab9ebdb694585b50ba02a96 + sha256: 4cd48aba7cd026d17e86886af48d0d2ebc67ed36f87f6534f4b67138f5a5a58f + category: main + optional: false +- name: tomli + version: 2.0.1 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 5844808ffab9ebdb694585b50ba02a96 + sha256: 4cd48aba7cd026d17e86886af48d0d2ebc67ed36f87f6534f4b67138f5a5a58f + category: main + optional: false +- name: tomli-w + version: 1.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 73506d1ab4202481841c68c169b7ef6c + sha256: efb5f78a224c4bb14aab04690c9912256ea12c3a8b8413e60167573ce1282b02 + category: main + optional: false +- name: tomli-w + version: 1.0.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 73506d1ab4202481841c68c169b7ef6c + sha256: efb5f78a224c4bb14aab04690c9912256ea12c3a8b8413e60167573ce1282b02 + category: main + optional: false +- name: tomli-w + version: 1.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 73506d1ab4202481841c68c169b7ef6c + sha256: efb5f78a224c4bb14aab04690c9912256ea12c3a8b8413e60167573ce1282b02 + category: main + optional: false +- name: tomlkit + version: 0.12.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.4-pyha770c72_0.conda + hash: + md5: 37c47ea93ef00dd80d880fc4ba21256a + sha256: 8d45c266bf919788abacd9828f4a2101d7216f6d4fc7c8d3417034fe0d795a18 + category: main + optional: false +- name: tomlkit + version: 0.12.4 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.4-pyha770c72_0.conda + hash: + md5: 37c47ea93ef00dd80d880fc4ba21256a + sha256: 8d45c266bf919788abacd9828f4a2101d7216f6d4fc7c8d3417034fe0d795a18 + category: main + optional: false +- name: tomlkit + version: 0.12.4 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.4-pyha770c72_0.conda + hash: + md5: 37c47ea93ef00dd80d880fc4ba21256a + sha256: 8d45c266bf919788abacd9828f4a2101d7216f6d4fc7c8d3417034fe0d795a18 + category: main + optional: false +- name: toolz + version: 0.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda + hash: + md5: 2fcb582444635e2c402e8569bb94e039 + sha256: 22b0a9790317526e08609d5dfdd828210ae89e6d444a9e954855fc29012e90c6 + category: main + optional: false +- name: toolz + version: 0.12.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda + hash: + md5: 2fcb582444635e2c402e8569bb94e039 + sha256: 22b0a9790317526e08609d5dfdd828210ae89e6d444a9e954855fc29012e90c6 + category: main + optional: false +- name: toolz + version: 0.12.1 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda + hash: + md5: 2fcb582444635e2c402e8569bb94e039 + sha256: 22b0a9790317526e08609d5dfdd828210ae89e6d444a9e954855fc29012e90c6 + category: main + optional: false +- name: trove-classifiers + version: 2024.3.25 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda + hash: + md5: e565e537d9760fc5d6d02ae4521a144b + sha256: 909b4288bd2be8566f6d0a311d75a7e0e1cf81c42c19c97b1fc7d043c3db3301 + category: main + optional: false +- name: trove-classifiers + version: 2024.3.25 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda + hash: + md5: e565e537d9760fc5d6d02ae4521a144b + sha256: 909b4288bd2be8566f6d0a311d75a7e0e1cf81c42c19c97b1fc7d043c3db3301 + category: main + optional: false +- name: trove-classifiers + version: 2024.3.25 + manager: conda + platform: win-64 + dependencies: + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda + hash: + md5: e565e537d9760fc5d6d02ae4521a144b + sha256: 909b4288bd2be8566f6d0a311d75a7e0e1cf81c42c19c97b1fc7d043c3db3301 + category: main + optional: false +- name: typing-extensions + version: 4.10.0 + manager: conda + platform: linux-64 + dependencies: + typing_extensions: 4.10.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda + hash: + md5: 091683b9150d2ebaa62fd7e2c86433da + sha256: 0698fe2c4e555fb44c27c60f7a21fa0eea7f5bf8186ad109543c5b056e27f96a + category: main + optional: false +- name: typing-extensions + version: 4.10.0 + manager: conda + platform: osx-64 + dependencies: + typing_extensions: 4.10.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda + hash: + md5: 091683b9150d2ebaa62fd7e2c86433da + sha256: 0698fe2c4e555fb44c27c60f7a21fa0eea7f5bf8186ad109543c5b056e27f96a + category: main + optional: false +- name: typing-extensions + version: 4.10.0 + manager: conda + platform: win-64 + dependencies: + typing_extensions: 4.10.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda + hash: + md5: 091683b9150d2ebaa62fd7e2c86433da + sha256: 0698fe2c4e555fb44c27c60f7a21fa0eea7f5bf8186ad109543c5b056e27f96a + category: main + optional: false +- name: typing_extensions + version: 4.10.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + hash: + md5: 16ae769069b380646c47142d719ef466 + sha256: 4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451 + category: main + optional: false +- name: typing_extensions + version: 4.10.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + hash: + md5: 16ae769069b380646c47142d719ef466 + sha256: 4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451 + category: main + optional: false +- name: typing_extensions + version: 4.10.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + hash: + md5: 16ae769069b380646c47142d719ef466 + sha256: 4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451 + category: main + optional: false +- name: tzdata + version: 2024a + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + hash: + md5: 161081fc7cec0bfda0d86d7cb595f8d8 + sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 + category: main + optional: false +- name: tzdata + version: 2024a + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + hash: + md5: 161081fc7cec0bfda0d86d7cb595f8d8 + sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 + category: main + optional: false +- name: tzdata + version: 2024a + manager: conda + platform: win-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + hash: + md5: 161081fc7cec0bfda0d86d7cb595f8d8 + sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 + category: main + optional: false +- name: ucrt + version: 10.0.22621.0 + manager: conda + platform: win-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + hash: + md5: 72608f6cd3e5898229c3ea16deb1ac43 + sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 + category: main + optional: false +- name: ukkonen + version: 1.0.1 + manager: conda + platform: linux-64 + dependencies: + cffi: '' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda + hash: + md5: 52c9e25ee0a32485a102eeecdb7eef52 + sha256: f9a4384d466f4d8b5b497d951329dd4407ebe02f8f93456434e9ab789d6e23ce + category: main + optional: false +- name: ukkonen + version: 1.0.1 + manager: conda + platform: osx-64 + dependencies: + cffi: '' + libcxx: '>=15.0.7' + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/osx-64/ukkonen-1.0.1-py312h49ebfd2_4.conda + hash: + md5: 4e6b5a8025cd8fd97b3cfe103ffce6b1 + sha256: efca19a5e73e4aacfc5e90a5389272b2508e41dc4adab9eb5353c5200ba37041 + category: main + optional: false +- name: ukkonen + version: 1.0.1 + manager: conda + platform: win-64 + dependencies: + cffi: '' + python: '>=3.12.0rc3,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.0.1-py312h0d7def4_4.conda + hash: + md5: 57cfbb8ce3a1800bd343bf6afba6f878 + sha256: f5f7550991ca647f69b67b9188c7104a3456122611dd6a6e753cff555e45dfd9 + category: main + optional: false +- name: urllib3 + version: 1.26.18 + manager: conda + platform: linux-64 + dependencies: + brotli-python: '>=1.0.9' + pysocks: '>=1.5.6,<2.0,!=1.5.7' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.18-pyhd8ed1ab_0.conda + hash: + md5: bf61cfd2a7f212efba378167a07d4a6a + sha256: 1cc0bab65a6ad0f5a8bd7657760a4fb4e670d30377f9dab88b792977cb3687e7 + category: main + optional: false +- name: urllib3 + version: 1.26.18 + manager: conda + platform: osx-64 + dependencies: + brotli-python: '>=1.0.9' + pysocks: '>=1.5.6,<2.0,!=1.5.7' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.18-pyhd8ed1ab_0.conda + hash: + md5: bf61cfd2a7f212efba378167a07d4a6a + sha256: 1cc0bab65a6ad0f5a8bd7657760a4fb4e670d30377f9dab88b792977cb3687e7 + category: main + optional: false +- name: urllib3 + version: 1.26.18 + manager: conda + platform: win-64 + dependencies: + brotli-python: '>=1.0.9' + pysocks: '>=1.5.6,<2.0,!=1.5.7' + python: '>=3.7' + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.18-pyhd8ed1ab_0.conda + hash: + md5: bf61cfd2a7f212efba378167a07d4a6a + sha256: 1cc0bab65a6ad0f5a8bd7657760a4fb4e670d30377f9dab88b792977cb3687e7 + category: main + optional: false +- name: vc + version: '14.3' + manager: conda + platform: win-64 + dependencies: + vc14_runtime: '>=14.38.33130' + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda + hash: + md5: 20e1e652a4c740fa719002a8449994a2 + sha256: 447a8d8292a7b2107dcc18afb67f046824711a652725fc0f522c368e7a7b8318 + category: main + optional: false +- name: vc14_runtime + version: 14.38.33130 + manager: conda + platform: win-64 + dependencies: + ucrt: '>=10.0.20348.0' + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda + hash: + md5: 8be79fdd2725ddf7bbf8a27a4c1f79ba + sha256: bf94c9af4b2e9cba88207001197e695934eadc96a5c5e4cd7597e950aae3d8ff + category: main + optional: false +- name: virtualenv + version: 20.25.1 + manager: conda + platform: linux-64 + dependencies: + distlib: <1,>=0.3.7 + filelock: <4,>=3.12.2 + platformdirs: <5,>=3.9.1 + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda + hash: + md5: 8797a4e26be36880a603aba29c785352 + sha256: 1ced4445cf72cd9dc344ad04bdaf703a08cc428c8c46e4bda928ad79786ee153 + category: main + optional: false +- name: virtualenv + version: 20.25.1 + manager: conda + platform: osx-64 + dependencies: + distlib: <1,>=0.3.7 + filelock: <4,>=3.12.2 + platformdirs: <5,>=3.9.1 + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda + hash: + md5: 8797a4e26be36880a603aba29c785352 + sha256: 1ced4445cf72cd9dc344ad04bdaf703a08cc428c8c46e4bda928ad79786ee153 + category: main + optional: false +- name: virtualenv + version: 20.25.1 + manager: conda + platform: win-64 + dependencies: + distlib: <1,>=0.3.7 + filelock: <4,>=3.12.2 + platformdirs: <5,>=3.9.1 + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda + hash: + md5: 8797a4e26be36880a603aba29c785352 + sha256: 1ced4445cf72cd9dc344ad04bdaf703a08cc428c8c46e4bda928ad79786ee153 + category: main + optional: false +- name: vs2015_runtime + version: 14.38.33130 + manager: conda + platform: win-64 + dependencies: + vc14_runtime: '>=14.38.33130' + url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda + hash: + md5: 10d42885e3ed84e575b454db30f1aa93 + sha256: a2fec221f361d6263c117f4ea6d772b21c90a2f8edc6f3eb0eadec6bfe8843db + category: main + optional: false +- name: webencodings + version: 0.5.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=2.6' + url: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda + hash: + md5: daf5160ff9cde3a468556965329085b9 + sha256: 2adf9bd5482802837bc8814cbe28d7b2a4cbd2e2c52e381329eaa283b3ed1944 + category: main + optional: false +- name: webencodings + version: 0.5.1 + manager: conda + platform: osx-64 + dependencies: + python: '>=2.6' + url: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda + hash: + md5: daf5160ff9cde3a468556965329085b9 + sha256: 2adf9bd5482802837bc8814cbe28d7b2a4cbd2e2c52e381329eaa283b3ed1944 + category: main + optional: false +- name: webencodings + version: 0.5.1 + manager: conda + platform: win-64 + dependencies: + python: '>=2.6' + url: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda + hash: + md5: daf5160ff9cde3a468556965329085b9 + sha256: 2adf9bd5482802837bc8814cbe28d7b2a4cbd2e2c52e381329eaa283b3ed1944 + category: main + optional: false +- name: win_inet_pton + version: 1.1.0 + manager: conda + platform: win-64 + dependencies: + __win: '' + python: '>=3.6' + url: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2 + hash: + md5: 30878ecc4bd36e8deeea1e3c151b2e0b + sha256: a11ae693a0645bf6c7b8a47bac030be9c0967d0b1924537b9ff7458e832c0511 + category: main + optional: false +- name: xattr + version: 1.1.0 + manager: conda + platform: osx-64 + dependencies: + cffi: '>=1.0.0' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://conda.anaconda.org/conda-forge/osx-64/xattr-1.1.0-py312h41838bb_0.conda + hash: + md5: 457981dd28752fd163f33021f81e1679 + sha256: 4b058a394173b67ef41887bec6302db15b17a92a3f2893b7ef6c3f9fabfb3ccd + category: main + optional: false +- name: xz + version: 5.2.6 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + hash: + md5: 2161070d867d1b1204ea749c8eec4ef0 + sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 + category: main + optional: false +- name: xz + version: 5.2.6 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + hash: + md5: a72f9d4ea13d55d745ff1ed594747f10 + sha256: eb09823f34cc2dd663c0ec4ab13f246f45dcd52e5b8c47b9864361de5204a1c8 + category: main + optional: false +- name: xz + version: 5.2.6 + manager: conda + platform: win-64 + dependencies: + vc: '>=14.1,<15' + vs2015_runtime: '>=14.16.27033' + url: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + hash: + md5: 515d77642eaa3639413c6b1bc3f94219 + sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 + category: main + optional: false +- name: yaml + version: 0.2.5 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=9.4.0' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + hash: + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + category: main + optional: false +- name: yaml + version: 0.2.5 + manager: conda + platform: osx-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 + hash: + md5: d7e08fcf8259d742156188e8762b4d20 + sha256: 5301417e2c8dea45b401ffee8df3957d2447d4ce80c83c5ff151fc6bfe1c4148 + category: main + optional: false +- name: yaml + version: 0.2.5 + manager: conda + platform: win-64 + dependencies: + vc: '>=14.1,<15.0a0' + vs2015_runtime: '>=14.16.27012' + url: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 + hash: + md5: adbfb9f45d1004a26763652246a33764 + sha256: 4e2246383003acbad9682c7c63178e2e715ad0eb84f03a8df1fbfba455dfedc5 + category: main + optional: false +- name: zipp + version: 3.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + hash: + md5: 2e4d6bc0b14e10f895fc6791a7d9b26a + sha256: bced1423fdbf77bca0a735187d05d9b9812d2163f60ab426fc10f11f92ecbe26 + category: main + optional: false +- name: zipp + version: 3.17.0 + manager: conda + platform: osx-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + hash: + md5: 2e4d6bc0b14e10f895fc6791a7d9b26a + sha256: bced1423fdbf77bca0a735187d05d9b9812d2163f60ab426fc10f11f92ecbe26 + category: main + optional: false +- name: zipp + version: 3.17.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.8' + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + hash: + md5: 2e4d6bc0b14e10f895fc6791a7d9b26a + sha256: bced1423fdbf77bca0a735187d05d9b9812d2163f60ab426fc10f11f92ecbe26 + category: main + optional: false +- name: zlib + version: 1.2.13 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + libzlib: 1.2.13 + url: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda + hash: + md5: 68c34ec6149623be41a1933ab996a209 + sha256: 9887a04d7e7cb14bd2b52fa01858f05a6d7f002c890f618d9fcd864adbfecb1b + category: main + optional: false +- name: zlib + version: 1.2.13 + manager: conda + platform: osx-64 + dependencies: + libzlib: 1.2.13 + url: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h8a1eda9_5.conda + hash: + md5: 75a8a98b1c4671c5d2897975731da42d + sha256: d1f4c82fd7bd240a78ce8905e931e68dca5f523c7da237b6b63c87d5625c5b35 + category: main + optional: false diff --git a/docs/.overrides/main.html b/docs/.overrides/main.html new file mode 100644 index 0000000..94d9808 --- /dev/null +++ b/docs/.overrides/main.html @@ -0,0 +1 @@ +{% extends "base.html" %} diff --git a/docs/.pages b/docs/.pages new file mode 100644 index 0000000..0e8c500 --- /dev/null +++ b/docs/.pages @@ -0,0 +1,3 @@ +nav: + - Home: index.md + - API: api diff --git a/docs/css/base.css b/docs/css/base.css new file mode 100644 index 0000000..3982e7e --- /dev/null +++ b/docs/css/base.css @@ -0,0 +1,5 @@ + +/* Make the content wider and relative to window size. */ +.md-grid { + max-width: 95% +} diff --git a/docs/css/colors.css b/docs/css/colors.css new file mode 100644 index 0000000..b983cab --- /dev/null +++ b/docs/css/colors.css @@ -0,0 +1,134 @@ +[data-md-color-scheme="default"] { + + /* Primary color shades */ + --md-primary-fg-color: #025099; + --md-primary-fg-color--light: #0437AD; + --md-primary-bg-color: #ffffff; /* Header text */ + --md-primary-bg-color--light: #DBDBDB; /* Secondary header text */ + + /* Default color shades */ + --md-default-fg-color: #646464; /* ??? */ + --md-default-fg-color--light: #7A7A7A; /* h1 */ + --md-default-fg-color--lighter: #9B9B9B; /* ??? */ + --md-default-fg-color--lightest: #BCBCBC; /* ??? */ + + --md-default-bg-color: #FAFAFA; /* Body background */ + --md-default-bg-color--light: #FAFAFA; + --md-default-bg-color--lighter: #FAFAFA; + --md-default-bg-color--lightest: #FAFAFA; + + /* Code color shades */ + --md-code-fg-color: #36464e; /* Code block text color */ + --md-code-bg-color: #f1f1f1; /* Code block background */ + + /* Code highlighting color shades */ + --md-code-hl-color: #0000ff; + --md-code-hl-color--light: #0000ff; + --md-code-hl-number-color: #d52a2a; + --md-code-hl-special-color: #db1457; + --md-code-hl-function-color: #a846b9; + --md-code-hl-constant-color: #6e59d9; + --md-code-hl-keyword-color: #3f6ec6; + --md-code-hl-string-color: #1c7d4d; + --md-code-hl-name-color: #36464e; + --md-code-hl-operator-color: var(--md-primary-fg-color); + --md-code-hl-punctuation-color: var(--md-primary-fg-color); + --md-code-hl-comment-color: var(--md-primary-fg-color); + --md-code-hl-generic-color: var(--md-primary-fg-color); + --md-code-hl-variable-color: var(--md-primary-fg-color); + + /* Typeset color shades */ + --md-typeset-color: #212529; /* Main text color */ + + /* Typeset `a` color shades */ + --md-typeset-a-color: #01a0d7; /* Link color */ + + /* Typeset `table` color shades */ + --md-typeset-table-color: #a5a5a5; /* Outline color */ + --md-typeset-table-color--light: #e3e2e2; /* Hover color */ + + /* Footer color shades */ + --md-footer-fg-color: #ffffff; /* ??? */ + --md-footer-fg-color--light: #e9ecef; /* Footer text */ + --md-footer-fg-color--lighter: #adb5bd; /* ??? */ + --md-footer-bg-color: #000000; + --md-footer-bg-color--dark: #212529; /* Footer background */ + + /* Accent color shades */ + --md-accent-fg-color: #032779; /* Hover over link */ + --md-accent-fg-color--transparent: #caf0f8; /* Hover over transparent (e.g., code with link) */ + --md-accent-bg-color: #ffffff; + --md-accent-bg-color--light: #e5e5e5; + + /* Admonition colors */ + --md-admonition-fg-color: #212529; + --md-admonition-bg-color: #FAFAFA; +} + +[data-md-color-scheme="dark"] { + + /* Primary color shades */ + --md-primary-fg-color: #03045e; + --md-primary-fg-color--light: #0437AD; + --md-primary-bg-color: #ffffff; /* Header text */ + --md-primary-bg-color--light: #DBDBDB; /* Secondary header text */ + + /* Default color shades */ + --md-default-fg-color: #e2e4e9; /* ??? */ + --md-default-fg-color--light: #ffffff; /* h1 */ + --md-default-fg-color--lighter: #e2e4e9; /* ??? */ + --md-default-fg-color--lightest: #e2e4e9; /* ??? */ + + --md-default-bg-color: #212529; /* Body background */ + --md-default-bg-color--light: #FAFAFA; + --md-default-bg-color--lighter: #FAFAFA; + --md-default-bg-color--lightest: #FAFAFA; + + /* Code color shades */ + --md-code-fg-color: #dddddd; /* Code block text color */ + --md-code-bg-color: #333333; /* Code block background */ + + /* Code highlighting color shades */ + --md-code-hl-color: #aeaeff; + --md-code-hl-color--light: #aeaeff; + --md-code-hl-number-color: #ff9494; + --md-code-hl-special-color: #ffa0c0; + --md-code-hl-function-color: #f3adff; + --md-code-hl-constant-color: #bdaeff; + --md-code-hl-keyword-color: #a0c1ff; + --md-code-hl-string-color: #9fffcf; + --md-code-hl-name-color: #f5f5f5; + --md-code-hl-operator-color: #a6f0ff; + --md-code-hl-punctuation-color: #a6f0ff; + --md-code-hl-comment-color: #a6f0ff; + --md-code-hl-generic-color: #a6f0ff; + --md-code-hl-variable-color: #a6f0ff; + + /* Typeset color shades */ + --md-typeset-color: #ffffff; /* Main text color */ + + /* Typeset `a` color shades */ + --md-typeset-a-color: #01a0d7; /* Link color */ + + /* Typeset `table` color shades */ + --md-typeset-table-color: #a5a5a5; /* Outline color */ + --md-typeset-table-color--light: #343a40; /* Hover color */ + + /* Footer color shades */ + --md-footer-fg-color: #ffffff; /* ??? */ + --md-footer-fg-color--light: #e9ecef; /* Footer text */ + --md-footer-fg-color--lighter: #adb5bd; /* ??? */ + --md-footer-bg-color: #000000; + --md-footer-bg-color--dark: #171717; /* Footer background */ + + /* Accent color shades */ + --md-accent-fg-color: #90e0ef; /* Hover over link */ + --md-accent-fg-color--transparent: #6D6D6D; /* Hover over transparent (e.g., code with link) */ + --md-accent-bg-color: #ffffff; + --md-accent-bg-color--light: #e5e5e5; + + /* Admonition colors */ + --md-admonition-fg-color: #ffffff; + --md-admonition-bg-color: #212529; + +} diff --git a/docs/css/mkdocstrings.css b/docs/css/mkdocstrings.css new file mode 100644 index 0000000..0aa9ded --- /dev/null +++ b/docs/css/mkdocstrings.css @@ -0,0 +1,27 @@ +/*Indentation.*/ +div.doc-contents:not(.first) { + padding-left: 25px; + border-left: .05rem solid var(--md-typeset-table-color); +} + +/*Mark external links as such. */ +a.external::after, +a.autorefs-external::after { + /* */ + mask-image: url('data:image/svg+xml,'); + -webkit-mask-image: url('data:image/svg+xml,'); + content: ' '; + + display: inline-block; + vertical-align: middle; + position: relative; + + height: 1em; + width: 1em; + background-color: var(--md-typeset-a-color); +} + +a.external:hover::after, +a.autorefs-external:hover::after { + background-color: var(--md-accent-fg-color); +} diff --git a/docs/gen_ref_pages.py b/docs/gen_ref_pages.py new file mode 100644 index 0000000..4ec055f --- /dev/null +++ b/docs/gen_ref_pages.py @@ -0,0 +1,36 @@ +"""Generate the code reference pages.""" + +import os +from pathlib import Path + +import mkdocs_gen_files + +SRC_DIR = "gypsum_dl" +WRITE_DIR = "api" + +for path in sorted(Path(SRC_DIR).rglob("*.py")): # + module_path = path.relative_to(SRC_DIR).with_suffix("") # + + doc_path = path.relative_to(SRC_DIR).with_suffix(".md") # + + if not os.path.exists(Path(WRITE_DIR)): + os.mkdir(Path(WRITE_DIR)) + + full_doc_path = Path(WRITE_DIR, doc_path) # + + parts = list(module_path.parts) + + if parts[-1] == "__init__": # + parts = parts[:-1] + elif parts[-1] == "__main__": + continue + + if len(parts) == 0: + continue + + with mkdocs_gen_files.open(full_doc_path, "w") as fd: # + identifier = ".".join(parts) # + + print("::: " + identifier, file=fd) # + + mkdocs_gen_files.set_edit_path(full_doc_path, path) # diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..612c7a5 --- /dev/null +++ b/docs/index.md @@ -0,0 +1 @@ +--8<-- "README.md" diff --git a/docs/js/mathjax-config.js b/docs/js/mathjax-config.js new file mode 100644 index 0000000..9c928df --- /dev/null +++ b/docs/js/mathjax-config.js @@ -0,0 +1,19 @@ +window.MathJax = { + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex" + } + }; + +document$.subscribe(() => { + MathJax.startup.output.clearCache() + MathJax.typesetClear() + MathJax.texReset() + MathJax.typesetPromise() +}) diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000..1842bcd --- /dev/null +++ b/environment.yml @@ -0,0 +1,11 @@ +name: gypsum_dl-dev +channels: + - defaults +dependencies: + - python=3.12 + - conda-lock + - poetry + - pre-commit + - conda-poetry-liaison + - mpi4py + - nodejs diff --git a/gypsum_dl/MolContainer.py b/gypsum_dl/MolContainer.py index 1071096..31c473c 100755 --- a/gypsum_dl/MolContainer.py +++ b/gypsum_dl/MolContainer.py @@ -24,9 +24,9 @@ import __future__ -import gypsum_dl.Utils as Utils import gypsum_dl.ChemUtils as ChemUtils import gypsum_dl.MyMol as MyMol +import gypsum_dl.Utils as Utils try: from rdkit import Chem @@ -204,7 +204,7 @@ def update_orig_smi(self, orig_smi): def add_container_properties(self): """Adds all properties from the container to the molecules. Used when - saving final files, to keep a record in the file itself.""" + saving final files, to keep a record in the file itself.""" for mol in self.mols: mol.mol_props.update(self.properties) diff --git a/gypsum_dl/MolObjectHandling.py b/gypsum_dl/MolObjectHandling.py index 58ac85d..b4affd6 100755 --- a/gypsum_dl/MolObjectHandling.py +++ b/gypsum_dl/MolObjectHandling.py @@ -16,10 +16,9 @@ import __future__ import rdkit -from rdkit import Chem # Disable the unnecessary RDKit warnings -from rdkit import RDLogger +from rdkit import Chem, RDLogger RDLogger.DisableLog("rdApp.*") diff --git a/gypsum_dl/MyMol.py b/gypsum_dl/MyMol.py index dc5edcd..d669be2 100755 --- a/gypsum_dl/MyMol.py +++ b/gypsum_dl/MyMol.py @@ -23,27 +23,26 @@ """ - import __future__ import contextlib -import sys import copy import operator import random - -import gypsum_dl.Utils as Utils -import gypsum_dl.MolObjectHandling as MOH +import sys # Disable the unnecessary RDKit warnings from rdkit import RDLogger +import gypsum_dl.MolObjectHandling as MOH +import gypsum_dl.Utils as Utils + RDLogger.DisableLog("rdApp.*") try: import rdkit - from rdkit.Chem import AllChem from rdkit import Chem + from rdkit.Chem import AllChem from rdkit.Chem.rdchem import BondStereo except Exception: Utils.exception("You need to install rdkit and its dependencies.") @@ -259,9 +258,9 @@ def make_mol_frm_smiles_sanitze(self): def make_first_3d_conf_no_min(self): """Makes the associated rdkit.mol object 3D by adding the first - conformer. This also adds hydrogen atoms to the associated rdkit.mol - object. Note that it does not perform a minimization, so it is not - too expensive.""" + conformer. This also adds hydrogen atoms to the associated rdkit.mol + object. Note that it does not perform a minimization, so it is not + too expensive.""" # Set the first 3D conformer if len(self.conformers) > 0: @@ -539,7 +538,7 @@ def set_rdkit_mol_prop(self, key, val): def set_all_rdkit_mol_props(self): """Set all the stored molecular properties. Copies ones from the - MyMol.MyMol object to the MyMol.rdkit_mol object.""" + MyMol.MyMol object to the MyMol.rdkit_mol object.""" self.set_rdkit_mol_prop("SMILES", self.smiles(True)) # self.set_rdkit_mol_prop("SOURCE_SMILES", self.orig_smi) @@ -649,7 +648,7 @@ def count_hyd_bnd_to_carb(self): def load_conformers_into_rdkit_mol(self): """Load the conformers stored as MyConformers objects (in - self.conformers) into the rdkit Mol object.""" + self.conformers) into the rdkit Mol object.""" self.rdkit_mol.RemoveAllConformers() for conformer in self.conformers: @@ -793,7 +792,7 @@ def conformer(self, conf=None): def minimize(self): """Minimize (optimize) the geometry of the current conformer if it - hasn't already been optimized.""" + hasn't already been optimized.""" if self.minimized == True: # Already minimized. Don't do it again. @@ -907,4 +906,3 @@ def get_energy(self) -> float: ff = AllChem.UFFGetMoleculeForceField(self.mol) return ff.CalcEnergy() - diff --git a/gypsum_dl/Parallelizer.py b/gypsum_dl/Parallelizer.py index 37f38a8..c5c2787 100755 --- a/gypsum_dl/Parallelizer.py +++ b/gypsum_dl/Parallelizer.py @@ -29,6 +29,7 @@ import __future__ + import multiprocessing import sys @@ -229,7 +230,7 @@ def start(self, mode=None): ParallelMPI_obj = ParallelMPI() ParallelMPI_obj.start() return ParallelMPI_obj - + raise Exception("mpi4py package must be available to use mpi mode") return None @@ -249,7 +250,6 @@ def end(self, mode=None): if mode is None: mode = self.mode if mode == "mpi": - if self.HAS_MPI == True and self.parallel_obj != None: # THIS IS EXPLICITILY CHOSEN TO BE RUN IN MPI AND CAN WORK WITH MPI self.parallel_obj.end() @@ -298,9 +298,7 @@ def run(self, args, func, num_procs=None, mode=None): ) raise Exception(printout) if mode == "mpi": - printout = ( - "Overriding multiprocess can't go from non-mpi to mpi mode" - ) + printout = "Overriding multiprocess can't go from non-mpi to mpi mode" raise Exception(printout) if num_procs is None: @@ -493,7 +491,6 @@ def _split(self, arr, n): temp = [] counter = 0 for x in range(len(arr)): - # add 1 per group until remainder is removed if remainder != 0: r = 1 diff --git a/gypsum_dl/Start.py b/gypsum_dl/Start.py index 0ef120e..afa72e7 100755 --- a/gypsum_dl/Start.py +++ b/gypsum_dl/Start.py @@ -19,19 +19,18 @@ import __future__ -import sys import json import os -from datetime import datetime +import sys from collections import OrderedDict +from datetime import datetime import gypsum_dl.Utils as Utils -from gypsum_dl.Parallelizer import Parallelizer -from gypsum_dl.Parallelizer import flatten_list +from gypsum_dl.Parallelizer import Parallelizer, flatten_list try: - from rdkit.Chem import AllChem from rdkit import Chem + from rdkit.Chem import AllChem except: Utils.exception("You need to install rdkit and its dependencies.") @@ -46,11 +45,11 @@ Utils.exception("You need to install scipy and its dependencies.") from gypsum_dl.MolContainer import MolContainer +from gypsum_dl.Steps.IO.LoadFiles import load_sdf_file, load_smiles_file +from gypsum_dl.Steps.IO.ProcessOutput import proccess_output from gypsum_dl.Steps.SMILES.PrepareSmiles import prepare_smiles from gypsum_dl.Steps.ThreeD.PrepareThreeD import prepare_3d -from gypsum_dl.Steps.IO.ProcessOutput import proccess_output -from gypsum_dl.Steps.IO.LoadFiles import load_smiles_file -from gypsum_dl.Steps.IO.LoadFiles import load_sdf_file + # see http://www.rdkit.org/docs/GettingStartedInPython.html#working-with-3d-molecules def prepare_molecules(args): @@ -107,7 +106,6 @@ def prepare_molecules(args): # Handle mpi errors if mpi4py isn't installed if params["job_manager"] == "mpi": - # Before executing Parallelizer with mpi4py (which override python raise Exceptions) # We must check that it is being run with the "-m mpi4py" runpy flag sys_modules = sys.modules diff --git a/gypsum_dl/Steps/IO/LoadFiles.py b/gypsum_dl/Steps/IO/LoadFiles.py index 665e539..7f5f56a 100755 --- a/gypsum_dl/Steps/IO/LoadFiles.py +++ b/gypsum_dl/Steps/IO/LoadFiles.py @@ -18,6 +18,7 @@ import __future__ + from gypsum_dl import Utils try: diff --git a/gypsum_dl/Steps/IO/ProcessOutput.py b/gypsum_dl/Steps/IO/ProcessOutput.py index 9789ae0..cb2083e 100755 --- a/gypsum_dl/Steps/IO/ProcessOutput.py +++ b/gypsum_dl/Steps/IO/ProcessOutput.py @@ -19,15 +19,15 @@ import __future__ -from gypsum_dl.Steps.IO.SaveToSDF import save_to_sdf +from gypsum_dl import Utils from gypsum_dl.Steps.IO.SaveToPDB import convert_sdfs_to_PDBs +from gypsum_dl.Steps.IO.SaveToSDF import save_to_sdf from gypsum_dl.Steps.IO.Web2DOutput import web_2d_output -from gypsum_dl import Utils def proccess_output(contnrs, params): """Proccess the molecular models in preparation for writing them to the - disk.""" + disk.""" # Unpack some variables. separate_output_files = params["separate_output_files"] diff --git a/gypsum_dl/Steps/IO/SaveToPDB.py b/gypsum_dl/Steps/IO/SaveToPDB.py index a3e6849..b8d4c51 100644 --- a/gypsum_dl/Steps/IO/SaveToPDB.py +++ b/gypsum_dl/Steps/IO/SaveToPDB.py @@ -19,14 +19,15 @@ import __future__ import glob -import sys import os +import sys from os.path import basename -from gypsum_dl import Utils import rdkit import rdkit.Chem as Chem +from gypsum_dl import Utils + # Disable the unnecessary RDKit warnings rdkit.RDLogger.DisableLog("rdApp.*") diff --git a/gypsum_dl/Steps/IO/SaveToSDF.py b/gypsum_dl/Steps/IO/SaveToSDF.py index 3cd6275..31b3cf9 100755 --- a/gypsum_dl/Steps/IO/SaveToSDF.py +++ b/gypsum_dl/Steps/IO/SaveToSDF.py @@ -18,6 +18,7 @@ import __future__ + import os import gypsum_dl.Utils as Utils diff --git a/gypsum_dl/Steps/IO/Web2DOutput.py b/gypsum_dl/Steps/IO/Web2DOutput.py index 80e0dfe..5c6f500 100755 --- a/gypsum_dl/Steps/IO/Web2DOutput.py +++ b/gypsum_dl/Steps/IO/Web2DOutput.py @@ -20,14 +20,14 @@ # import webbrowser import os -import gypsum_dl.Utils as Utils + import gypsum_dl.ChemUtils as ChemUtils +import gypsum_dl.Utils as Utils try: - from rdkit.Chem import rdDepictor - from rdkit.Chem.Draw import rdMolDraw2D - from rdkit.Chem.Draw import PrepareMolForDrawing from rdkit import Chem + from rdkit.Chem import rdDepictor + from rdkit.Chem.Draw import PrepareMolForDrawing, rdMolDraw2D except Exception: Utils.exception("You need to install rdkit and its dependencies.") diff --git a/gypsum_dl/Steps/IO/__init__.py b/gypsum_dl/Steps/IO/__init__.py index 7e66bb7..2a1d820 100755 --- a/gypsum_dl/Steps/IO/__init__.py +++ b/gypsum_dl/Steps/IO/__init__.py @@ -13,11 +13,12 @@ # limitations under the License. +import os + # gypsum_dl/gypsum_dl/Steps/IO/ # Including the below allows other programs to import functions from # gypsum-DL. import sys -import os current_dir = os.path.dirname(os.path.realpath(__file__)) Steps = os.path.dirname(current_dir) @@ -26,6 +27,5 @@ sys.path.extend([current_dir, Steps, gypsum_gypsum_dir, gypsum_top_dir]) +from gypsum_dl.Steps.IO.LoadFiles import load_sdf_file, load_smiles_file from gypsum_dl.Steps.IO.ProcessOutput import proccess_output -from gypsum_dl.Steps.IO.LoadFiles import load_smiles_file -from gypsum_dl.Steps.IO.LoadFiles import load_sdf_file diff --git a/gypsum_dl/Steps/SMILES/AddHydrogens.py b/gypsum_dl/Steps/SMILES/AddHydrogens.py index 7e0d1b1..ef37091 100755 --- a/gypsum_dl/Steps/SMILES/AddHydrogens.py +++ b/gypsum_dl/Steps/SMILES/AddHydrogens.py @@ -19,12 +19,11 @@ from rdkit import Chem -import gypsum_dl.Parallelizer as Parallelizer -import gypsum_dl.Utils as Utils import gypsum_dl.ChemUtils as ChemUtils -import gypsum_dl.MyMol as MyMol import gypsum_dl.MolContainer as MolCont - +import gypsum_dl.MyMol as MyMol +import gypsum_dl.Parallelizer as Parallelizer +import gypsum_dl.Utils as Utils from gypsum_dl.Steps.SMILES.dimorphite_dl.dimorphite_dl import Protonate diff --git a/gypsum_dl/Steps/SMILES/DeSaltOrigSmiles.py b/gypsum_dl/Steps/SMILES/DeSaltOrigSmiles.py index c48cae9..b53e396 100755 --- a/gypsum_dl/Steps/SMILES/DeSaltOrigSmiles.py +++ b/gypsum_dl/Steps/SMILES/DeSaltOrigSmiles.py @@ -20,10 +20,10 @@ import __future__ -import gypsum_dl.Parallelizer as Parallelizer -import gypsum_dl.Utils as Utils import gypsum_dl.ChemUtils as ChemUtils import gypsum_dl.MyMol as MyMol +import gypsum_dl.Parallelizer as Parallelizer +import gypsum_dl.Utils as Utils try: from rdkit import Chem diff --git a/gypsum_dl/Steps/SMILES/DurrantLabFilter.py b/gypsum_dl/Steps/SMILES/DurrantLabFilter.py index 3d23799..edfd7e3 100755 --- a/gypsum_dl/Steps/SMILES/DurrantLabFilter.py +++ b/gypsum_dl/Steps/SMILES/DurrantLabFilter.py @@ -20,9 +20,9 @@ import __future__ +import gypsum_dl.ChemUtils as ChemUtils import gypsum_dl.Parallelizer as Parallelizer import gypsum_dl.Utils as Utils -import gypsum_dl.ChemUtils as ChemUtils try: from rdkit import Chem diff --git a/gypsum_dl/Steps/SMILES/EnumerateChiralMols.py b/gypsum_dl/Steps/SMILES/EnumerateChiralMols.py index 9da760e..1f92a0f 100755 --- a/gypsum_dl/Steps/SMILES/EnumerateChiralMols.py +++ b/gypsum_dl/Steps/SMILES/EnumerateChiralMols.py @@ -23,10 +23,10 @@ import itertools import random -import gypsum_dl.Parallelizer as Parallelizer -import gypsum_dl.Utils as Utils import gypsum_dl.ChemUtils as ChemUtils import gypsum_dl.MyMol as MyMol +import gypsum_dl.Parallelizer as Parallelizer +import gypsum_dl.Utils as Utils try: from rdkit import Chem @@ -178,7 +178,7 @@ def parallel_get_chiral(mol, max_variants_per_compound, thoroughness): + mol.name + ") has " # + str(len(options)) - + str(2 ** num) + + str(2**num) + " enantiomers when chiral centers with " + "no specified chirality are systematically varied." ) diff --git a/gypsum_dl/Steps/SMILES/EnumerateDoubleBonds.py b/gypsum_dl/Steps/SMILES/EnumerateDoubleBonds.py index 0dc2809..a52bdfd 100755 --- a/gypsum_dl/Steps/SMILES/EnumerateDoubleBonds.py +++ b/gypsum_dl/Steps/SMILES/EnumerateDoubleBonds.py @@ -19,15 +19,15 @@ import __future__ -import itertools import copy +import itertools +import math import random -import gypsum_dl.Parallelizer as Parallelizer -import gypsum_dl.Utils as Utils import gypsum_dl.ChemUtils as ChemUtils import gypsum_dl.MyMol as MyMol -import math +import gypsum_dl.Parallelizer as Parallelizer +import gypsum_dl.Utils as Utils try: from rdkit import Chem diff --git a/gypsum_dl/Steps/SMILES/MakeTautomers.py b/gypsum_dl/Steps/SMILES/MakeTautomers.py index 251fbb4..f4e11be 100755 --- a/gypsum_dl/Steps/SMILES/MakeTautomers.py +++ b/gypsum_dl/Steps/SMILES/MakeTautomers.py @@ -21,11 +21,11 @@ import random -import gypsum_dl.Parallelizer as Parallelizer -import gypsum_dl.Utils as Utils import gypsum_dl.ChemUtils as ChemUtils -import gypsum_dl.MyMol as MyMol import gypsum_dl.MolObjectHandling as MOH +import gypsum_dl.MyMol as MyMol +import gypsum_dl.Parallelizer as Parallelizer +import gypsum_dl.Utils as Utils try: from rdkit import Chem diff --git a/gypsum_dl/Steps/SMILES/PrepareSmiles.py b/gypsum_dl/Steps/SMILES/PrepareSmiles.py index b211f0e..b2fa23a 100755 --- a/gypsum_dl/Steps/SMILES/PrepareSmiles.py +++ b/gypsum_dl/Steps/SMILES/PrepareSmiles.py @@ -20,15 +20,15 @@ import __future__ from gypsum_dl import Utils -from gypsum_dl.Steps.SMILES.DeSaltOrigSmiles import desalt_orig_smi from gypsum_dl.Steps.SMILES.AddHydrogens import add_hydrogens -from gypsum_dl.Steps.SMILES.MakeTautomers import make_tauts +from gypsum_dl.Steps.SMILES.DeSaltOrigSmiles import desalt_orig_smi from gypsum_dl.Steps.SMILES.DurrantLabFilter import ( - durrant_lab_filters, durrant_lab_contains_bad_substr, + durrant_lab_filters, ) from gypsum_dl.Steps.SMILES.EnumerateChiralMols import enumerate_chiral_molecules from gypsum_dl.Steps.SMILES.EnumerateDoubleBonds import enumerate_double_bonds +from gypsum_dl.Steps.SMILES.MakeTautomers import make_tauts def prepare_smiles(contnrs, params): diff --git a/gypsum_dl/Steps/SMILES/__init__.py b/gypsum_dl/Steps/SMILES/__init__.py index 22bc0b3..ead4b12 100755 --- a/gypsum_dl/Steps/SMILES/__init__.py +++ b/gypsum_dl/Steps/SMILES/__init__.py @@ -13,11 +13,12 @@ # limitations under the License. +import os + # gypsum_dl/gypsum_dl/Steps/SMILES/ # Including the below allows other programs to import functions from # gypsum-DL. import sys -import os current_dir = os.path.dirname(os.path.realpath(__file__)) Steps = os.path.dirname(current_dir) diff --git a/gypsum_dl/Steps/SMILES/dimorphite_dl/CHANGES.md b/gypsum_dl/Steps/SMILES/dimorphite_dl/CHANGES.md index 498cf8f..63fb1a2 100644 --- a/gypsum_dl/Steps/SMILES/dimorphite_dl/CHANGES.md +++ b/gypsum_dl/Steps/SMILES/dimorphite_dl/CHANGES.md @@ -4,66 +4,66 @@ Changes 1.2.4 ----- -* Dimorphite-DL now better protonates compounds with polyphosphate chains +* Dimorphite-DL now better protonates compounds with polyphosphate chains (e.g., ATP). See `site_substructures.smarts` for the rationale behind the added pKa values. -* Added test cases for ATP and NAD. -* `site_substructures.smarts` now allows comments (lines that start with `#`). -* Fixed a bug that affected how Dimorphite-DL deals with new protonation +* Added test cases for ATP and NAD. +* `site_substructures.smarts` now allows comments (lines that start with `#`). +* Fixed a bug that affected how Dimorphite-DL deals with new protonation states that yield invalid SMILES strings. - * Previously, it simply returned the original input SMILES in these rare + * Previously, it simply returned the original input SMILES in these rare cases (better than nothing). Now, it instead returns the last valid SMILES produced, not necessarily the original SMILES. - * Consider `O=C(O)N1C=CC=C1` at pH 3.5 as an example. - * Dimorphite-DL first deprotonates the carboxyl group, producing + * Consider `O=C(O)N1C=CC=C1` at pH 3.5 as an example. + * Dimorphite-DL first deprotonates the carboxyl group, producing `O=C([O-])n1cccc1` (a valid SMILES). - * It then attempts to protonate the aromatic nitrogen, producing + * It then attempts to protonate the aromatic nitrogen, producing `O=C([O-])[n+]1cccc1`, an invalid SMILES. - * Previously, it would output the original SMILES, `O=C(O)N1C=CC=C1`. Now + * Previously, it would output the original SMILES, `O=C(O)N1C=CC=C1`. Now it outputs the last valid SMILES, `O=C([O-])n1cccc1`. -* Improved suport for the `--silent` option. -* Reformatted code per the [*Black* Python code +* Improved suport for the `--silent` option. +* Reformatted code per the [*Black* Python code formatter](https://github.com/psf/black). 1.2.3 ----- -* Updated protonation of nitrogen, oxygen, and sulfur atoms to be compatible +* Updated protonation of nitrogen, oxygen, and sulfur atoms to be compatible with the latest version of RDKit, which broke backwards compatibility. -* Added "silent" option to suppress all output. -* Added code to suppress unnecessary RDKit warnings. -* Updated copyright to 2020. +* Added "silent" option to suppress all output. +* Added code to suppress unnecessary RDKit warnings. +* Updated copyright to 2020. 1.2.2 ----- -* Added a new parameter to limit the number of variants per compound +* Added a new parameter to limit the number of variants per compound (`--max_variants`). The default is 128. 1.2.1 ----- -* Corrected a bug that rarely misprotonated/deprotonated compounds with +* Corrected a bug that rarely misprotonated/deprotonated compounds with multiple ionization sites (e.g., producing a carbanion). 1.2 --- -* Corrected a bug that led Dimorphite-DL to sometimes produce output molecules +* Corrected a bug that led Dimorphite-DL to sometimes produce output molecules that are non-physical. -* Corrected a bug that gave incorrect protonation states for rare molecules +* Corrected a bug that gave incorrect protonation states for rare molecules (aromatic rings with nitrogens that are protonated when electrically neutral, e.g. pyridin-4(1H)-one). -* `run_with_mol_list()` now preserves non-string properties. -* `run_with_mol_list()` throws a warning if it cannot process a molecule, +* `run_with_mol_list()` now preserves non-string properties. +* `run_with_mol_list()` throws a warning if it cannot process a molecule, rather than terminating the program with an error. 1.1 --- -* Dimorphite-DL now distinguishes between indoles/pyrroles and +* Dimorphite-DL now distinguishes between indoles/pyrroles and Aromatic_nitrogen_protonated. -* It is now possible to call Dimorphite-DL from another Python script, in +* It is now possible to call Dimorphite-DL from another Python script, in addition to the command line. See the `README.md` file for instructions. 1.0 diff --git a/gypsum_dl/Steps/SMILES/dimorphite_dl/CONTRIBUTORS.md b/gypsum_dl/Steps/SMILES/dimorphite_dl/CONTRIBUTORS.md index 2ab0710..0ccbc6f 100644 --- a/gypsum_dl/Steps/SMILES/dimorphite_dl/CONTRIBUTORS.md +++ b/gypsum_dl/Steps/SMILES/dimorphite_dl/CONTRIBUTORS.md @@ -1,8 +1,8 @@ CONTRIBUTORS ============ -* Jacob Durrant -* Jesse Kaminsky -* Patrick Ropp -* Jacob Spiegel -* Sara Yablonski +* Jacob Durrant +* Jesse Kaminsky +* Patrick Ropp +* Jacob Spiegel +* Sara Yablonski diff --git a/gypsum_dl/Steps/SMILES/dimorphite_dl/LICENSE.txt b/gypsum_dl/Steps/SMILES/dimorphite_dl/LICENSE.txt index bebc887..a716452 100644 --- a/gypsum_dl/Steps/SMILES/dimorphite_dl/LICENSE.txt +++ b/gypsum_dl/Steps/SMILES/dimorphite_dl/LICENSE.txt @@ -105,7 +105,7 @@ of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as -modifying the License. +modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or @@ -154,4 +154,4 @@ to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. -END OF TERMS AND CONDITIONS \ No newline at end of file +END OF TERMS AND CONDITIONS diff --git a/gypsum_dl/Steps/SMILES/dimorphite_dl/README.md b/gypsum_dl/Steps/SMILES/dimorphite_dl/README.md index 251d7a3..ebad686 100644 --- a/gypsum_dl/Steps/SMILES/dimorphite_dl/README.md +++ b/gypsum_dl/Steps/SMILES/dimorphite_dl/README.md @@ -28,7 +28,7 @@ details. Usage ----- -``` +```text usage: dimorphite_dl.py [-h] [--min_ph MIN] [--max_ph MAX] [--pka_precision PRE] [--smiles SMI] [--smiles_file FILE] [--output_file FILE] @@ -56,12 +56,12 @@ The default pH range is 6.4 to 8.4, considered biologically relevant pH. Examples -------- -``` - python dimorphite_dl.py --smiles_file sample_molecules.smi - python dimorphite_dl.py --smiles "CCC(=O)O" --min_ph -3.0 --max_ph -2.0 - python dimorphite_dl.py --smiles "CCCN" --min_ph -3.0 --max_ph -2.0 --output_file output.smi - python dimorphite_dl.py --smiles_file sample_molecules.smi --pka_precision 2.0 --label_states - python dimorphite_dl.py --test +```text +python dimorphite_dl.py --smiles_file sample_molecules.smi +python dimorphite_dl.py --smiles "CCC(=O)O" --min_ph -3.0 --max_ph -2.0 +python dimorphite_dl.py --smiles "CCCN" --min_ph -3.0 --max_ph -2.0 --output_file output.smi +python dimorphite_dl.py --smiles_file sample_molecules.smi --pka_precision 2.0 --label_states +python dimorphite_dl.py --test ``` Advanced Usage @@ -113,4 +113,4 @@ Authors and Contacts -------------------- See the `CONTRIBUTORS.md` file for a full list of contributors. Please contact -Jacob Durrant (durrantj@pitt.edu) with any questions. +Jacob Durrant () with any questions. diff --git a/gypsum_dl/Steps/SMILES/dimorphite_dl/dimorphite_dl.py b/gypsum_dl/Steps/SMILES/dimorphite_dl/dimorphite_dl.py index 465327b..0baaa81 100644 --- a/gypsum_dl/Steps/SMILES/dimorphite_dl/dimorphite_dl.py +++ b/gypsum_dl/Steps/SMILES/dimorphite_dl/dimorphite_dl.py @@ -18,9 +18,10 @@ """ from __future__ import print_function + +import argparse import copy import os -import argparse import sys try: @@ -47,11 +48,10 @@ def print_header(): try: import rdkit - from rdkit import Chem - from rdkit.Chem import AllChem # Disable the unnecessary RDKit warnings - from rdkit import RDLogger + from rdkit import Chem, RDLogger + from rdkit.Chem import AllChem RDLogger.DisableLog("rdApp.*") except: @@ -110,7 +110,8 @@ def main(params=None): class MyParser(argparse.ArgumentParser): """Overwrite default parse so it displays help file on error. See - https://stackoverflow.com/questions/4042452/display-help-message-with-python-argparse-when-script-is-called-without-any-argu""" + https://stackoverflow.com/questions/4042452/display-help-message-with-python-argparse-when-script-is-called-without-any-argu + """ def error(self, message): """Overwrites the default error message. @@ -913,7 +914,10 @@ def set_protonation_charge(mols, idx, charges, prot_site_name): try: mol_copy = Chem.RemoveHs(mol_copy) except: - if "silent" in ProtSubstructFuncs.args and not ProtSubstructFuncs.args["silent"]: + if ( + "silent" in ProtSubstructFuncs.args + and not ProtSubstructFuncs.args["silent"] + ): UtilFuncs.eprint( "WARNING: Skipping poorly formed SMILES string: " + Chem.MolToSmiles(mol_copy) @@ -1124,7 +1128,7 @@ def test(): "pka_precision": 0.5, "smiles": "", "label_states": True, - "silent": True + "silent": True, } for smi, protonated, deprotonated, category in smis: @@ -1268,7 +1272,7 @@ def test(): "min_ph": ph, "max_ph": ph, "pka_precision": 0, - "silent": True + "silent": True, } ) ) diff --git a/gypsum_dl/Steps/SMILES/site_structures.smarts b/gypsum_dl/Steps/SMILES/site_structures.smarts index 1886cce..b9e2cc8 100755 --- a/gypsum_dl/Steps/SMILES/site_structures.smarts +++ b/gypsum_dl/Steps/SMILES/site_structures.smarts @@ -25,4 +25,4 @@ Sulfonamide [SX4:1](=[O:2])(=[O:3])-[NX3+0:4]-[H] 3 neutral Phosphinic_acid [PX4:1](=[O:2])(-[C,c,N,n,F,Cl,Br,I:3])(-[C,c,N,n,F,Cl,Br,I:4])-[OX2:5]-[H] 4 acid Phosphate_diester [PX4:1](=[O:2])(-[OX2:3]-[C,c,N,n,F,Cl,Br,I:4])(-[O+0:5]-[C,c,N,n,F,Cl,Br,I:4])-[OX2:6]-[H] 6 acid Phosphonate_ester [PX4:1](=[O:2])(-[OX2:3]-[C,c,N,n,F,Cl,Br,I:4])(-[C,c,N,n,F,Cl,Br,I:5])-[OX2:6]-[H] 5 acid -Nonaromatic_nitrogen [N:1]-[H] 0 neutral \ No newline at end of file +Nonaromatic_nitrogen [N:1]-[H] 0 neutral diff --git a/gypsum_dl/Steps/ThreeD/Convert2DTo3D.py b/gypsum_dl/Steps/ThreeD/Convert2DTo3D.py index ae5edf7..4c5e9e9 100755 --- a/gypsum_dl/Steps/ThreeD/Convert2DTo3D.py +++ b/gypsum_dl/Steps/ThreeD/Convert2DTo3D.py @@ -19,11 +19,12 @@ import __future__ + import copy +import gypsum_dl.ChemUtils as ChemUtils import gypsum_dl.Parallelizer as Parallelizer import gypsum_dl.Utils as Utils -import gypsum_dl.ChemUtils as ChemUtils try: from rdkit import Chem diff --git a/gypsum_dl/Steps/ThreeD/GenerateAlternate3DNonaromaticRingConfs.py b/gypsum_dl/Steps/ThreeD/GenerateAlternate3DNonaromaticRingConfs.py index f40e7d7..543e3a9 100755 --- a/gypsum_dl/Steps/ThreeD/GenerateAlternate3DNonaromaticRingConfs.py +++ b/gypsum_dl/Steps/ThreeD/GenerateAlternate3DNonaromaticRingConfs.py @@ -19,16 +19,14 @@ """ - - import __future__ import copy import warnings +import gypsum_dl.ChemUtils as ChemUtils import gypsum_dl.Parallelizer as Parallelizer import gypsum_dl.Utils as Utils -import gypsum_dl.ChemUtils as ChemUtils from gypsum_dl.MyMol import MyConformer try: diff --git a/gypsum_dl/Steps/ThreeD/Minimize3D.py b/gypsum_dl/Steps/ThreeD/Minimize3D.py index 76b45ba..ce96a31 100755 --- a/gypsum_dl/Steps/ThreeD/Minimize3D.py +++ b/gypsum_dl/Steps/ThreeD/Minimize3D.py @@ -21,8 +21,8 @@ import copy -import gypsum_dl.Utils as Utils import gypsum_dl.ChemUtils as ChemUtils +import gypsum_dl.Utils as Utils from gypsum_dl.MyMol import MyConformer diff --git a/gypsum_dl/Steps/ThreeD/__init__.py b/gypsum_dl/Steps/ThreeD/__init__.py index c885841..917e5e6 100755 --- a/gypsum_dl/Steps/ThreeD/__init__.py +++ b/gypsum_dl/Steps/ThreeD/__init__.py @@ -13,11 +13,12 @@ # the License. +import os + # gypsum_dl/gypsum_dl/Steps/ThreeD # Including the below allows other programs to import functions from # gypsum-DL. import sys -import os current_dir = os.path.dirname(os.path.realpath(__file__)) Steps = os.path.dirname(current_dir) diff --git a/gypsum_dl/Steps/__init__.py b/gypsum_dl/Steps/__init__.py index 0aad7b6..7127866 100755 --- a/gypsum_dl/Steps/__init__.py +++ b/gypsum_dl/Steps/__init__.py @@ -13,11 +13,12 @@ # the License. +import os + # gypsum_dl/gypsum_dl/Steps/ThreeD # Including the below allows other programs to import functions from # gypsum-DL. import sys -import os current_dir = os.path.dirname(os.path.realpath(__file__)) Steps = os.path.dirname(current_dir) @@ -25,6 +26,6 @@ gypsum_top_dir = os.path.dirname(gypsum_gypsum_dir) sys.path.extend([current_dir, Steps, gypsum_gypsum_dir, gypsum_top_dir]) +import gypsum_dl.Steps.IO import gypsum_dl.Steps.SMILES import gypsum_dl.Steps.ThreeD -import gypsum_dl.Steps.IO diff --git a/gypsum_dl/Test/Tester.py b/gypsum_dl/Test/Tester.py index 6b539b6..c8965e4 100644 --- a/gypsum_dl/Test/Tester.py +++ b/gypsum_dl/Test/Tester.py @@ -17,9 +17,10 @@ for now. """ +import glob import os import shutil -import glob + from gypsum_dl import Utils from gypsum_dl.Start import prepare_molecules diff --git a/gypsum_dl/Utils.py b/gypsum_dl/Utils.py index 196e4f0..f7beb8a 100755 --- a/gypsum_dl/Utils.py +++ b/gypsum_dl/Utils.py @@ -20,10 +20,10 @@ import __future__ import contextlib -import subprocess -import textwrap import random import string +import subprocess +import textwrap def group_mols_by_container_index(mol_lst): diff --git a/gypsum_dl/__init__.py b/gypsum_dl/__init__.py index a3252de..4a7f90f 100755 --- a/gypsum_dl/__init__.py +++ b/gypsum_dl/__init__.py @@ -13,11 +13,12 @@ # limitations under the License. +import os + # gypsum_dl/gypsum_dl/ # Including the below allows other programs to import functions from # gypsum-DL. import sys -import os current_dir = os.path.dirname(os.path.realpath(__file__)) gypsum_gypsum_dir = current_dir diff --git a/gypsum_dl/molvs/CHANGELOG.md b/gypsum_dl/molvs/CHANGELOG.md index 2b72a77..341f988 100644 --- a/gypsum_dl/molvs/CHANGELOG.md +++ b/gypsum_dl/molvs/CHANGELOG.md @@ -5,33 +5,33 @@ **Implemented enhancements:** -- Add hydrogen to REMOVE\_FRAGMENTS list [\#23](https://github.com/mcs07/MolVS/pull/23) ([JoshuaMeyers](https://github.com/JoshuaMeyers)) +- Add hydrogen to REMOVE\_FRAGMENTS list [\#23](https://github.com/mcs07/MolVS/pull/23) ([JoshuaMeyers](https://github.com/JoshuaMeyers)) **Fixed bugs:** -- Fluorine considered metal [\#24](https://github.com/mcs07/MolVS/issues/24) -- Fix mistake in metal SMARTS [\#25](https://github.com/mcs07/MolVS/pull/25) ([mcs07](https://github.com/mcs07)) +- Fluorine considered metal [\#24](https://github.com/mcs07/MolVS/issues/24) +- Fix mistake in metal SMARTS [\#25](https://github.com/mcs07/MolVS/pull/25) ([mcs07](https://github.com/mcs07)) **Closed issues:** -- MolVS 0.1.0 Standardization fails on Python 3 [\#22](https://github.com/mcs07/MolVS/issues/22) -- molvs hugs on some molecules [\#21](https://github.com/mcs07/MolVS/issues/21) +- MolVS 0.1.0 Standardization fails on Python 3 [\#22](https://github.com/mcs07/MolVS/issues/22) +- molvs hugs on some molecules [\#21](https://github.com/mcs07/MolVS/issues/21) ## [v0.1.0](https://github.com/mcs07/MolVS/tree/v0.1.0) (2018-02-07) [Full Changelog](https://github.com/mcs07/MolVS/compare/v0.0.9...v0.1.0) **Implemented enhancements:** -- Add support for using conda in development [\#19](https://github.com/mcs07/MolVS/pull/19) ([mcs07](https://github.com/mcs07)) +- Add support for using conda in development [\#19](https://github.com/mcs07/MolVS/pull/19) ([mcs07](https://github.com/mcs07)) **Fixed bugs:** -- error standardizing ionization [\#15](https://github.com/mcs07/MolVS/issues/15) -- Molecule did not standardise overnight [\#14](https://github.com/mcs07/MolVS/issues/14) -- Problem with \_\_repr\_\_ method of TautomerTransform class [\#7](https://github.com/mcs07/MolVS/issues/7) -- Fixed forced charge corrections [\#18](https://github.com/mcs07/MolVS/pull/18) ([mcs07](https://github.com/mcs07)) -- Fixing infinite loop issue in reionization code [\#17](https://github.com/mcs07/MolVS/pull/17) ([coleb](https://github.com/coleb)) -- Fix TautomerTransform repr - fixes \#7 [\#8](https://github.com/mcs07/MolVS/pull/8) ([mcs07](https://github.com/mcs07)) +- error standardizing ionization [\#15](https://github.com/mcs07/MolVS/issues/15) +- Molecule did not standardise overnight [\#14](https://github.com/mcs07/MolVS/issues/14) +- Problem with \_\_repr\_\_ method of TautomerTransform class [\#7](https://github.com/mcs07/MolVS/issues/7) +- Fixed forced charge corrections [\#18](https://github.com/mcs07/MolVS/pull/18) ([mcs07](https://github.com/mcs07)) +- Fixing infinite loop issue in reionization code [\#17](https://github.com/mcs07/MolVS/pull/17) ([coleb](https://github.com/coleb)) +- Fix TautomerTransform repr - fixes \#7 [\#8](https://github.com/mcs07/MolVS/pull/8) ([mcs07](https://github.com/mcs07)) ## [v0.0.9](https://github.com/mcs07/MolVS/tree/v0.0.9) (2017-01-27) [Full Changelog](https://github.com/mcs07/MolVS/compare/v0.0.8...v0.0.9) @@ -41,8 +41,8 @@ **Fixed bugs:** -- Standardizer gets stuck on a molecule [\#4](https://github.com/mcs07/MolVS/issues/4) -- Fix reionizer infinite loop - fixes \#4 [\#5](https://github.com/mcs07/MolVS/pull/5) ([mcs07](https://github.com/mcs07)) +- Standardizer gets stuck on a molecule [\#4](https://github.com/mcs07/MolVS/issues/4) +- Fix reionizer infinite loop - fixes \#4 [\#5](https://github.com/mcs07/MolVS/pull/5) ([mcs07](https://github.com/mcs07)) ## [v0.0.7](https://github.com/mcs07/MolVS/tree/v0.0.7) (2016-12-04) [Full Changelog](https://github.com/mcs07/MolVS/compare/v0.0.6...v0.0.7) diff --git a/gypsum_dl/molvs/__init__.py b/gypsum_dl/molvs/__init__.py index 0202bdf..2343e2a 100644 --- a/gypsum_dl/molvs/__init__.py +++ b/gypsum_dl/molvs/__init__.py @@ -7,22 +7,25 @@ """ -from __future__ import print_function -from __future__ import unicode_literals -from __future__ import division +from __future__ import division, print_function, unicode_literals + import logging -from .standardize import Standardizer, standardize_smiles, enumerate_tautomers_smiles, canonicalize_tautomer_smiles -from .validate import Validator, validate_smiles from .errors import MolVSError, StandardizeError, ValidateError +from .standardize import ( + Standardizer, + canonicalize_tautomer_smiles, + enumerate_tautomers_smiles, + standardize_smiles, +) +from .validate import Validator, validate_smiles - -__title__ = 'MolVS' -__version__ = '0.1.1' -__author__ = 'Matt Swain' -__email__ = 'm.swain@me.com' -__license__ = 'MIT' -__copyright__ = 'Copyright 2019 Matt Swain' +__title__ = "MolVS" +__version__ = "0.1.1" +__author__ = "Matt Swain" +__email__ = "m.swain@me.com" +__license__ = "MIT" +__copyright__ = "Copyright 2019 Matt Swain" log = logging.getLogger(__name__) diff --git a/gypsum_dl/molvs/charge.py b/gypsum_dl/molvs/charge.py index 99c999a..662b6ba 100644 --- a/gypsum_dl/molvs/charge.py +++ b/gypsum_dl/molvs/charge.py @@ -9,9 +9,8 @@ """ -from __future__ import print_function -from __future__ import unicode_literals -from __future__ import division +from __future__ import division, print_function, unicode_literals + import copy import logging @@ -19,7 +18,6 @@ from .utils import memoized_property - log = logging.getLogger(__name__) @@ -36,23 +34,25 @@ def __init__(self, name, acid, base): :param string acid: SMARTS pattern for the protonated acid. :param string base: SMARTS pattern for the conjugate ionized base. """ - log.debug('Initializing AcidBasePair: %s', name) + log.debug("Initializing AcidBasePair: %s", name) self.name = name self.acid_str = acid self.base_str = base @memoized_property def acid(self): - log.debug('Loading AcidBasePair acid: %s', self.name) + log.debug("Loading AcidBasePair acid: %s", self.name) return Chem.MolFromSmarts(self.acid_str) @memoized_property def base(self): - log.debug('Loading AcidBasePair base: %s', self.name) + log.debug("Loading AcidBasePair base: %s", self.name) return Chem.MolFromSmarts(self.base_str) def __repr__(self): - return 'AcidBasePair({!r}, {!r}, {!r})'.format(self.name, self.acid_str, self.base_str) + return "AcidBasePair({!r}, {!r}, {!r})".format( + self.name, self.acid_str, self.base_str + ) def __str__(self): return self.name @@ -61,39 +61,47 @@ def __str__(self): #: The default list of AcidBasePairs, sorted from strongest to weakest. This list is derived from the Food and Drug #: Administration Substance Registration System Standard Operating Procedure guide. ACID_BASE_PAIRS = ( - AcidBasePair('-OSO3H', 'OS(=O)(=O)[OH]', 'OS(=O)(=O)[O-]'), - AcidBasePair('–SO3H', '[!O]S(=O)(=O)[OH]', '[!O]S(=O)(=O)[O-]'), - AcidBasePair('-OSO2H', 'O[SD3](=O)[OH]', 'O[SD3](=O)[O-]'), - AcidBasePair('-SO2H', '[!O][SD3](=O)[OH]', '[!O][SD3](=O)[O-]'), - AcidBasePair('-OPO3H2', 'OP(=O)([OH])[OH]', 'OP(=O)([OH])[O-]'), - AcidBasePair('-PO3H2', '[!O]P(=O)([OH])[OH]', '[!O]P(=O)([OH])[O-]'), - AcidBasePair('-CO2H', 'C(=O)[OH]', 'C(=O)[O-]'), - AcidBasePair('thiophenol', 'c[SH]', 'c[S-]'), - AcidBasePair('(-OPO3H)-', 'OP(=O)([O-])[OH]', 'OP(=O)([O-])[O-]'), - AcidBasePair('(-PO3H)-', '[!O]P(=O)([O-])[OH]', '[!O]P(=O)([O-])[O-]'), - AcidBasePair('phthalimide', 'O=C2c1ccccc1C(=O)[NH]2', 'O=C2c1ccccc1C(=O)[N-]2'), - AcidBasePair('CO3H (peracetyl)', 'C(=O)O[OH]', 'C(=O)O[O-]'), - AcidBasePair('alpha-carbon-hydrogen-nitro group', 'O=N(O)[CH]', 'O=N(O)[C-]'), - AcidBasePair('-SO2NH2', 'S(=O)(=O)[NH2]', 'S(=O)(=O)[NH-]'), - AcidBasePair('-OBO2H2', 'OB([OH])[OH]', 'OB([OH])[O-]'), - AcidBasePair('-BO2H2', '[!O]B([OH])[OH]', '[!O]B([OH])[O-]'), - AcidBasePair('phenol', 'c[OH]', 'c[O-]'), - AcidBasePair('SH (aliphatic)', 'C[SH]', 'C[S-]'), - AcidBasePair('(-OBO2H)-', 'OB([O-])[OH]', 'OB([O-])[O-]'), - AcidBasePair('(-BO2H)-', '[!O]B([O-])[OH]', '[!O]B([O-])[O-]'), - AcidBasePair('cyclopentadiene', 'C1=CC=C[CH2]1', 'c1ccc[cH-]1'), - AcidBasePair('-CONH2', 'C(=O)[NH2]', 'C(=O)[NH-]'), - AcidBasePair('imidazole', 'c1cnc[nH]1', 'c1cnc[n-]1'), - AcidBasePair('-OH (aliphatic alcohol)', '[CX4][OH]', '[CX4][O-]'), - AcidBasePair('alpha-carbon-hydrogen-keto group', 'O=C([!O])[C!H0+0]', 'O=C([!O])[C-]'), - AcidBasePair('alpha-carbon-hydrogen-acetyl ester group', 'OC(=O)[C!H0+0]', 'OC(=O)[C-]'), - AcidBasePair('sp carbon hydrogen', 'C#[CH]', 'C#[C-]'), - AcidBasePair('alpha-carbon-hydrogen-sulfone group', 'CS(=O)(=O)[C!H0+0]', 'CS(=O)(=O)[C-]'), - AcidBasePair('alpha-carbon-hydrogen-sulfoxide group', 'C[SD3](=O)[C!H0+0]', 'C[SD3](=O)[C-]'), - AcidBasePair('-NH2', '[CX4][NH2]', '[CX4][NH-]'), - AcidBasePair('benzyl hydrogen', 'c[CX4H2]', 'c[CX3H-]'), - AcidBasePair('sp2-carbon hydrogen', '[CX3]=[CX3!H0+0]', '[CX3]=[CX2-]'), - AcidBasePair('sp3-carbon hydrogen', '[CX4!H0+0]', '[CX3-]'), + AcidBasePair("-OSO3H", "OS(=O)(=O)[OH]", "OS(=O)(=O)[O-]"), + AcidBasePair("–SO3H", "[!O]S(=O)(=O)[OH]", "[!O]S(=O)(=O)[O-]"), + AcidBasePair("-OSO2H", "O[SD3](=O)[OH]", "O[SD3](=O)[O-]"), + AcidBasePair("-SO2H", "[!O][SD3](=O)[OH]", "[!O][SD3](=O)[O-]"), + AcidBasePair("-OPO3H2", "OP(=O)([OH])[OH]", "OP(=O)([OH])[O-]"), + AcidBasePair("-PO3H2", "[!O]P(=O)([OH])[OH]", "[!O]P(=O)([OH])[O-]"), + AcidBasePair("-CO2H", "C(=O)[OH]", "C(=O)[O-]"), + AcidBasePair("thiophenol", "c[SH]", "c[S-]"), + AcidBasePair("(-OPO3H)-", "OP(=O)([O-])[OH]", "OP(=O)([O-])[O-]"), + AcidBasePair("(-PO3H)-", "[!O]P(=O)([O-])[OH]", "[!O]P(=O)([O-])[O-]"), + AcidBasePair("phthalimide", "O=C2c1ccccc1C(=O)[NH]2", "O=C2c1ccccc1C(=O)[N-]2"), + AcidBasePair("CO3H (peracetyl)", "C(=O)O[OH]", "C(=O)O[O-]"), + AcidBasePair("alpha-carbon-hydrogen-nitro group", "O=N(O)[CH]", "O=N(O)[C-]"), + AcidBasePair("-SO2NH2", "S(=O)(=O)[NH2]", "S(=O)(=O)[NH-]"), + AcidBasePair("-OBO2H2", "OB([OH])[OH]", "OB([OH])[O-]"), + AcidBasePair("-BO2H2", "[!O]B([OH])[OH]", "[!O]B([OH])[O-]"), + AcidBasePair("phenol", "c[OH]", "c[O-]"), + AcidBasePair("SH (aliphatic)", "C[SH]", "C[S-]"), + AcidBasePair("(-OBO2H)-", "OB([O-])[OH]", "OB([O-])[O-]"), + AcidBasePair("(-BO2H)-", "[!O]B([O-])[OH]", "[!O]B([O-])[O-]"), + AcidBasePair("cyclopentadiene", "C1=CC=C[CH2]1", "c1ccc[cH-]1"), + AcidBasePair("-CONH2", "C(=O)[NH2]", "C(=O)[NH-]"), + AcidBasePair("imidazole", "c1cnc[nH]1", "c1cnc[n-]1"), + AcidBasePair("-OH (aliphatic alcohol)", "[CX4][OH]", "[CX4][O-]"), + AcidBasePair( + "alpha-carbon-hydrogen-keto group", "O=C([!O])[C!H0+0]", "O=C([!O])[C-]" + ), + AcidBasePair( + "alpha-carbon-hydrogen-acetyl ester group", "OC(=O)[C!H0+0]", "OC(=O)[C-]" + ), + AcidBasePair("sp carbon hydrogen", "C#[CH]", "C#[C-]"), + AcidBasePair( + "alpha-carbon-hydrogen-sulfone group", "CS(=O)(=O)[C!H0+0]", "CS(=O)(=O)[C-]" + ), + AcidBasePair( + "alpha-carbon-hydrogen-sulfoxide group", "C[SD3](=O)[C!H0+0]", "C[SD3](=O)[C-]" + ), + AcidBasePair("-NH2", "[CX4][NH2]", "[CX4][NH-]"), + AcidBasePair("benzyl hydrogen", "c[CX4H2]", "c[CX3H-]"), + AcidBasePair("sp2-carbon hydrogen", "[CX3]=[CX3!H0+0]", "[CX3]=[CX2-]"), + AcidBasePair("sp3-carbon hydrogen", "[CX4!H0+0]", "[CX3-]"), ) @@ -107,18 +115,20 @@ def __init__(self, name, smarts, charge): :param string smarts: SMARTS pattern to match. Charge is applied to the first atom. :param int charge: The charge to apply. """ - log.debug('Initializing ChargeCorrection: %s', name) + log.debug("Initializing ChargeCorrection: %s", name) self.name = name self.smarts_str = smarts self.charge = charge @memoized_property def smarts(self): - log.debug('Loading ChargeCorrection smarts: %s', self.name) + log.debug("Loading ChargeCorrection smarts: %s", self.name) return Chem.MolFromSmarts(self.smarts_str) def __repr__(self): - return 'ChargeCorrection({!r}, {!r}, {!r})'.format(self.name, self.smarts_str, self.charge) + return "ChargeCorrection({!r}, {!r}, {!r})".format( + self.name, self.smarts_str, self.charge + ) def __str__(self): return self.name @@ -126,9 +136,9 @@ def __str__(self): #: The default list of ChargeCorrections. CHARGE_CORRECTIONS = ( - ChargeCorrection('[Li,Na,K]', '[Li,Na,K;X0+0]', 1), - ChargeCorrection('[Mg,Ca]', '[Mg,Ca;X0+0]', 2), - ChargeCorrection('[Cl]', '[Cl;X0+0]', -1), + ChargeCorrection("[Li,Na,K]", "[Li,Na,K;X0+0]", 1), + ChargeCorrection("[Mg,Ca]", "[Mg,Ca;X0+0]", 2), + ChargeCorrection("[Cl]", "[Cl;X0+0]", -1), # TODO: Extend to other incorrectly charged atoms ) @@ -136,14 +146,16 @@ def __str__(self): class Reionizer(object): """A class to fix charges and reionize a molecule such that the strongest acids ionize first.""" - def __init__(self, acid_base_pairs=ACID_BASE_PAIRS, charge_corrections=CHARGE_CORRECTIONS): + def __init__( + self, acid_base_pairs=ACID_BASE_PAIRS, charge_corrections=CHARGE_CORRECTIONS + ): """Initialize a Reionizer with the following parameter: :param acid_base_pairs: A list of :class:`AcidBasePairs ` to reionize, sorted from strongest to weakest. :param charge_corrections: A list of :class:`ChargeCorrections `. """ - log.debug('Initializing Reionizer') + log.debug("Initializing Reionizer") self.acid_base_pairs = acid_base_pairs self.charge_corrections = charge_corrections @@ -167,7 +179,7 @@ def reionize(self, mol): :return: The reionized molecule. :rtype: rdkit.Chem.rdchem.Mol """ - log.debug('Running Reionizer') + log.debug("Running Reionizer") start_charge = Chem.GetFormalCharge(mol) @@ -175,7 +187,12 @@ def reionize(self, mol): for cc in self.charge_corrections: for match in mol.GetSubstructMatches(cc.smarts): atom = mol.GetAtomWithIdx(match[0]) - log.info('Applying charge correction %s (%s %+d)', cc.name, atom.GetSymbol(), cc.charge) + log.info( + "Applying charge correction %s (%s %+d)", + cc.name, + atom.GetSymbol(), + cc.charge, + ) atom.SetFormalCharge(cc.charge) current_charge = Chem.GetFormalCharge(mol) @@ -187,7 +204,10 @@ def reionize(self, mol): ppos, poccur = self._strongest_protonated(mol) if ppos is None: break - log.info('Ionizing %s to balance previous charge corrections', self.acid_base_pairs[ppos].name) + log.info( + "Ionizing %s to balance previous charge corrections", + self.acid_base_pairs[ppos].name, + ) patom = mol.GetAtomWithIdx(poccur[-1]) patom.SetFormalCharge(patom.GetFormalCharge() - 1) if patom.GetNumExplicitHs() > 0: @@ -203,16 +223,22 @@ def reionize(self, mol): if ioccur and poccur and ppos < ipos: if poccur[-1] == ioccur[-1]: # Bad! H wouldn't be moved, resulting in infinite loop. - log.warning('Aborted reionization due to unexpected situation') + log.warning("Aborted reionization due to unexpected situation") break key = tuple(sorted([poccur[-1], ioccur[-1]])) if key in already_moved: - log.warning('Aborting reionization to avoid infinite loop due to it being ambiguous where to put a Hydrogen') + log.warning( + "Aborting reionization to avoid infinite loop due to it being ambiguous where to put a Hydrogen" + ) break already_moved.add(key) - log.info('Moved proton from %s to %s', self.acid_base_pairs[ppos].name, self.acid_base_pairs[ipos].name) + log.info( + "Moved proton from %s to %s", + self.acid_base_pairs[ppos].name, + self.acid_base_pairs[ipos].name, + ) # Remove hydrogen from strongest protonated patom = mol.GetAtomWithIdx(poccur[-1]) @@ -227,9 +253,17 @@ def reionize(self, mol): iatom = mol.GetAtomWithIdx(ioccur[-1]) iatom.SetFormalCharge(iatom.GetFormalCharge() + 1) # Increase explicit H count if no implicit, or aromatic N or P, or non default valence state - if (iatom.GetNoImplicit() or - ((patom.GetAtomicNum() == 7 or patom.GetAtomicNum() == 15) and patom.GetIsAromatic()) or - iatom.GetTotalValence() not in list(Chem.GetPeriodicTable().GetValenceList(iatom.GetAtomicNum()))): + if ( + iatom.GetNoImplicit() + or ( + (patom.GetAtomicNum() == 7 or patom.GetAtomicNum() == 15) + and patom.GetIsAromatic() + ) + or iatom.GetTotalValence() + not in list( + Chem.GetPeriodicTable().GetValenceList(iatom.GetAtomicNum()) + ) + ): iatom.SetNumExplicitHs(iatom.GetNumExplicitHs() + 1) iatom.UpdatePropertyCache() else: @@ -261,9 +295,9 @@ class Uncharger(object): """ def __init__(self, acid_base_pairs=ACID_BASE_PAIRS): - log.debug('Initializing Uncharger') + log.debug("Initializing Uncharger") self.acid_base_pairs = acid_base_pairs - self.nitro = Chem.MolFromSmarts('[!#8][NX3+](=O)[O-]') + self.nitro = Chem.MolFromSmarts("[!#8][NX3+](=O)[O-]") def __call__(self, mol): """Calling an Uncharger instance like a function is the same as calling its uncharge(mol) method.""" @@ -277,7 +311,7 @@ def uncharge(self, mol): :return: The uncharged molecule. :rtype: rdkit.Chem.rdchem.Mol """ - log.debug('Running Uncharger') + log.debug("Running Uncharger") mol = copy.deepcopy(mol) # Neutralize positive charges @@ -288,7 +322,7 @@ def uncharge(self, mol): while atom.GetFormalCharge() > 0 and atom.GetNumExplicitHs() > 0: atom.SetNumExplicitHs(atom.GetNumExplicitHs() - 1) atom.SetFormalCharge(atom.GetFormalCharge() - 1) - log.info('Removed positive charge') + log.info("Removed positive charge") chg = atom.GetFormalCharge() if chg > 0: # Record number of non-neutralizable positive charges @@ -310,7 +344,7 @@ def uncharge(self, mol): atom.SetNumExplicitHs(atom.GetNumExplicitHs() + 1) atom.SetFormalCharge(atom.GetFormalCharge() + 1) neg_count -= 1 - log.info('Removed negative charge') + log.info("Removed negative charge") return mol def _get_neg_skip(self, mol, pos_count): diff --git a/gypsum_dl/molvs/cli.py b/gypsum_dl/molvs/cli.py index 72c1598..4a1d014 100644 --- a/gypsum_dl/molvs/cli.py +++ b/gypsum_dl/molvs/cli.py @@ -7,27 +7,24 @@ """ -from __future__ import print_function -from __future__ import unicode_literals -from __future__ import division +from __future__ import division, print_function, unicode_literals + import argparse import logging -from rdkit import Chem import sys from molvs import Standardizer, Validator - +from rdkit import Chem log = logging.getLogger(__name__) -FILETYPES = ['smi', 'mol', 'sdf'] +FILETYPES = ["smi", "mol", "sdf"] class MolvsParser(argparse.ArgumentParser): - def error(self, message): - sys.stderr.write('Error: %s\n\n'.encode() % message) + sys.stderr.write("Error: %s\n\n".encode() % message) self.print_help() sys.exit(2) @@ -36,31 +33,56 @@ def main(): """Main function for molvs command line interface.""" # Root options - parser = MolvsParser(epilog='use "molvs -h" to show help for a specific command') - subparsers = parser.add_subparsers(title='Available commands') + parser = MolvsParser( + epilog='use "molvs -h" to show help for a specific command' + ) + subparsers = parser.add_subparsers(title="Available commands") # Options common to all commands common_parser = MolvsParser(add_help=False) - common_parser.add_argument('infile', nargs='?', help='input filename', type=argparse.FileType('r'), default=sys.stdin) - common_parser.add_argument('-i', '--intype', help='input filetype', choices=FILETYPES) - common_parser.add_argument('-:', '--smiles', help='input SMILES instead of file', metavar='') - common_parser.add_argument('-O', '--outfile', help='output filename', type=argparse.FileType('w'), default=sys.stdout, metavar='') + common_parser.add_argument( + "infile", + nargs="?", + help="input filename", + type=argparse.FileType("r"), + default=sys.stdin, + ) + common_parser.add_argument( + "-i", "--intype", help="input filetype", choices=FILETYPES + ) + common_parser.add_argument( + "-:", "--smiles", help="input SMILES instead of file", metavar="" + ) + common_parser.add_argument( + "-O", + "--outfile", + help="output filename", + type=argparse.FileType("w"), + default=sys.stdout, + metavar="", + ) # Standardize options - standardize_parser = subparsers.add_parser('standardize', help='standardize a molecule', parents=[common_parser]) - standardize_parser.add_argument('-o', '--outtype', help='output filetype', choices=FILETYPES) + standardize_parser = subparsers.add_parser( + "standardize", help="standardize a molecule", parents=[common_parser] + ) + standardize_parser.add_argument( + "-o", "--outtype", help="output filetype", choices=FILETYPES + ) standardize_parser.set_defaults(func=standardize_main) # Validate options - validate_parser = subparsers.add_parser('validate', help='validate a molecule', parents=[common_parser]) + validate_parser = subparsers.add_parser( + "validate", help="validate a molecule", parents=[common_parser] + ) validate_parser.set_defaults(func=validate_main) args = parser.parse_args() try: args.func(args) except Exception as e: - sys.stderr.write('Error: %s\n\n'.encode() % e.message) + sys.stderr.write("Error: %s\n\n".encode() % e.message) parser.print_help() sys.exit(2) @@ -68,23 +90,39 @@ def main(): def _read_mol(args): if args.smiles: return Chem.MolFromSmiles(args.smiles) - elif args.intype in {'smi', 'smiles'} or args.infile.name.endswith('smi') or args.infile.name.endswith('smiles'): + elif ( + args.intype in {"smi", "smiles"} + or args.infile.name.endswith("smi") + or args.infile.name.endswith("smiles") + ): return Chem.MolFromSmiles(args.infile.read()) - elif args.intype in {'mol', 'sdf'} or args.infile.name.endswith('mol') or args.infile.name.endswith('sdf'): + elif ( + args.intype in {"mol", "sdf"} + or args.infile.name.endswith("mol") + or args.infile.name.endswith("sdf") + ): return Chem.MolFromMolBlock(args.infile.read()) else: return Chem.MolFromSmiles(args.infile.read()) def _write_mol(mol, args): - if args.outtype in {'smi', 'smiles'} or args.outfile.name.endswith('smi') or args.outfile.name.endswith('smiles'): + if ( + args.outtype in {"smi", "smiles"} + or args.outfile.name.endswith("smi") + or args.outfile.name.endswith("smiles") + ): args.outfile.write(Chem.MolToSmiles(mol)) - args.outfile.write('\n') - elif args.outtype in {'mol', 'sdf'} or args.outfile.name.endswith('mol') or args.outfile.name.endswith('sdf'): + args.outfile.write("\n") + elif ( + args.outtype in {"mol", "sdf"} + or args.outfile.name.endswith("mol") + or args.outfile.name.endswith("sdf") + ): args.outfile.write(Chem.MolToMolBlock(mol)) else: args.outfile.write(Chem.MolToSmiles(mol)) - args.outfile.write('\n') + args.outfile.write("\n") def standardize_main(args): @@ -100,5 +138,4 @@ def validate_main(args): logs = v.validate(mol) for log in logs: args.outfile.write(log) - args.outfile.write('\n') - + args.outfile.write("\n") diff --git a/gypsum_dl/molvs/errors.py b/gypsum_dl/molvs/errors.py index 0b7009f..68ff7b5 100644 --- a/gypsum_dl/molvs/errors.py +++ b/gypsum_dl/molvs/errors.py @@ -7,9 +7,7 @@ """ -from __future__ import print_function -from __future__ import unicode_literals -from __future__ import division +from __future__ import division, print_function, unicode_literals class MolVSError(Exception): @@ -26,4 +24,5 @@ class ValidateError(MolVSError): class StopValidateError(ValidateError): """Called by Validations to stop any further validations from being performed.""" + pass diff --git a/gypsum_dl/molvs/fragment.py b/gypsum_dl/molvs/fragment.py index b7f4a12..f513a84 100644 --- a/gypsum_dl/molvs/fragment.py +++ b/gypsum_dl/molvs/fragment.py @@ -9,9 +9,8 @@ """ -from __future__ import print_function -from __future__ import unicode_literals -from __future__ import division +from __future__ import division, print_function, unicode_literals + import logging from rdkit import Chem @@ -19,7 +18,6 @@ from .utils import memoized_property - log = logging.getLogger(__name__) @@ -40,7 +38,7 @@ def smarts(self): return Chem.MolFromSmarts(self.smarts_str) def __repr__(self): - return 'FragmentPattern({!r}, {!r})'.format(self.name, self.smarts_str) + return "FragmentPattern({!r}, {!r})".format(self.name, self.smarts_str) def __str__(self): return self.name @@ -49,67 +47,74 @@ def __str__(self): #: The default list of :class:`FragmentPatterns ` to be used by #: :class:`~molvs.fragment.FragmentRemover`. REMOVE_FRAGMENTS = ( - FragmentPattern('hydrogen', '[H]'), - FragmentPattern('fluorine', '[F]'), - FragmentPattern('chlorine', '[Cl]'), - FragmentPattern('bromine', '[Br]'), - FragmentPattern('iodine', '[I]'), - FragmentPattern('lithium', '[Li]'), - FragmentPattern('sodium', '[Na]'), - FragmentPattern('potassium', '[K]'), - FragmentPattern('calcium', '[Ca]'), - FragmentPattern('magnesium', '[Mg]'), - FragmentPattern('aluminium', '[Al]'), - FragmentPattern('barium', '[Ba]'), - FragmentPattern('bismuth', '[Bi]'), - FragmentPattern('silver', '[Ag]'), - FragmentPattern('strontium', '[Sr]'), - FragmentPattern('zinc', '[Zn]'), - FragmentPattern('ammonia/ammonium', '[#7]'), - FragmentPattern('water/hydroxide', '[#8]'), - FragmentPattern('methyl amine', '[#6]-[#7]'), - FragmentPattern('sulfide', 'S'), - FragmentPattern('nitrate', '[#7](=[#8])(-[#8])-[#8]'), - FragmentPattern('phosphate', '[P](=[#8])(-[#8])(-[#8])-[#8]'), - FragmentPattern('hexafluorophosphate', '[P](-[#9])(-[#9])(-[#9])(-[#9])(-[#9])-[#9]'), - FragmentPattern('sulfate', '[S](=[#8])(=[#8])(-[#8])-[#8]'), - FragmentPattern('methyl sulfonate', '[#6]-[S](=[#8])(=[#8])(-[#8])'), - FragmentPattern('trifluoromethanesulfonic acid', '[#8]-[S](=[#8])(=[#8])-[#6](-[#9])(-[#9])-[#9]'), - FragmentPattern('trifluoroacetic acid', '[#9]-[#6](-[#9])(-[#9])-[#6](=[#8])-[#8]'), - FragmentPattern('1,2-dichloroethane', '[Cl]-[#6]-[#6]-[Cl]'), - FragmentPattern('1,2-dimethoxyethane', '[#6]-[#8]-[#6]-[#6]-[#8]-[#6]'), - FragmentPattern('1,4-dioxane', '[#6]-1-[#6]-[#8]-[#6]-[#6]-[#8]-1'), - FragmentPattern('1-methyl-2-pyrrolidinone', '[#6]-[#7]-1-[#6]-[#6]-[#6]-[#6]-1=[#8]'), - FragmentPattern('2-butanone', '[#6]-[#6]-[#6](-[#6])=[#8]'), - FragmentPattern('acetate/acetic acid', '[#8]-[#6](-[#6])=[#8]'), - FragmentPattern('acetone', '[#6]-[#6](-[#6])=[#8]'), - FragmentPattern('acetonitrile', '[#6]-[#6]#[N]'), - FragmentPattern('benzene', '[#6]1[#6][#6][#6][#6][#6]1'), - FragmentPattern('butanol', '[#8]-[#6]-[#6]-[#6]-[#6]'), - FragmentPattern('t-butanol', '[#8]-[#6](-[#6])(-[#6])-[#6]'), - FragmentPattern('chloroform', '[Cl]-[#6](-[Cl])-[Cl]'), - FragmentPattern('cycloheptane', '[#6]-1-[#6]-[#6]-[#6]-[#6]-[#6]-[#6]-1'), - FragmentPattern('cyclohexane', '[#6]-1-[#6]-[#6]-[#6]-[#6]-[#6]-1'), - FragmentPattern('dichloromethane', '[Cl]-[#6]-[Cl]'), - FragmentPattern('diethyl ether', '[#6]-[#6]-[#8]-[#6]-[#6]'), - FragmentPattern('diisopropyl ether', '[#6]-[#6](-[#6])-[#8]-[#6](-[#6])-[#6]'), - FragmentPattern('dimethyl formamide', '[#6]-[#7](-[#6])-[#6]=[#8]'), - FragmentPattern('dimethyl sulfoxide', '[#6]-[S](-[#6])=[#8]'), - FragmentPattern('ethanol', '[#8]-[#6]-[#6]'), - FragmentPattern('ethyl acetate', '[#6]-[#6]-[#8]-[#6](-[#6])=[#8]'), - FragmentPattern('formic acid', '[#8]-[#6]=[#8]'), - FragmentPattern('heptane', '[#6]-[#6]-[#6]-[#6]-[#6]-[#6]-[#6]'), - FragmentPattern('hexane', '[#6]-[#6]-[#6]-[#6]-[#6]-[#6]'), - FragmentPattern('isopropanol', '[#8]-[#6](-[#6])-[#6]'), - FragmentPattern('methanol', '[#8]-[#6]'), - FragmentPattern('N,N-dimethylacetamide', '[#6]-[#7](-[#6])-[#6](-[#6])=[#8]'), - FragmentPattern('pentane', '[#6]-[#6]-[#6]-[#6]-[#6]'), - FragmentPattern('propanol', '[#8]-[#6]-[#6]-[#6]'), - FragmentPattern('pyridine', '[#6]-1=[#6]-[#6]=[#7]-[#6]=[#6]-1'), - FragmentPattern('t-butyl methyl ether', '[#6]-[#8]-[#6](-[#6])(-[#6])-[#6]'), - FragmentPattern('tetrahydrofurane', '[#6]-1-[#6]-[#6]-[#8]-[#6]-1'), - FragmentPattern('toluene', '[#6]-[#6]~1~[#6]~[#6]~[#6]~[#6]~[#6]~1'), - FragmentPattern('xylene', '[#6]-[#6]~1~[#6](-[#6])~[#6]~[#6]~[#6]~[#6]~1') + FragmentPattern("hydrogen", "[H]"), + FragmentPattern("fluorine", "[F]"), + FragmentPattern("chlorine", "[Cl]"), + FragmentPattern("bromine", "[Br]"), + FragmentPattern("iodine", "[I]"), + FragmentPattern("lithium", "[Li]"), + FragmentPattern("sodium", "[Na]"), + FragmentPattern("potassium", "[K]"), + FragmentPattern("calcium", "[Ca]"), + FragmentPattern("magnesium", "[Mg]"), + FragmentPattern("aluminium", "[Al]"), + FragmentPattern("barium", "[Ba]"), + FragmentPattern("bismuth", "[Bi]"), + FragmentPattern("silver", "[Ag]"), + FragmentPattern("strontium", "[Sr]"), + FragmentPattern("zinc", "[Zn]"), + FragmentPattern("ammonia/ammonium", "[#7]"), + FragmentPattern("water/hydroxide", "[#8]"), + FragmentPattern("methyl amine", "[#6]-[#7]"), + FragmentPattern("sulfide", "S"), + FragmentPattern("nitrate", "[#7](=[#8])(-[#8])-[#8]"), + FragmentPattern("phosphate", "[P](=[#8])(-[#8])(-[#8])-[#8]"), + FragmentPattern( + "hexafluorophosphate", "[P](-[#9])(-[#9])(-[#9])(-[#9])(-[#9])-[#9]" + ), + FragmentPattern("sulfate", "[S](=[#8])(=[#8])(-[#8])-[#8]"), + FragmentPattern("methyl sulfonate", "[#6]-[S](=[#8])(=[#8])(-[#8])"), + FragmentPattern( + "trifluoromethanesulfonic acid", + "[#8]-[S](=[#8])(=[#8])-[#6](-[#9])(-[#9])-[#9]", + ), + FragmentPattern("trifluoroacetic acid", "[#9]-[#6](-[#9])(-[#9])-[#6](=[#8])-[#8]"), + FragmentPattern("1,2-dichloroethane", "[Cl]-[#6]-[#6]-[Cl]"), + FragmentPattern("1,2-dimethoxyethane", "[#6]-[#8]-[#6]-[#6]-[#8]-[#6]"), + FragmentPattern("1,4-dioxane", "[#6]-1-[#6]-[#8]-[#6]-[#6]-[#8]-1"), + FragmentPattern( + "1-methyl-2-pyrrolidinone", "[#6]-[#7]-1-[#6]-[#6]-[#6]-[#6]-1=[#8]" + ), + FragmentPattern("2-butanone", "[#6]-[#6]-[#6](-[#6])=[#8]"), + FragmentPattern("acetate/acetic acid", "[#8]-[#6](-[#6])=[#8]"), + FragmentPattern("acetone", "[#6]-[#6](-[#6])=[#8]"), + FragmentPattern("acetonitrile", "[#6]-[#6]#[N]"), + FragmentPattern("benzene", "[#6]1[#6][#6][#6][#6][#6]1"), + FragmentPattern("butanol", "[#8]-[#6]-[#6]-[#6]-[#6]"), + FragmentPattern("t-butanol", "[#8]-[#6](-[#6])(-[#6])-[#6]"), + FragmentPattern("chloroform", "[Cl]-[#6](-[Cl])-[Cl]"), + FragmentPattern("cycloheptane", "[#6]-1-[#6]-[#6]-[#6]-[#6]-[#6]-[#6]-1"), + FragmentPattern("cyclohexane", "[#6]-1-[#6]-[#6]-[#6]-[#6]-[#6]-1"), + FragmentPattern("dichloromethane", "[Cl]-[#6]-[Cl]"), + FragmentPattern("diethyl ether", "[#6]-[#6]-[#8]-[#6]-[#6]"), + FragmentPattern("diisopropyl ether", "[#6]-[#6](-[#6])-[#8]-[#6](-[#6])-[#6]"), + FragmentPattern("dimethyl formamide", "[#6]-[#7](-[#6])-[#6]=[#8]"), + FragmentPattern("dimethyl sulfoxide", "[#6]-[S](-[#6])=[#8]"), + FragmentPattern("ethanol", "[#8]-[#6]-[#6]"), + FragmentPattern("ethyl acetate", "[#6]-[#6]-[#8]-[#6](-[#6])=[#8]"), + FragmentPattern("formic acid", "[#8]-[#6]=[#8]"), + FragmentPattern("heptane", "[#6]-[#6]-[#6]-[#6]-[#6]-[#6]-[#6]"), + FragmentPattern("hexane", "[#6]-[#6]-[#6]-[#6]-[#6]-[#6]"), + FragmentPattern("isopropanol", "[#8]-[#6](-[#6])-[#6]"), + FragmentPattern("methanol", "[#8]-[#6]"), + FragmentPattern("N,N-dimethylacetamide", "[#6]-[#7](-[#6])-[#6](-[#6])=[#8]"), + FragmentPattern("pentane", "[#6]-[#6]-[#6]-[#6]-[#6]"), + FragmentPattern("propanol", "[#8]-[#6]-[#6]-[#6]"), + FragmentPattern("pyridine", "[#6]-1=[#6]-[#6]=[#7]-[#6]=[#6]-1"), + FragmentPattern("t-butyl methyl ether", "[#6]-[#8]-[#6](-[#6])(-[#6])-[#6]"), + FragmentPattern("tetrahydrofurane", "[#6]-1-[#6]-[#6]-[#8]-[#6]-1"), + FragmentPattern("toluene", "[#6]-[#6]~1~[#6]~[#6]~[#6]~[#6]~[#6]~1"), + FragmentPattern("xylene", "[#6]-[#6]~1~[#6](-[#6])~[#6]~[#6]~[#6]~[#6]~1"), ) #: The default value for whether to ensure at least one fragment is left after FragmentRemover is applied. @@ -146,7 +151,7 @@ def __init__(self, fragments=REMOVE_FRAGMENTS, leave_last=LEAVE_LAST): :param fragments: A list of :class:`~molvs.fragment.FragmentPattern` to remove. :param bool leave_last: Whether to ensure at least one fragment is left. """ - log.debug('Initializing FragmentRemover') + log.debug("Initializing FragmentRemover") self.fragments = fragments self.leave_last = leave_last @@ -162,16 +167,18 @@ def remove(self, mol): :return: The molecule with fragments removed. :rtype: rdkit.Chem.rdchem.Mol """ - log.debug('Running FragmentRemover') + log.debug("Running FragmentRemover") # Iterate FragmentPatterns and remove matching fragments for frag in self.fragments: # If nothing is left or leave_last and only one fragment, end here - if mol.GetNumAtoms() == 0 or (self.leave_last and len(Chem.GetMolFrags(mol)) <= 1): + if mol.GetNumAtoms() == 0 or ( + self.leave_last and len(Chem.GetMolFrags(mol)) <= 1 + ): break # Apply removal for this FragmentPattern removed = Chem.DeleteSubstructs(mol, frag.smarts, onlyFrags=True) if not mol.GetNumAtoms() == removed.GetNumAtoms(): - log.info('Removed fragment: %s', frag.name) + log.info("Removed fragment: %s", frag.name) if self.leave_last and removed.GetNumAtoms() == 0: # All the remaining fragments match this pattern - leave them all break @@ -190,7 +197,7 @@ def __init__(self, prefer_organic=PREFER_ORGANIC): :param bool prefer_organic: Whether to prioritize organic fragments above all others. """ - log.debug('Initializing LargestFragmentChooser') + log.debug("Initializing LargestFragmentChooser") self.prefer_organic = prefer_organic def __call__(self, mol): @@ -208,36 +215,47 @@ def choose(self, mol): :return: The largest fragment. :rtype: rdkit.Chem.rdchem.Mol """ - log.debug('Running LargestFragmentChooser') + log.debug("Running LargestFragmentChooser") # TODO: Alternatively allow a list of fragments to be passed as the mol parameter fragments = Chem.GetMolFrags(mol, asMols=True) largest = None for f in fragments: smiles = Chem.MolToSmiles(f, isomericSmiles=True) - log.debug('Fragment: %s', smiles) + log.debug("Fragment: %s", smiles) organic = is_organic(f) if self.prefer_organic: # Skip this fragment if not organic and we already have an organic fragment as the largest so far - if largest and largest['organic'] and not organic: + if largest and largest["organic"] and not organic: continue # Reset largest if it wasn't organic and this fragment is organic - if largest and organic and not largest['organic']: + if largest and organic and not largest["organic"]: largest = None # Count atoms atoms = 0 for a in f.GetAtoms(): atoms += 1 + a.GetTotalNumHs() # Skip this fragment if fewer atoms than the largest - if largest and atoms < largest['atoms']: + if largest and atoms < largest["atoms"]: continue # Skip this fragment if equal number of atoms but weight is lower weight = rdMolDescriptors.CalcExactMolWt(f) - if largest and atoms == largest['atoms'] and weight < largest['weight']: + if largest and atoms == largest["atoms"] and weight < largest["weight"]: continue # Skip this fragment if equal atoms and equal weight but smiles comes last alphabetically - if largest and atoms == largest['atoms'] and weight == largest['weight'] and smiles > largest['smiles']: + if ( + largest + and atoms == largest["atoms"] + and weight == largest["weight"] + and smiles > largest["smiles"] + ): continue # Otherwise this is the largest so far - log.debug('New largest fragment: %s (%s)', smiles, atoms) - largest = {'smiles': smiles, 'fragment': f, 'atoms': atoms, 'weight': weight, 'organic': organic} - return largest['fragment'] + log.debug("New largest fragment: %s (%s)", smiles, atoms) + largest = { + "smiles": smiles, + "fragment": f, + "atoms": atoms, + "weight": weight, + "organic": organic, + } + return largest["fragment"] diff --git a/gypsum_dl/molvs/metal.py b/gypsum_dl/molvs/metal.py index a0ff44e..ddd2be5 100644 --- a/gypsum_dl/molvs/metal.py +++ b/gypsum_dl/molvs/metal.py @@ -7,14 +7,12 @@ """ -from __future__ import print_function -from __future__ import unicode_literals -from __future__ import division +from __future__ import division, print_function, unicode_literals + import logging from rdkit import Chem - log = logging.getLogger(__name__) @@ -25,11 +23,15 @@ class MetalDisconnector(object): """Class for breaking covalent bonds between metals and organic atoms under certain conditions.""" def __init__(self): - log.debug('Initializing MetalDisconnector') + log.debug("Initializing MetalDisconnector") # Initialize SMARTS to identify relevant substructures # TODO: Use atomic numbers instead of element symbols in SMARTS to allow for isotopes? - self._metal_nof = Chem.MolFromSmarts('[Li,Na,K,Rb,Cs,Fr,Be,Mg,Ca,Sr,Ba,Ra,Sc,Ti,V,Cr,Mn,Fe,Co,Ni,Cu,Zn,Al,Ga,Y,Zr,Nb,Mo,Tc,Ru,Rh,Pd,Ag,Cd,In,Sn,Hf,Ta,W,Re,Os,Ir,Pt,Au,Hg,Tl,Pb,Bi]~[N,O,F]') - self._metal_non = Chem.MolFromSmarts('[Al,Sc,Ti,V,Cr,Mn,Fe,Co,Ni,Cu,Zn,Y,Zr,Nb,Mo,Tc,Ru,Rh,Pd,Ag,Cd,Hf,Ta,W,Re,Os,Ir,Pt,Au]~[B,C,Si,P,As,Sb,S,Se,Te,Cl,Br,I,At]') + self._metal_nof = Chem.MolFromSmarts( + "[Li,Na,K,Rb,Cs,Fr,Be,Mg,Ca,Sr,Ba,Ra,Sc,Ti,V,Cr,Mn,Fe,Co,Ni,Cu,Zn,Al,Ga,Y,Zr,Nb,Mo,Tc,Ru,Rh,Pd,Ag,Cd,In,Sn,Hf,Ta,W,Re,Os,Ir,Pt,Au,Hg,Tl,Pb,Bi]~[N,O,F]" + ) + self._metal_non = Chem.MolFromSmarts( + "[Al,Sc,Ti,V,Cr,Mn,Fe,Co,Ni,Cu,Zn,Y,Zr,Nb,Mo,Tc,Ru,Rh,Pd,Ag,Cd,Hf,Ta,W,Re,Os,Ir,Pt,Au]~[B,C,Si,P,As,Sb,S,Se,Te,Cl,Br,I,At]" + ) def __call__(self, mol): """Calling a MetalDisconnector instance like a function is the same as calling its disconnect(mol) method.""" @@ -49,7 +51,7 @@ def disconnect(self, mol): :return: The molecule with metals disconnected. :rtype: rdkit.Chem.rdchem.Mol """ - log.debug('Running MetalDisconnector') + log.debug("Running MetalDisconnector") # Remove bonds that match SMARTS for smarts in [self._metal_nof, self._metal_non]: pairs = mol.GetSubstructMatches(smarts) @@ -67,6 +69,10 @@ def disconnect(self, mol): atom1.SetFormalCharge(atom1.GetFormalCharge() + chg) atom2 = mol.GetAtomWithIdx(j) atom2.SetFormalCharge(atom2.GetFormalCharge() - chg) - log.info('Removed covalent bond between %s and %s', atom1.GetSymbol(), atom2.GetSymbol()) + log.info( + "Removed covalent bond between %s and %s", + atom1.GetSymbol(), + atom2.GetSymbol(), + ) Chem.SanitizeMol(mol) return mol diff --git a/gypsum_dl/molvs/normalize.py b/gypsum_dl/molvs/normalize.py index f4a91d4..31f3368 100644 --- a/gypsum_dl/molvs/normalize.py +++ b/gypsum_dl/molvs/normalize.py @@ -7,18 +7,16 @@ """ -from __future__ import print_function -from __future__ import unicode_literals -from __future__ import division +from __future__ import division, print_function, unicode_literals + import logging +import six from rdkit import Chem from rdkit.Chem import AllChem -import six from .utils import memoized_property - log = logging.getLogger(__name__) @@ -30,17 +28,17 @@ def __init__(self, name, transform): :param string name: A name for this Normalization :param string transform: Reaction SMARTS to define the transformation. """ - log.debug('Initializing Normalization: %s', name) + log.debug("Initializing Normalization: %s", name) self.name = name self.transform_str = transform @memoized_property def transform(self): - log.debug('Loading Normalization transform: %s', self.name) + log.debug("Loading Normalization transform: %s", self.name) return AllChem.ReactionFromSmarts(str(self.transform_str)) def __repr__(self): - return 'Normalization({!r}, {!r})'.format(self.name, self.transform_str) + return "Normalization({!r}, {!r})".format(self.name, self.transform_str) def __str__(self): return self.name @@ -49,38 +47,90 @@ def __str__(self): #: The default list of Normalization transforms. NORMALIZATIONS = ( # Opposite of #2.1 in InChI technical manual? Covered by RDKit Sanitization. - Normalization('Nitro to N+(O-)=O', '[N,P,As,Sb;X3:1](=[O,S,Se,Te:2])=[O,S,Se,Te:3]>>[*+1:1]([*-1:2])=[*:3]'), - Normalization('Sulfone to S(=O)(=O)', '[S+2:1]([O-:2])([O-:3])>>[S+0:1](=[O-0:2])(=[O-0:3])'), - Normalization('Pyridine oxide to n+O-', '[n:1]=[O:2]>>[n+:1][O-:2]'), - Normalization('Azide to N=N+=N-', '[*,H:1][N:2]=[N:3]#[N:4]>>[*,H:1][N:2]=[N+:3]=[N-:4]'), - Normalization('Diazo/azo to =N+=N-', '[*:1]=[N:2]#[N:3]>>[*:1]=[N+:2]=[N-:3]'), - Normalization('Sulfoxide to -S+(O-)-', '[!O:1][S+0;X3:2](=[O:3])[!O:4]>>[*:1][S+1:2]([O-:3])[*:4]'), + Normalization( + "Nitro to N+(O-)=O", + "[N,P,As,Sb;X3:1](=[O,S,Se,Te:2])=[O,S,Se,Te:3]>>[*+1:1]([*-1:2])=[*:3]", + ), + Normalization( + "Sulfone to S(=O)(=O)", "[S+2:1]([O-:2])([O-:3])>>[S+0:1](=[O-0:2])(=[O-0:3])" + ), + Normalization("Pyridine oxide to n+O-", "[n:1]=[O:2]>>[n+:1][O-:2]"), + Normalization( + "Azide to N=N+=N-", "[*,H:1][N:2]=[N:3]#[N:4]>>[*,H:1][N:2]=[N+:3]=[N-:4]" + ), + Normalization("Diazo/azo to =N+=N-", "[*:1]=[N:2]#[N:3]>>[*:1]=[N+:2]=[N-:3]"), + Normalization( + "Sulfoxide to -S+(O-)-", + "[!O:1][S+0;X3:2](=[O:3])[!O:4]>>[*:1][S+1:2]([O-:3])[*:4]", + ), # Equivalent to #1.5 in InChI technical manual - Normalization('Phosphate to P(O-)=O', '[O,S,Se,Te;-1:1][P+;D4:2][O,S,Se,Te;-1:3]>>[*+0:1]=[P+0;D5:2][*-1:3]'), + Normalization( + "Phosphate to P(O-)=O", + "[O,S,Se,Te;-1:1][P+;D4:2][O,S,Se,Te;-1:3]>>[*+0:1]=[P+0;D5:2][*-1:3]", + ), # Equivalent to #1.8 in InChI technical manual - Normalization('C/S+N to C/S=N+', '[C,S;X3+1:1]([NX3:2])[NX3!H0:3]>>[*+0:1]([N:2])=[N+:3]'), + Normalization( + "C/S+N to C/S=N+", "[C,S;X3+1:1]([NX3:2])[NX3!H0:3]>>[*+0:1]([N:2])=[N+:3]" + ), # Equivalent to #1.8 in InChI technical manual - Normalization('P+N to P=N+', '[P;X4+1:1]([NX3:2])[NX3!H0:3]>>[*+0:1]([N:2])=[N+:3]'), - Normalization('Normalize hydrazine-diazonium', '[CX4:1][NX3H:2]-[NX3H:3][CX4:4][NX2+:5]#[NX1:6]>>[CX4:1][NH0:2]=[NH+:3][C:4][N+0:5]=[NH:6]'), + Normalization( + "P+N to P=N+", "[P;X4+1:1]([NX3:2])[NX3!H0:3]>>[*+0:1]([N:2])=[N+:3]" + ), + Normalization( + "Normalize hydrazine-diazonium", + "[CX4:1][NX3H:2]-[NX3H:3][CX4:4][NX2+:5]#[NX1:6]>>[CX4:1][NH0:2]=[NH+:3][C:4][N+0:5]=[NH:6]", + ), # Equivalent to #1.3 in InChI technical manual - Normalization('Recombine 1,3-separated charges', '[N,P,As,Sb,O,S,Se,Te;-1:1]-[A+0:2]=[N,P,As,Sb,O,S,Se,Te;+1:3]>>[*-0:1]=[*:2]-[*+0:3]'), - Normalization('Recombine 1,3-separated charges', '[n,o,p,s;-1:1]:[a:2]=[N,O,P,S;+1:3]>>[*-0:1]:[*:2]-[*+0:3]'), - Normalization('Recombine 1,3-separated charges', '[N,O,P,S;-1:1]-[a:2]:[n,o,p,s;+1:3]>>[*-0:1]=[*:2]:[*+0:3]'), - Normalization('Recombine 1,5-separated charges', '[N,P,As,Sb,O,S,Se,Te;-1:1]-[A+0:2]=[A:3]-[A:4]=[N,P,As,Sb,O,S,Se,Te;+1:5]>>[*-0:1]=[*:2]-[*:3]=[*:4]-[*+0:5]'), - Normalization('Recombine 1,5-separated charges', '[n,o,p,s;-1:1]:[a:2]:[a:3]:[c:4]=[N,O,P,S;+1:5]>>[*-0:1]:[*:2]:[*:3]:[c:4]-[*+0:5]'), - Normalization('Recombine 1,5-separated charges', '[N,O,P,S;-1:1]-[c:2]:[a:3]:[a:4]:[n,o,p,s;+1:5]>>[*-0:1]=[c:2]:[*:3]:[*:4]:[*+0:5]'), + Normalization( + "Recombine 1,3-separated charges", + "[N,P,As,Sb,O,S,Se,Te;-1:1]-[A+0:2]=[N,P,As,Sb,O,S,Se,Te;+1:3]>>[*-0:1]=[*:2]-[*+0:3]", + ), + Normalization( + "Recombine 1,3-separated charges", + "[n,o,p,s;-1:1]:[a:2]=[N,O,P,S;+1:3]>>[*-0:1]:[*:2]-[*+0:3]", + ), + Normalization( + "Recombine 1,3-separated charges", + "[N,O,P,S;-1:1]-[a:2]:[n,o,p,s;+1:3]>>[*-0:1]=[*:2]:[*+0:3]", + ), + Normalization( + "Recombine 1,5-separated charges", + "[N,P,As,Sb,O,S,Se,Te;-1:1]-[A+0:2]=[A:3]-[A:4]=[N,P,As,Sb,O,S,Se,Te;+1:5]>>[*-0:1]=[*:2]-[*:3]=[*:4]-[*+0:5]", + ), + Normalization( + "Recombine 1,5-separated charges", + "[n,o,p,s;-1:1]:[a:2]:[a:3]:[c:4]=[N,O,P,S;+1:5]>>[*-0:1]:[*:2]:[*:3]:[c:4]-[*+0:5]", + ), + Normalization( + "Recombine 1,5-separated charges", + "[N,O,P,S;-1:1]-[c:2]:[a:3]:[a:4]:[n,o,p,s;+1:5]>>[*-0:1]=[c:2]:[*:3]:[*:4]:[*+0:5]", + ), # Conjugated cation rules taken from Francis Atkinson's standardiser. Those that can reduce aromaticity aren't included - Normalization('Normalize 1,3 conjugated cation', '[N,O;+0!H0:1]-[A:2]=[N!$(*[O-]),O;+1H0:3]>>[*+1:1]=[*:2]-[*+0:3]'), - Normalization('Normalize 1,3 conjugated cation', '[n;+0!H0:1]:[c:2]=[N!$(*[O-]),O;+1H0:3]>>[*+1:1]:[*:2]-[*+0:3]'), - #Normalization('Normalize 1,3 conjugated cation', '[N,O;+0!H0:1]-[c:2]:[n!$(*[O-]),o;+1H0:3]>>[*+1:1]=[*:2]:[*+0:3]'), - Normalization('Normalize 1,5 conjugated cation', '[N,O;+0!H0:1]-[A:2]=[A:3]-[A:4]=[N!$(*[O-]),O;+1H0:5]>>[*+1:1]=[*:2]-[*:3]=[*:4]-[*+0:5]'), - Normalization('Normalize 1,5 conjugated cation', '[n;+0!H0:1]:[a:2]:[a:3]:[c:4]=[N!$(*[O-]),O;+1H0:5]>>[n+1:1]:[*:2]:[*:3]:[*:4]-[*+0:5]'), + Normalization( + "Normalize 1,3 conjugated cation", + "[N,O;+0!H0:1]-[A:2]=[N!$(*[O-]),O;+1H0:3]>>[*+1:1]=[*:2]-[*+0:3]", + ), + Normalization( + "Normalize 1,3 conjugated cation", + "[n;+0!H0:1]:[c:2]=[N!$(*[O-]),O;+1H0:3]>>[*+1:1]:[*:2]-[*+0:3]", + ), + # Normalization('Normalize 1,3 conjugated cation', '[N,O;+0!H0:1]-[c:2]:[n!$(*[O-]),o;+1H0:3]>>[*+1:1]=[*:2]:[*+0:3]'), + Normalization( + "Normalize 1,5 conjugated cation", + "[N,O;+0!H0:1]-[A:2]=[A:3]-[A:4]=[N!$(*[O-]),O;+1H0:5]>>[*+1:1]=[*:2]-[*:3]=[*:4]-[*+0:5]", + ), + Normalization( + "Normalize 1,5 conjugated cation", + "[n;+0!H0:1]:[a:2]:[a:3]:[c:4]=[N!$(*[O-]),O;+1H0:5]>>[n+1:1]:[*:2]:[*:3]:[*:4]-[*+0:5]", + ), # Normalization('Normalize 1,5 conjugated cation', '[N,O;+0!H0:1]-[c:2]:[a:3]:[a:4]:[n!$(*[O-]),o;+1H0:5]>>[*+1:1]=[c:2]:[*:3]:[*:4]:[*+0:5]'), # Normalization('Normalize 1,5 conjugated cation', '[n;+0!H0:1]1:[a:2]:[a:3]:[a:4]:[n!$(*[O-]);+1H0:5]1>>[n+1:1]1:[*:2]:[*:3]:[*:4]:[n+0:5]1'), # Normalization('Normalize 1,5 conjugated cation', '[n;+0!H0:1]:[a:2]:[a:3]:[a:4]:[n!$(*[O-]);+1H0:5]>>[n+1:1]:[*:2]:[*:3]:[*:4]:[n+0:5]'), # Equivalent to #1.6 in InChI technical manual. RDKit Sanitization handles this for perchlorate. - Normalization('Charge normalization', '[F,Cl,Br,I,At;-1:1]=[O:2]>>[*-0:1][O-:2]'), - Normalization('Charge recombination', '[N,P,As,Sb;-1:1]=[C+;v3:2]>>[*+0:1]#[C+0:2]'), + Normalization("Charge normalization", "[F,Cl,Br,I,At;-1:1]=[O:2]>>[*-0:1][O-:2]"), + Normalization( + "Charge recombination", "[N,P,As,Sb;-1:1]=[C+;v3:2]>>[*+0:1]#[C+0:2]" + ), ) # InChI technical manual has many additional rules that cover situations that are disallowed by RDKit @@ -103,7 +153,7 @@ def __init__(self, normalizations=NORMALIZATIONS, max_restarts=MAX_RESTARTS): :param int max_restarts: The maximum number of times to attempt to apply the series of normalizations (default 200). """ - log.debug('Initializing Normalizer') + log.debug("Initializing Normalizer") self.normalizations = normalizations self.max_restarts = max_restarts @@ -124,7 +174,7 @@ def normalize(self, mol): :return: The normalized fragment. :rtype: rdkit.Chem.rdchem.Mol """ - log.debug('Running Normalizer') + log.debug("Running Normalizer") # Normalize each fragment separately to get around quirky RunReactants behaviour fragments = [] for fragment in Chem.GetMolFrags(mol, asMols=True): @@ -143,14 +193,14 @@ def _normalize_fragment(self, mol): product = self._apply_transform(mol, normalization.transform) if product: # If transform changed mol, go back to first rule and apply each again - log.info('Rule applied: %s', normalization.name) + log.info("Rule applied: %s", normalization.name) mol = product break else: # For loop finishes normally, all applicable transforms have been applied return mol # If we're still going after max_restarts (default 200), stop and warn, but still return the mol - log.warning('Gave up normalization after %s restarts', self.max_restarts) + log.warning("Gave up normalization after %s restarts", self.max_restarts) return mol def _apply_transform(self, mol, rule): @@ -166,7 +216,9 @@ def _apply_transform(self, mol, rule): for mol in mols: for product in [x[0] for x in rule.RunReactants((mol,))]: if Chem.SanitizeMol(product, catchErrors=True) == 0: - products[Chem.MolToSmiles(product, isomericSmiles=True)] = product + products[ + Chem.MolToSmiles(product, isomericSmiles=True) + ] = product if products: mols = [products[s] for s in sorted(products)] else: diff --git a/gypsum_dl/molvs/resonance.py b/gypsum_dl/molvs/resonance.py index 9e2c40a..af97772 100644 --- a/gypsum_dl/molvs/resonance.py +++ b/gypsum_dl/molvs/resonance.py @@ -7,15 +7,12 @@ """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from __future__ import absolute_import, division, print_function, unicode_literals + import logging from rdkit import Chem - log = logging.getLogger(__name__) @@ -23,12 +20,17 @@ class ResonanceEnumerator(object): - """Simple wrapper around RDKit ResonanceMolSupplier. - - """ - - def __init__(self, kekule_all=False, allow_incomplete_octets=False, unconstrained_cations=False, - unconstrained_anions=False, allow_charge_separation=False, max_structures=MAX_STRUCTURES): + """Simple wrapper around RDKit ResonanceMolSupplier.""" + + def __init__( + self, + kekule_all=False, + allow_incomplete_octets=False, + unconstrained_cations=False, + unconstrained_anions=False, + allow_charge_separation=False, + max_structures=MAX_STRUCTURES, + ): """ :param bool allow_incomplete_octets: include resonance structures whose octets are less complete than the the most octet-complete structure. @@ -69,7 +71,9 @@ def enumerate(self, mol): if self.unconstrained_cations: flags = flags | Chem.UNCONSTRAINED_CATIONS results = [] - for result in Chem.ResonanceMolSupplier(mol, flags=flags, maxStructs=self.max_structures): + for result in Chem.ResonanceMolSupplier( + mol, flags=flags, maxStructs=self.max_structures + ): # This seems necessary? ResonanceMolSupplier only does a partial sanitization Chem.SanitizeMol(result) results.append(result) @@ -86,6 +90,6 @@ def enumerate_resonance_smiles(smiles): :rtype: set of strings. """ mol = Chem.MolFromSmiles(smiles) - #Chem.SanitizeMol(mol) # MolFromSmiles does Sanitize by default + # Chem.SanitizeMol(mol) # MolFromSmiles does Sanitize by default mesomers = ResonanceEnumerator().enumerate(mol) return {Chem.MolToSmiles(m, isomericSmiles=True) for m in mesomers} diff --git a/gypsum_dl/molvs/standardize.py b/gypsum_dl/molvs/standardize.py index ca3f585..6bf6e0c 100644 --- a/gypsum_dl/molvs/standardize.py +++ b/gypsum_dl/molvs/standardize.py @@ -9,22 +9,26 @@ """ -from __future__ import print_function -from __future__ import unicode_literals -from __future__ import division +from __future__ import division, print_function, unicode_literals + import copy import logging from rdkit import Chem -from .metal import MetalDisconnector -from .fragment import PREFER_ORGANIC, LargestFragmentChooser, FragmentRemover -from .normalize import NORMALIZATIONS, MAX_RESTARTS, Normalizer -from .tautomer import TAUTOMER_TRANSFORMS, TAUTOMER_SCORES, MAX_TAUTOMERS, TautomerCanonicalizer, TautomerEnumerator from .charge import ACID_BASE_PAIRS, CHARGE_CORRECTIONS, Reionizer, Uncharger +from .fragment import PREFER_ORGANIC, FragmentRemover, LargestFragmentChooser +from .metal import MetalDisconnector +from .normalize import MAX_RESTARTS, NORMALIZATIONS, Normalizer +from .tautomer import ( + MAX_TAUTOMERS, + TAUTOMER_SCORES, + TAUTOMER_TRANSFORMS, + TautomerCanonicalizer, + TautomerEnumerator, +) from .utils import memoized_property - log = logging.getLogger(__name__) @@ -41,10 +45,17 @@ class Standardizer(object): """ - def __init__(self, normalizations=NORMALIZATIONS, acid_base_pairs=ACID_BASE_PAIRS, - charge_corrections=CHARGE_CORRECTIONS, tautomer_transforms=TAUTOMER_TRANSFORMS, - tautomer_scores=TAUTOMER_SCORES, max_restarts=MAX_RESTARTS, max_tautomers=MAX_TAUTOMERS, - prefer_organic=PREFER_ORGANIC): + def __init__( + self, + normalizations=NORMALIZATIONS, + acid_base_pairs=ACID_BASE_PAIRS, + charge_corrections=CHARGE_CORRECTIONS, + tautomer_transforms=TAUTOMER_TRANSFORMS, + tautomer_scores=TAUTOMER_SCORES, + max_restarts=MAX_RESTARTS, + max_tautomers=MAX_TAUTOMERS, + prefer_organic=PREFER_ORGANIC, + ): """Initialize a Standardizer with optional custom parameters. :param normalizations: A list of Normalizations to apply (default: :data:`~molvs.normalize.NORMALIZATIONS`). @@ -60,7 +71,7 @@ def __init__(self, normalizations=NORMALIZATIONS, acid_base_pairs=ACID_BASE_PAIR :param max_tautomers: The maximum number of tautomers to enumerate (default 1000). :param prefer_organic: Whether to prioritize organic fragments when choosing fragment parent (default False). """ - log.debug('Initializing Standardizer') + log.debug("Initializing Standardizer") self.normalizations = normalizations self.acid_base_pairs = acid_base_pairs self.charge_corrections = charge_corrections @@ -219,9 +230,9 @@ def standardize_with_parents(self, mol): super = self.super_parent(standardized, skip_standardize=True) # TODO: Add other parents - have optional argument to specify which are wanted mols = { - 'standardized': standardized, - 'tautomer_parent': tautomer, - 'super_parent': super + "standardized": standardized, + "tautomer_parent": tautomer, + "super_parent": super, } return mols @@ -240,14 +251,19 @@ def normalize(self): """ :returns: A callable :class:`~molvs.normalize.Normalizer` instance. """ - return Normalizer(normalizations=self.normalizations, max_restarts=self.max_restarts) + return Normalizer( + normalizations=self.normalizations, max_restarts=self.max_restarts + ) @memoized_property def reionize(self): """ :returns: A callable :class:`~molvs.charge.Reionizer` instance. """ - return Reionizer(acid_base_pairs=self.acid_base_pairs, charge_corrections=self.charge_corrections) + return Reionizer( + acid_base_pairs=self.acid_base_pairs, + charge_corrections=self.charge_corrections, + ) @memoized_property def uncharge(self): @@ -275,15 +291,20 @@ def enumerate_tautomers(self): """ :returns: A callable :class:`~molvs.tautomer.TautomerEnumerator` instance. """ - return TautomerEnumerator(transforms=self.tautomer_transforms, max_tautomers=self.max_tautomers) + return TautomerEnumerator( + transforms=self.tautomer_transforms, max_tautomers=self.max_tautomers + ) @memoized_property def canonicalize_tautomer(self): """ :returns: A callable :class:`~molvs.tautomer.TautomerCanonicalizer` instance. """ - return TautomerCanonicalizer(transforms=self.tautomer_transforms, scores=self.tautomer_scores, - max_tautomers=self.max_tautomers) + return TautomerCanonicalizer( + transforms=self.tautomer_transforms, + scores=self.tautomer_scores, + max_tautomers=self.max_tautomers, + ) def standardize_smiles(smiles): diff --git a/gypsum_dl/molvs/tautomer.py b/gypsum_dl/molvs/tautomer.py index 24bfc0c..7779f58 100644 --- a/gypsum_dl/molvs/tautomer.py +++ b/gypsum_dl/molvs/tautomer.py @@ -7,9 +7,8 @@ """ -from __future__ import print_function -from __future__ import unicode_literals -from __future__ import division +from __future__ import division, print_function, unicode_literals + import copy import logging @@ -30,8 +29,13 @@ class TautomerTransform(object): custom resulting bond orders and also resulting atom charges. """ - BONDMAP = {'-': BondType.SINGLE, '=': BondType.DOUBLE, '#': BondType.TRIPLE, ':': BondType.AROMATIC} - CHARGEMAP = {'+': 1, '0': 0, '-': -1} + BONDMAP = { + "-": BondType.SINGLE, + "=": BondType.DOUBLE, + "#": BondType.TRIPLE, + ":": BondType.AROMATIC, + } + CHARGEMAP = {"+": 1, "0": 0, "-": -1} def __init__(self, name, smarts, bonds=(), charges=(), radicals=()): """Initialize a TautomerTransform with a name, SMARTS pattern and optional bonds and charges. @@ -58,7 +62,9 @@ def tautomer(self): return Chem.MolFromSmarts(self.tautomer_str) def __repr__(self): - return 'TautomerTransform({!r}, {!r}, {!r}, {!r})'.format(self.name, self.tautomer_str, self.bonds, self.charges) + return "TautomerTransform({!r}, {!r}, {!r}, {!r})".format( + self.name, self.tautomer_str, self.bonds, self.charges + ) def __str__(self): return self.name @@ -83,7 +89,9 @@ def smarts(self): return Chem.MolFromSmarts(self.smarts_str) def __repr__(self): - return 'TautomerScore({!r}, {!r}, {!r})'.format(self.name, self.smarts_str, self.score) + return "TautomerScore({!r}, {!r}, {!r})".format( + self.name, self.smarts_str, self.score + ) def __str__(self): return self.name @@ -91,56 +99,85 @@ def __str__(self): #: The default list of TautomerTransforms. TAUTOMER_TRANSFORMS = ( - TautomerTransform('1,3 (thio)keto/enol f', '[CX4!H0]-[C]=[O,S,Se,Te;X1]'), - TautomerTransform('1,3 (thio)keto/enol r', '[O,S,Se,Te;X2!H0]-[C]=[C]'), - TautomerTransform('1,5 (thio)keto/enol f', '[CX4,NX3;!H0]-[C]=[C][CH0]=[O,S,Se,Te;X1]'), - TautomerTransform('1,5 (thio)keto/enol r', '[O,S,Se,Te;X2!H0]-[CH0]=[C]-[C]=[C,N]'), - TautomerTransform('aliphatic imine f', '[CX4!H0]-[C]=[NX2]'), - TautomerTransform('aliphatic imine r', '[NX3!H0]-[C]=[CX3]'), - TautomerTransform('special imine f', '[N!H0]-[C]=[CX3R0]'), - TautomerTransform('special imine r', '[CX4!H0]-[c]=[n]'), - TautomerTransform('1,3 aromatic heteroatom H shift f', '[#7!H0]-[#6R1]=[O,#7X2]'), - TautomerTransform('1,3 aromatic heteroatom H shift r', '[O,#7;!H0]-[#6R1]=[#7X2]'), - TautomerTransform('1,3 heteroatom H shift', '[#7,S,O,Se,Te;!H0]-[#7X2,#6,#15]=[#7,#16,#8,Se,Te]'), - TautomerTransform('1,5 aromatic heteroatom H shift', '[#7,#16,#8;!H0]-[#6,#7]=[#6]-[#6,#7]=[#7,#16,#8;H0]'), - TautomerTransform('1,5 aromatic heteroatom H shift f', '[#7,#16,#8,Se,Te;!H0]-[#6,nX2]=[#6,nX2]-[#6,#7X2]=[#7X2,S,O,Se,Te]'), - TautomerTransform('1,5 aromatic heteroatom H shift r', '[#7,S,O,Se,Te;!H0]-[#6,#7X2]=[#6,nX2]-[#6,nX2]=[#7,#16,#8,Se,Te]'), - TautomerTransform('1,7 aromatic heteroatom H shift f', '[#7,#8,#16,Se,Te;!H0]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]=[#6]-[#6,#7X2]=[#7X2,S,O,Se,Te,CX3]'), - TautomerTransform('1,7 aromatic heteroatom H shift r', '[#7,S,O,Se,Te,CX4;!H0]-[#6,#7X2]=[#6]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]=[NX2,S,O,Se,Te]'), - TautomerTransform('1,9 aromatic heteroatom H shift f', '[#7,O;!H0]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]=[#7,O]'), - TautomerTransform('1,11 aromatic heteroatom H shift f', '[#7,O;!H0]-[#6,nX2]=[#6,nX2]-[#6,nX2]=[#6,nX2]-[#6,nX2]=[#6,nX2]-[#6,nX2]=[#6,nX2]-[#6,nX2]=[#7X2,O]'), - TautomerTransform('furanone f', '[O,S,N;!H0]-[#6r5]=[#6X3r5;$([#6]([#6r5])=[#6r5])]'), - TautomerTransform('furanone r', '[#6r5!H0;$([#6]([#6r5])[#6r5])]-[#6r5]=[O,S,N]'), - TautomerTransform('keten/ynol f', '[C!H0]=[C]=[O,S,Se,Te;X1]', bonds='#-'), - TautomerTransform('keten/ynol r', '[O,S,Se,Te;!H0X2]-[C]#[C]', bonds='=='), - TautomerTransform('ionic nitro/aci-nitro f', '[C!H0]-[N+;$([N][O-])]=[O]'), - TautomerTransform('ionic nitro/aci-nitro r', '[O!H0]-[N+;$([N][O-])]=[C]'), - TautomerTransform('oxim/nitroso f', '[O!H0]-[N]=[C]'), - TautomerTransform('oxim/nitroso r', '[C!H0]-[N]=[O]'), - TautomerTransform('oxim/nitroso via phenol f', '[O!H0]-[N]=[C]-[C]=[C]-[C]=[OH0]'), - TautomerTransform('oxim/nitroso via phenol r', '[O!H0]-[c]=[c]-[c]=[c]-[N]=[OH0]'), - TautomerTransform('cyano/iso-cyanic acid f', '[O!H0]-[C]#[N]', bonds='=='), - TautomerTransform('cyano/iso-cyanic acid r', '[N!H0]=[C]=[O]', bonds='#-'), + TautomerTransform("1,3 (thio)keto/enol f", "[CX4!H0]-[C]=[O,S,Se,Te;X1]"), + TautomerTransform("1,3 (thio)keto/enol r", "[O,S,Se,Te;X2!H0]-[C]=[C]"), + TautomerTransform( + "1,5 (thio)keto/enol f", "[CX4,NX3;!H0]-[C]=[C][CH0]=[O,S,Se,Te;X1]" + ), + TautomerTransform("1,5 (thio)keto/enol r", "[O,S,Se,Te;X2!H0]-[CH0]=[C]-[C]=[C,N]"), + TautomerTransform("aliphatic imine f", "[CX4!H0]-[C]=[NX2]"), + TautomerTransform("aliphatic imine r", "[NX3!H0]-[C]=[CX3]"), + TautomerTransform("special imine f", "[N!H0]-[C]=[CX3R0]"), + TautomerTransform("special imine r", "[CX4!H0]-[c]=[n]"), + TautomerTransform("1,3 aromatic heteroatom H shift f", "[#7!H0]-[#6R1]=[O,#7X2]"), + TautomerTransform("1,3 aromatic heteroatom H shift r", "[O,#7;!H0]-[#6R1]=[#7X2]"), + TautomerTransform( + "1,3 heteroatom H shift", "[#7,S,O,Se,Te;!H0]-[#7X2,#6,#15]=[#7,#16,#8,Se,Te]" + ), + TautomerTransform( + "1,5 aromatic heteroatom H shift", + "[#7,#16,#8;!H0]-[#6,#7]=[#6]-[#6,#7]=[#7,#16,#8;H0]", + ), + TautomerTransform( + "1,5 aromatic heteroatom H shift f", + "[#7,#16,#8,Se,Te;!H0]-[#6,nX2]=[#6,nX2]-[#6,#7X2]=[#7X2,S,O,Se,Te]", + ), + TautomerTransform( + "1,5 aromatic heteroatom H shift r", + "[#7,S,O,Se,Te;!H0]-[#6,#7X2]=[#6,nX2]-[#6,nX2]=[#7,#16,#8,Se,Te]", + ), + TautomerTransform( + "1,7 aromatic heteroatom H shift f", + "[#7,#8,#16,Se,Te;!H0]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]=[#6]-[#6,#7X2]=[#7X2,S,O,Se,Te,CX3]", + ), + TautomerTransform( + "1,7 aromatic heteroatom H shift r", + "[#7,S,O,Se,Te,CX4;!H0]-[#6,#7X2]=[#6]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]=[NX2,S,O,Se,Te]", + ), + TautomerTransform( + "1,9 aromatic heteroatom H shift f", + "[#7,O;!H0]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]=[#6,#7X2]-[#6,#7X2]=[#7,O]", + ), + TautomerTransform( + "1,11 aromatic heteroatom H shift f", + "[#7,O;!H0]-[#6,nX2]=[#6,nX2]-[#6,nX2]=[#6,nX2]-[#6,nX2]=[#6,nX2]-[#6,nX2]=[#6,nX2]-[#6,nX2]=[#7X2,O]", + ), + TautomerTransform( + "furanone f", "[O,S,N;!H0]-[#6r5]=[#6X3r5;$([#6]([#6r5])=[#6r5])]" + ), + TautomerTransform("furanone r", "[#6r5!H0;$([#6]([#6r5])[#6r5])]-[#6r5]=[O,S,N]"), + TautomerTransform("keten/ynol f", "[C!H0]=[C]=[O,S,Se,Te;X1]", bonds="#-"), + TautomerTransform("keten/ynol r", "[O,S,Se,Te;!H0X2]-[C]#[C]", bonds="=="), + TautomerTransform("ionic nitro/aci-nitro f", "[C!H0]-[N+;$([N][O-])]=[O]"), + TautomerTransform("ionic nitro/aci-nitro r", "[O!H0]-[N+;$([N][O-])]=[C]"), + TautomerTransform("oxim/nitroso f", "[O!H0]-[N]=[C]"), + TautomerTransform("oxim/nitroso r", "[C!H0]-[N]=[O]"), + TautomerTransform("oxim/nitroso via phenol f", "[O!H0]-[N]=[C]-[C]=[C]-[C]=[OH0]"), + TautomerTransform("oxim/nitroso via phenol r", "[O!H0]-[c]=[c]-[c]=[c]-[N]=[OH0]"), + TautomerTransform("cyano/iso-cyanic acid f", "[O!H0]-[C]#[N]", bonds="=="), + TautomerTransform("cyano/iso-cyanic acid r", "[N!H0]=[C]=[O]", bonds="#-"), # TautomerTransform('formamidinesulfinic acid f', '[O,N;!H0]-[C]=[S,Se,Te]=[O]', bonds='=--'), # TODO: WAT!? # TautomerTransform('formamidinesulfinic acid r', '[O!H0]-[S,Se,Te]-[C]=[O,N]', bonds='=--'), - TautomerTransform('isocyanide f', '[C-0!H0]#[N+0]', bonds='#', charges='-+'), - TautomerTransform('isocyanide r', '[N+!H0]#[C-]', bonds='#', charges='-+'), - TautomerTransform('phosphonic acid f', '[OH]-[PH0]', bonds='='), - TautomerTransform('phosphonic acid r', '[PH]=[O]', bonds='-'), + TautomerTransform("isocyanide f", "[C-0!H0]#[N+0]", bonds="#", charges="-+"), + TautomerTransform("isocyanide r", "[N+!H0]#[C-]", bonds="#", charges="-+"), + TautomerTransform("phosphonic acid f", "[OH]-[PH0]", bonds="="), + TautomerTransform("phosphonic acid r", "[PH]=[O]", bonds="-"), ) #: The default list of TautomerScores. TAUTOMER_SCORES = ( - TautomerScore('benzoquinone', '[#6]1([#6]=[#6][#6]([#6]=[#6]1)=,:[N,S,O])=,:[N,S,O]', 25), - TautomerScore('oxim', '[#6]=[N][OH]', 4), - TautomerScore('C=O', '[#6]=,:[#8]', 2), - TautomerScore('N=O', '[#7]=,:[#8]', 2), - TautomerScore('P=O', '[#15]=,:[#8]', 2), - TautomerScore('C=hetero', '[#6]=[!#1;!#6]', 1), - TautomerScore('methyl', '[CX4H3]', 1), - TautomerScore('guanidine terminal=N', '[#7][#6](=[NR0])[#7H0]', 1), - TautomerScore('guanidine endocyclic=N', '[#7;R][#6;R]([N])=[#7;R]', 2), - TautomerScore('aci-nitro', '[#6]=[N+]([O-])[OH]', -4), + TautomerScore( + "benzoquinone", "[#6]1([#6]=[#6][#6]([#6]=[#6]1)=,:[N,S,O])=,:[N,S,O]", 25 + ), + TautomerScore("oxim", "[#6]=[N][OH]", 4), + TautomerScore("C=O", "[#6]=,:[#8]", 2), + TautomerScore("N=O", "[#7]=,:[#8]", 2), + TautomerScore("P=O", "[#15]=,:[#8]", 2), + TautomerScore("C=hetero", "[#6]=[!#1;!#6]", 1), + TautomerScore("methyl", "[CX4H3]", 1), + TautomerScore("guanidine terminal=N", "[#7][#6](=[NR0])[#7H0]", 1), + TautomerScore("guanidine endocyclic=N", "[#7;R][#6;R]([N])=[#7;R]", 2), + TautomerScore("aci-nitro", "[#6]=[N+]([O-])[OH]", -4), ) #: The default value for the maximum number of tautomers to enumerate, a limit to prevent combinatorial explosion. @@ -148,11 +185,14 @@ def __str__(self): class TautomerCanonicalizer(object): - """ - - """ - - def __init__(self, transforms=TAUTOMER_TRANSFORMS, scores=TAUTOMER_SCORES, max_tautomers=MAX_TAUTOMERS): + """ """ + + def __init__( + self, + transforms=TAUTOMER_TRANSFORMS, + scores=TAUTOMER_SCORES, + max_tautomers=MAX_TAUTOMERS, + ): """ :param transforms: A list of TautomerTransforms to use to enumerate tautomers. @@ -183,36 +223,43 @@ def canonicalize(self, mol): highest = None for t in tautomers: smiles = Chem.MolToSmiles(t, isomericSmiles=True) - log.debug('Tautomer: %s', smiles) + log.debug("Tautomer: %s", smiles) score = 0 # Add aromatic ring scores ssr = Chem.GetSymmSSSR(t) for ring in ssr: - btypes = {t.GetBondBetweenAtoms(*pair).GetBondType() for pair in pairwise(ring)} + btypes = { + t.GetBondBetweenAtoms(*pair).GetBondType() + for pair in pairwise(ring) + } elements = {t.GetAtomWithIdx(idx).GetAtomicNum() for idx in ring} if btypes == {BondType.AROMATIC}: - log.debug('Score +100 (aromatic ring)') + log.debug("Score +100 (aromatic ring)") score += 100 if elements == {6}: - log.debug('Score +150 (carbocyclic aromatic ring)') + log.debug("Score +150 (carbocyclic aromatic ring)") score += 150 # Add SMARTS scores for tscore in self.scores: for match in t.GetSubstructMatches(tscore.smarts): - log.debug('Score %+d (%s)', tscore.score, tscore.name) + log.debug("Score %+d (%s)", tscore.score, tscore.name) score += tscore.score # Add (P,S,Se,Te)-H scores for atom in t.GetAtoms(): if atom.GetAtomicNum() in {15, 16, 34, 52}: hs = atom.GetTotalNumHs() if hs: - log.debug('Score %+d (%s-H bonds)', -hs, atom.GetSymbol()) + log.debug("Score %+d (%s-H bonds)", -hs, atom.GetSymbol()) score -= hs # Set as highest if score higher or if score equal and smiles comes first alphabetically - if not highest or highest['score'] < score or (highest['score'] == score and smiles < highest['smiles']): - log.debug('New highest tautomer: %s (%s)', smiles, score) - highest = {'smiles': smiles, 'tautomer': t, 'score': score} - return highest['tautomer'] + if ( + not highest + or highest["score"] < score + or (highest["score"] == score and smiles < highest["smiles"]) + ): + log.debug("New highest tautomer: %s (%s)", smiles, score) + highest = {"smiles": smiles, "tautomer": t, "score": score} + return highest["tautomer"] @memoized_property def _enumerate_tautomers(self): @@ -220,9 +267,7 @@ def _enumerate_tautomers(self): class TautomerEnumerator(object): - """ - - """ + """ """ def __init__(self, transforms=TAUTOMER_TRANSFORMS, max_tautomers=MAX_TAUTOMERS): """ @@ -257,7 +302,9 @@ def enumerate(self, mol): if tsmiles in done: continue for transform in self.transforms: - for match in kekulized[tsmiles].GetSubstructMatches(transform.tautomer): + for match in kekulized[tsmiles].GetSubstructMatches( + transform.tautomer + ): # log.debug('Matched rule: %s to %s for %s', transform.name, tsmiles, match) # Create a copy of in the input molecule so we can modify it # Use kekule form so bonds are explicitly single/double instead of aromatic @@ -277,51 +324,83 @@ def enumerate(self, mol): if transform.bonds: # Set the resulting bond types as manually specified in the transform # log.debug('%s-%s: %s -> %s' % (product.GetAtomWithIdx(pair[0]).GetSymbol(), product.GetAtomWithIdx(pair[1]).GetSymbol(), product.GetBondBetweenAtoms(*pair).GetBondType(), transform.bonds[bi])) - product.GetBondBetweenAtoms(*pair).SetBondType(transform.bonds[bi]) + product.GetBondBetweenAtoms(*pair).SetBondType( + transform.bonds[bi] + ) else: # If no manually specified bond types, just swap single and double bonds - current_bond_type = product.GetBondBetweenAtoms(*pair).GetBondType() - product.GetBondBetweenAtoms(*pair).SetBondType(BondType.DOUBLE if current_bond_type == BondType.SINGLE else BondType.SINGLE) + current_bond_type = product.GetBondBetweenAtoms( + *pair + ).GetBondType() + product.GetBondBetweenAtoms(*pair).SetBondType( + BondType.DOUBLE + if current_bond_type == BondType.SINGLE + else BondType.SINGLE + ) # log.debug('%s-%s: %s -> %s' % (product.GetAtomWithIdx(pair[0]).GetSymbol(), product.GetAtomWithIdx(pair[1]).GetSymbol(), current_bond_type, product.GetBondBetweenAtoms(*pair).GetBondType())) # Adjust charges if transform.charges: for ci, idx in enumerate(match): atom = product.GetAtomWithIdx(idx) # log.debug('%s: C%s -> C%s' % (atom.GetSymbol(), atom.GetFormalCharge(), atom.GetFormalCharge() + transform.charges[ci])) - atom.SetFormalCharge(atom.GetFormalCharge() + transform.charges[ci]) + atom.SetFormalCharge( + atom.GetFormalCharge() + transform.charges[ci] + ) try: Chem.SanitizeMol(product) smiles = Chem.MolToSmiles(product, isomericSmiles=True) - log.debug('Applied rule: %s to %s', transform.name, tsmiles) + log.debug("Applied rule: %s to %s", transform.name, tsmiles) if smiles not in tautomers: - log.debug('New tautomer produced: %s' % smiles) + log.debug("New tautomer produced: %s" % smiles) kekulized_product = copy.deepcopy(product) Chem.Kekulize(kekulized_product) tautomers[smiles] = product kekulized[smiles] = kekulized_product else: - log.debug('Previous tautomer produced again: %s' % smiles) + log.debug( + "Previous tautomer produced again: %s" % smiles + ) except ValueError: - log.debug('ValueError Applying rule: %s', transform.name) + log.debug("ValueError Applying rule: %s", transform.name) done.add(tsmiles) if len(tautomers) == len(done): break else: - log.warning('Tautomer enumeration stopped at maximum %s', self.max_tautomers) + log.warning( + "Tautomer enumeration stopped at maximum %s", self.max_tautomers + ) # Clean up stereochemistry for tautomer in tautomers.values(): Chem.AssignStereochemistry(tautomer, force=True, cleanIt=True) for bond in tautomer.GetBonds(): - if bond.GetBondType() == BondType.DOUBLE and bond.GetStereo() > BondStereo.STEREOANY: + if ( + bond.GetBondType() == BondType.DOUBLE + and bond.GetStereo() > BondStereo.STEREOANY + ): begin = bond.GetBeginAtomIdx() end = bond.GetEndAtomIdx() for othertautomer in tautomers.values(): - if not othertautomer.GetBondBetweenAtoms(begin, end).GetBondType() == BondType.DOUBLE: - neighbours = tautomer.GetAtomWithIdx(begin).GetBonds() + tautomer.GetAtomWithIdx(end).GetBonds() + if ( + not othertautomer.GetBondBetweenAtoms( + begin, end + ).GetBondType() + == BondType.DOUBLE + ): + neighbours = ( + tautomer.GetAtomWithIdx(begin).GetBonds() + + tautomer.GetAtomWithIdx(end).GetBonds() + ) for otherbond in neighbours: - if otherbond.GetBondDir() in {BondDir.ENDUPRIGHT, BondDir.ENDDOWNRIGHT}: + if otherbond.GetBondDir() in { + BondDir.ENDUPRIGHT, + BondDir.ENDDOWNRIGHT, + }: otherbond.SetBondDir(BondDir.NONE) - Chem.AssignStereochemistry(tautomer, force=True, cleanIt=True) - log.debug('Removed stereochemistry from unfixed double bond') + Chem.AssignStereochemistry( + tautomer, force=True, cleanIt=True + ) + log.debug( + "Removed stereochemistry from unfixed double bond" + ) break - return list(tautomers.values()) \ No newline at end of file + return list(tautomers.values()) diff --git a/gypsum_dl/molvs/utils.py b/gypsum_dl/molvs/utils.py index 768b8bb..754f2ed 100644 --- a/gypsum_dl/molvs/utils.py +++ b/gypsum_dl/molvs/utils.py @@ -7,9 +7,8 @@ """ -from __future__ import print_function -from __future__ import unicode_literals -from __future__ import division +from __future__ import division, print_function, unicode_literals + import functools from itertools import tee @@ -18,13 +17,14 @@ def memoized_property(fget): """Decorator to create memoized properties.""" - attr_name = '_{}'.format(fget.__name__) + attr_name = "_{}".format(fget.__name__) @functools.wraps(fget) def fget_memoized(self): if not hasattr(self, attr_name): setattr(self, attr_name, fget(self)) return getattr(self, attr_name) + return property(fget_memoized) diff --git a/gypsum_dl/molvs/validate.py b/gypsum_dl/molvs/validate.py index 476877f..4733ac1 100644 --- a/gypsum_dl/molvs/validate.py +++ b/gypsum_dl/molvs/validate.py @@ -9,9 +9,8 @@ """ -from __future__ import print_function -from __future__ import unicode_literals -from __future__ import division +from __future__ import division, print_function, unicode_literals + import logging import sys @@ -20,12 +19,11 @@ from .errors import StopValidateError from .validations import VALIDATIONS - #: The default format for log messages. -SIMPLE_FORMAT = '%(levelname)s: [%(validation)s] %(message)s' +SIMPLE_FORMAT = "%(levelname)s: [%(validation)s] %(message)s" #: A more detailed format for log messages. Specify when initializing a Validator. -LONG_FORMAT = '%(asctime)s - %(levelname)s - %(validation)s - %(message)s' +LONG_FORMAT = "%(asctime)s - %(levelname)s - %(validation)s - %(message)s" class LogHandler(logging.Handler): @@ -60,7 +58,14 @@ def close(self): class Validator(object): """The main class for running :class:`Validations ` on molecules.""" - def __init__(self, validations=VALIDATIONS, log_format=SIMPLE_FORMAT, level=logging.INFO, stdout=False, raw=False): + def __init__( + self, + validations=VALIDATIONS, + log_format=SIMPLE_FORMAT, + level=logging.INFO, + stdout=False, + raw=False, + ): """Initialize a Validator with the following parameters: :param validations: A list of Validations to apply (default: :data:`~molvs.validations.VALIDATIONS`). diff --git a/gypsum_dl/molvs/validations.py b/gypsum_dl/molvs/validations.py index b4b6413..e0cac7c 100644 --- a/gypsum_dl/molvs/validations.py +++ b/gypsum_dl/molvs/validations.py @@ -7,9 +7,8 @@ """ -from __future__ import print_function -from __future__ import unicode_literals -from __future__ import division +from __future__ import division, print_function, unicode_literals + import logging from rdkit import Chem @@ -22,17 +21,17 @@ class Validation(object): """The base class that all :class:`~molvs.validations.Validation` subclasses must inherit from.""" def __init__(self, log): - self.log = logging.LoggerAdapter(log, {'validation': type(self).__name__}) + self.log = logging.LoggerAdapter(log, {"validation": type(self).__name__}) def __call__(self, mol): try: - self.log.debug('Running %s', type(self).__name__) + self.log.debug("Running %s", type(self).__name__) self.run(mol) except Exception as e: if isinstance(e, StopValidateError): raise e else: - self.log.debug('Validation failed: %s', e) + self.log.debug("Validation failed: %s", e) def run(self, mol): """""" @@ -50,7 +49,7 @@ class SmartsValidation(Validation): level = logging.INFO #: The message to log if the SMARTS pattern matches the molecule. - message = 'Molecule matched %(smarts)s' + message = "Molecule matched %(smarts)s" #: Whether the SMARTS pattern should match an entire covalent unit. entire_fragment = False @@ -62,17 +61,21 @@ def __init__(self, log): @property def smarts(self): """The SMARTS pattern as a string. Subclasses must implement this.""" - raise NotImplementedError('SmartsValidation subclasses must have a smarts attribute') + raise NotImplementedError( + "SmartsValidation subclasses must have a smarts attribute" + ) def _check_matches(self, mol): if mol.HasSubstructMatch(self._smarts): - self.log.log(self.level, self.message, {'smarts': self.smarts}) + self.log.log(self.level, self.message, {"smarts": self.smarts}) def _check_matches_fragment(self, mol): - matches = frozenset(frozenset(match) for match in mol.GetSubstructMatches(self._smarts)) + matches = frozenset( + frozenset(match) for match in mol.GetSubstructMatches(self._smarts) + ) fragments = frozenset(frozenset(frag) for frag in Chem.GetMolFrags(mol)) if matches & fragments: - self.log.log(self.level, self.message, {'smarts': self.smarts}) + self.log.log(self.level, self.message, {"smarts": self.smarts}) def run(self, mol): if self.entire_fragment: @@ -90,7 +93,7 @@ class IsNoneValidation(Validation): def run(self, mol): if mol is None: - self.log.error('Molecule is None') + self.log.error("Molecule is None") raise StopValidateError() @@ -102,7 +105,7 @@ class NoAtomValidation(Validation): def run(self, mol): if mol.GetNumAtoms() == 0: - self.log.error('No atoms are present') + self.log.error("No atoms are present") raise StopValidateError() @@ -112,10 +115,11 @@ class DichloroethaneValidation(SmartsValidation): This is provided as an example of how to subclass :class:`~molvs.validations.SmartsValidation` to check for the presence of a substructure. """ + level = logging.INFO - smarts = '[Cl]-[#6]-[#6]-[Cl]' + smarts = "[Cl]-[#6]-[#6]-[Cl]" entire_fragment = True - message = '1,2-Dichloroethane is present' + message = "1,2-Dichloroethane is present" class FragmentValidation(Validation): @@ -130,10 +134,12 @@ class FragmentValidation(Validation): def run(self, mol): for fp in self.fragments: - matches = frozenset(frozenset(match) for match in mol.GetSubstructMatches(fp.smarts)) + matches = frozenset( + frozenset(match) for match in mol.GetSubstructMatches(fp.smarts) + ) fragments = frozenset(frozenset(frag) for frag in Chem.GetMolFrags(mol)) if matches & fragments: - self.log.info('%s is present', fp.name) + self.log.info("%s is present", fp.name) class NeutralValidation(Validation): @@ -142,8 +148,8 @@ class NeutralValidation(Validation): def run(self, mol): charge = Chem.GetFormalCharge(mol) if not charge == 0: - chargestring = '+%s' % charge if charge > 0 else '%s' % charge - self.log.info('Not an overall neutral system (%s)', chargestring) + chargestring = "+%s" % charge if charge > 0 else "%s" % charge + self.log.info("Not an overall neutral system (%s)", chargestring) class IsotopeValidation(Validation): @@ -154,23 +160,22 @@ def run(self, mol): for atom in mol.GetAtoms(): isotope = atom.GetIsotope() if not isotope == 0: - isotopes.add('%s%s' % (isotope, atom.GetSymbol())) + isotopes.add("%s%s" % (isotope, atom.GetSymbol())) for isotope in isotopes: - self.log.info('Molecule contains isotope %s', isotope) + self.log.info("Molecule contains isotope %s", isotope) #: The default list of :class:`Validations ` used by :class:`~molvs.validate.Validator`. VALIDATIONS = ( IsNoneValidation, NoAtomValidation, - #DichloroethaneValidation, + # DichloroethaneValidation, FragmentValidation, NeutralValidation, IsotopeValidation, ) - # - WARN/ERROR: Are all atoms defined/real - no query atoms or invalid elements, r-group things # - INFO: Contains unknown stereo (Perform stereochemistry perception first?) # - INFO: Nonstandard tautomer (log SMILES of tautomer parent, or the name of the tautomer transform?) @@ -201,10 +206,7 @@ def run(self, mol): # UniChem from EBI could be useful here, otherwise use each API directly - - # Allow definition of MolSchema to set custom validations on e.g. # People can define a filterer # This has a series of validations, and the required output - e.g. no error or no warns? - diff --git a/gypsum_dl/run.py b/gypsum_dl/run.py new file mode 100755 index 0000000..c55949e --- /dev/null +++ b/gypsum_dl/run.py @@ -0,0 +1,307 @@ +# Copyright 2023 Jacob D. Durrant +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import copy + +from . import Utils +from .Start import prepare_molecules +from .Test.Tester import run_test + + +def print_gypsum_citation(): + """ + Print out the citation for the Gypsum-DL paper. + Because this is before the Parallelizer is initiallized it requires + limiting the print statement to the cpu ranked=0. + Without this check, in MPI mode it would print once per available cpu. + """ + + import sys + + # And always report citation information. + citation_print = ( + "\nIf you use Gypsum-DL in your research, please cite:\n\n" + + "Ropp, Patrick J., Jacob O. Spiegel, Jennifer L. Walker, Harrison Green,\n" + ) + citation_print += "Guillermo A. Morales, Katherine A. Milliken, John J. Ringe, and Jacob D. Durrant.\n" + citation_print += "(2019) Gypsum-DL: An Open-source Program for Preparing Small-molecule Libraries for \n" + citation_print += ( + "Structure-based Virtual Screening. Journal of Cheminformatics 11:1. " + ) + citation_print += "\ndoi:10.1186/s13321-019-0358-3.\n" + + try: + from mpi4py import MPI + + comm = MPI.COMM_WORLD + rank = comm.rank + if rank == 0: + print(citation_print) + except Exception: + print(citation_print) + + +def main(): + # print out the citation of Gypsum-DL paper. + print_gypsum_citation() + + PARSER = argparse.ArgumentParser( + formatter_class=argparse.RawDescriptionHelpFormatter, + description=""" + Gypsum-DL 1.2.1, a free, open-source program for preparing 3D small-molecule + models. Beyond simply assigning atomic coordinates, Gypsum-DL accounts for + alternate ionization, tautomeric, chiral, cis/trans isomeric, and + ring-conformational forms.""", + epilog=""" + EXAMPLES OF USE: + + 1. Prepare a virtual library and save all 3D models to a single SDF file in the + present directory: + + python run_gypsum_dl.py --source ./examples/sample_molecules.smi + + 2. Instead save all 3D models to a different, existing folder: + + python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ + --output_folder /my/folder/ + + 3. Additionally save the models associated with each input molecule to + separate files: + + python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ + --output_folder /my/folder/ --separate_output_files + + 4. In addition to saving a 3D SDF file, also save 3D PDB files and an HTML file + with 2D structures (for debugging). + + python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ + --output_folder /my/folder/ --add_pdb_output --add_html_output + + 5. Save at most two variants per input molecule: + + python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ + --output_folder /my/folder/ --max_variants_per_compound 2 + + 6. Control how Gypsum-DL ionizes the input molecules: + + python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ + --output_folder /my/folder/ --min_ph 12 --max_ph 14 --pka_precision 1 + + 7. Run Gypsum-DL in serial mode (using only one processor): + + python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ + --job_manager serial + + 8. Run Gypsum-DL in multiprocessing mode, using 4 processors: + + python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ + --job_manager multiprocessing --num_processors 4 + + 9. Run Gypsum-DL in mpi mode using all available processors: + + mpirun -n $NTASKS python -m mpi4py run_gypsum_dl.py \\ + --source ./examples/sample_molecules.smi \\ + --job_manager mpi --num_processors -1 + + 10. Gypsum-DL can also take parameters from a JSON file: + + python run_gypsum_dl.py --json myparams.json + + Where myparams.json might look like: + + { + "source": "./examples/sample_molecules.smi", + "separate_output_files": true, + "job_manager": "multiprocessing", + "output_folder": "/my/folder/", + "add_pdb_output": true, + "add_html_output": true, + "num_processors": -1 + } + """, + ) + + PARSER.add_argument( + "--json", + "-j", + type=str, + metavar="param.json", + help="Name of a json file containing all parameters. \ + Overrides all other arguments specified at the commandline.", + ) + PARSER.add_argument( + "--source", + "-s", + type=str, + metavar="input.smi", + help="Name of the source file (e.g., input.smi). Note: support for SMI (SMILES) files is better than support for SDF files, though Gypsum-DL can handle both.", + ) + PARSER.add_argument( + "--output_folder", + "-o", + type=str, + help="The path to an existing folder where the Gypsum-DL " + + "output file(s) will be saved.", + ) + PARSER.add_argument( + "--job_manager", + type=str, + default="multiprocessing", + choices=["mpi", "multiprocessing", "serial"], + help="Determine what style of multiprocessing to use: mpi, \ + multiprocessing, or serial. Serial will override the \ + num_processors flag, forcing it to be one. MPI mode \ + requires mpi4py 2.1.0 or higher and should be executed \ + as: mpirun -n $NTASKS python -m mpi4py run_gypsum_dl.py \ + ...-settings...", + ) + PARSER.add_argument( + "--num_processors", + "-p", + type=int, + metavar="N", + default=1, + help="Number of processors to use for parallel \ + calculations.", + ) + PARSER.add_argument( + "--max_variants_per_compound", + "-m", + type=int, + metavar="V", + help="The maximum number of variants to create per input \ + molecule.", + ) + PARSER.add_argument( + "--thoroughness", + "-t", + type=int, + help="How widely to search for low-energy conformers. \ + Larger values increase run times but can produce better \ + results.", + ) + PARSER.add_argument( + "--separate_output_files", + action="store_true", + help="Indicates that the outputs should be split between \ + files. If true, each output .sdf file will correspond to a \ + single input file, but different 3D conformers will still \ + be stored in the same file.", + ) + PARSER.add_argument( + "--add_pdb_output", + action="store_true", + help="Indicates that the outputs should also be written in \ + the .pdb format. Creates one PDB file for each molecular \ + variant.", + ) + PARSER.add_argument( + "--add_html_output", + action="store_true", + help="Indicates that the outputs should also be written in \ + the .html format, for debugging. Attempts to open a \ + browser for viewing.", + ) + PARSER.add_argument( + "--min_ph", metavar="MIN", type=float, help="Minimum pH to consider." + ) + PARSER.add_argument( + "--max_ph", metavar="MAX", type=float, help="Maximum pH to consider." + ) + PARSER.add_argument( + "--pka_precision", + metavar="D", + type=float, + help="Size of pH substructure ranges. See Dimorphite-DL \ + publication for details.", + ) + PARSER.add_argument( + "--skip_optimize_geometry", + action="store_true", + help="Skips the optimization step.", + ) + PARSER.add_argument( + "--skip_alternate_ring_conformations", + action="store_true", + help="Skips the non-aromatic ring-conformation \ + generation step.", + ) + PARSER.add_argument( + "--skip_adding_hydrogen", action="store_true", help="Skips the ionization step." + ) + PARSER.add_argument( + "--skip_making_tautomers", + action="store_true", + help="Skips tautomer-generation step.", + ) + PARSER.add_argument( + "--skip_enumerate_chiral_mol", + action="store_true", + help="Skips the ennumeration of unspecified chiral \ + centers.", + ) + PARSER.add_argument( + "--skip_enumerate_double_bonds", + action="store_true", + help="Skips the ennumeration of double bonds.", + ) + + PARSER.add_argument( + "--let_tautomers_change_chirality", + action="store_true", + help="Allow tautomers that change \ + the total number of chiral centers (see README.md for \ + further explanation).", + ) + + PARSER.add_argument( + "--use_durrant_lab_filters", + action="store_true", + help="Use substructure filters to \ + remove molecular variants that, though technically \ + possible, were judged improbable by members of the \ + Durrant lab. See README.md for more details.", + ) + + PARSER.add_argument( + "--2d_output_only", + action="store_true", + help="Skips the generate-3D-models step.", + ) + PARSER.add_argument( + "--cache_prerun", + "-c", + action="store_true", + help="Run this before running Gypsum-DL in mpi mode.", + ) + PARSER.add_argument( + "--test", + action="store_true", + help="Tests Gypsum-DL to check for programming bugs.", + ) + + ARGS_DICT = vars(PARSER.parse_args()) + if ARGS_DICT["test"] == True: + run_test() + elif ARGS_DICT["cache_prerun"] == False: + INPUTS = copy.deepcopy(ARGS_DICT) + + for k, v in ARGS_DICT.items(): + if v is None: + del INPUTS[k] + prepare_molecules(INPUTS) + Utils.log("Finished Gypsum-DL") + else: + pass diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..3fff8c2 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,2223 @@ +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. + +[[package]] +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] + +[[package]] +name = "astroid" +version = "2.15.8" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.7.2" +files = [ + {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, + {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, +] + +[package.dependencies] +lazy-object-proxy = ">=1.4.0" +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +wrapt = [ + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, +] + +[[package]] +name = "babel" +version = "2.14.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "black" +version = "23.12.1" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, + {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, + {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, + {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, + {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, + {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, + {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, + {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, + {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, + {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, + {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, + {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, + {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, + {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, + {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, + {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, + {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, + {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, + {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, + {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, + {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, + {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "bracex" +version = "2.4" +description = "Bash style brace expander." +optional = false +python-versions = ">=3.8" +files = [ + {file = "bracex-2.4-py3-none-any.whl", hash = "sha256:efdc71eff95eaff5e0f8cfebe7d01adf2c8637c8c92edaf63ef348c241a82418"}, + {file = "bracex-2.4.tar.gz", hash = "sha256:a27eaf1df42cf561fed58b7a8f3fdf129d1ea16a81e1fadd1d17989bc6384beb"}, +] + +[[package]] +name = "bump-my-version" +version = "0.11.0" +description = "Version bump your Python project" +optional = false +python-versions = ">=3.7" +files = [ + {file = "bump-my-version-0.11.0.tar.gz", hash = "sha256:5ccafd65935c148e170a401a5dd4f62e7785ad41e075afd6eace4500a19d8b53"}, + {file = "bump_my_version-0.11.0-py3-none-any.whl", hash = "sha256:6b61d281b366effb87087f4ab9b7eed09119505faa2630dac5594f74a69f24e2"}, +] + +[package.dependencies] +click = "*" +pydantic = "*" +pydantic-settings = "*" +rich = "*" +rich-click = "*" +tomlkit = "*" + +[package.extras] +dev = ["generate-changelog (>=0.7.6)", "git-fame (>=1.12.2)", "pip-tools", "pre-commit"] +docs = ["Sphinx (>=4.3.0)", "furo", "ghp-import", "linkify-it-py", "myst-parser", "sphinx-autodoc-typehints", "sphinx-autodoc2", "sphinx-click", "sphinx-copybutton"] +test = ["coverage", "pre-commit", "pytest", "pytest-cov", "pytest-mock"] + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "coverage" +version = "7.4.4" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, + {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, + {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, + {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, + {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, + {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, + {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, + {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, + {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, + {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, + {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, + {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, + {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "dill" +version = "0.3.8" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + +[[package]] +name = "distlib" +version = "0.3.8" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] + +[[package]] +name = "dunamai" +version = "1.19.2" +description = "Dynamic version generation" +optional = false +python-versions = ">=3.5" +files = [ + {file = "dunamai-1.19.2-py3-none-any.whl", hash = "sha256:bc126b17571a44d68ed826cec596e0f61dc01edca8b21486f70014936a5d44f2"}, + {file = "dunamai-1.19.2.tar.gz", hash = "sha256:3be4049890763e19b8df1d52960dbea60b3e263eb0c96144a677ae0633734d2e"}, +] + +[package.dependencies] +packaging = ">=20.9" + +[[package]] +name = "exceptiongroup" +version = "1.2.0" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "filelock" +version = "3.13.3" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.3-py3-none-any.whl", hash = "sha256:5ffa845303983e7a0b7ae17636509bc97997d58afeafa72fb141a17b152284cb"}, + {file = "filelock-3.13.3.tar.gz", hash = "sha256:a79895a25bbefdf55d1a2a0a80968f7dbb28edcd6d4234a0afb3f37ecde4b546"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +optional = false +python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] + +[[package]] +name = "griffe" +version = "0.42.1" +description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." +optional = false +python-versions = ">=3.8" +files = [ + {file = "griffe-0.42.1-py3-none-any.whl", hash = "sha256:7e805e35617601355edcac0d3511cedc1ed0cb1f7645e2d336ae4b05bbae7b3b"}, + {file = "griffe-0.42.1.tar.gz", hash = "sha256:57046131384043ed078692b85d86b76568a686266cc036b9b56b704466f803ce"}, +] + +[package.dependencies] +colorama = ">=0.4" + +[[package]] +name = "identify" +version = "2.5.35" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e"}, + {file = "identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + +[[package]] +name = "importlib-metadata" +version = "7.1.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, +] + +[package.extras] +colors = ["colorama (>=0.4.6)"] + +[[package]] +name = "jinja2" +version = "3.1.3" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "lazy-object-proxy" +version = "1.10.0" +description = "A fast and thorough lazy object proxy." +optional = false +python-versions = ">=3.8" +files = [ + {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win32.whl", hash = "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win32.whl", hash = "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win32.whl", hash = "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win32.whl", hash = "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win32.whl", hash = "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd"}, + {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, +] + +[[package]] +name = "loguru" +version = "0.7.2" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = ">=3.5" +files = [ + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] + +[[package]] +name = "markdown" +version = "3.6" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, + {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "material-plausible-plugin" +version = "0.2.0" +description = "Plausible Analytics implementation for Material for MkDocs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "material_plausible_plugin-0.2.0-py3-none-any.whl", hash = "sha256:b7dc866b358475d940c5c61f56f86c400b9c1e73ffa2b06819207df38f34fcf4"}, + {file = "material_plausible_plugin-0.2.0.tar.gz", hash = "sha256:9416d6313ff9ddeec25e14e9c4baac1341511263706a5997bd714d552992d752"}, +] + +[package.dependencies] +mkdocs = "*" +mkdocs-material = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +optional = false +python-versions = ">=3.6" +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] + +[[package]] +name = "mkdocs" +version = "1.5.3" +description = "Project documentation with Markdown." +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, + {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} +ghp-import = ">=1.0" +importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} +jinja2 = ">=2.11.1" +markdown = ">=3.2.1" +markupsafe = ">=2.0.1" +mergedeep = ">=1.3.4" +packaging = ">=20.5" +pathspec = ">=0.11.1" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] + +[[package]] +name = "mkdocs-autorefs" +version = "1.0.1" +description = "Automatically link across pages in MkDocs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_autorefs-1.0.1-py3-none-any.whl", hash = "sha256:aacdfae1ab197780fb7a2dac92ad8a3d8f7ca8049a9cbe56a4218cd52e8da570"}, + {file = "mkdocs_autorefs-1.0.1.tar.gz", hash = "sha256:f684edf847eced40b570b57846b15f0bf57fb93ac2c510450775dcf16accb971"}, +] + +[package.dependencies] +Markdown = ">=3.3" +markupsafe = ">=2.0.1" +mkdocs = ">=1.1" + +[[package]] +name = "mkdocs-awesome-pages-plugin" +version = "2.9.2" +description = "An MkDocs plugin that simplifies configuring page titles and their order" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs_awesome_pages_plugin-2.9.2-py3-none-any.whl", hash = "sha256:9c795587695bd1ee85a8b7e43293005418df5a8b9ef296a3e628be427b693b4d"}, + {file = "mkdocs_awesome_pages_plugin-2.9.2.tar.gz", hash = "sha256:c3f7d366ecfe99b64524c49a84d8e13c576c19a918ea2e6f59bb486a259313af"}, +] + +[package.dependencies] +mkdocs = ">=1" +natsort = ">=8.1.0" +wcmatch = ">=7" + +[[package]] +name = "mkdocs-gen-files" +version = "0.5.0" +description = "MkDocs plugin to programmatically generate documentation pages during the build" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs_gen_files-0.5.0-py3-none-any.whl", hash = "sha256:7ac060096f3f40bd19039e7277dd3050be9a453c8ac578645844d4d91d7978ea"}, + {file = "mkdocs_gen_files-0.5.0.tar.gz", hash = "sha256:4c7cf256b5d67062a788f6b1d035e157fc1a9498c2399be9af5257d4ff4d19bc"}, +] + +[package.dependencies] +mkdocs = ">=1.0.3" + +[[package]] +name = "mkdocs-material" +version = "9.5.15" +description = "Documentation that simply works" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material-9.5.15-py3-none-any.whl", hash = "sha256:e5c96dec3d19491de49ca643fc1dbb92b278e43cdb816c775bc47db77d9b62fb"}, + {file = "mkdocs_material-9.5.15.tar.gz", hash = "sha256:39f03cca45e82bf54eb7456b5a18bd252eabfdd67f237a229471484a0a4d4635"}, +] + +[package.dependencies] +babel = ">=2.10,<3.0" +colorama = ">=0.4,<1.0" +jinja2 = ">=3.0,<4.0" +markdown = ">=3.2,<4.0" +mkdocs = ">=1.5.3,<1.6.0" +mkdocs-material-extensions = ">=1.3,<2.0" +paginate = ">=0.5,<1.0" +pygments = ">=2.16,<3.0" +pymdown-extensions = ">=10.2,<11.0" +regex = ">=2022.4" +requests = ">=2.26,<3.0" + +[package.extras] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"] +recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +description = "Extension pack for Python Markdown and MkDocs Material." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, +] + +[[package]] +name = "mkdocs-table-reader-plugin" +version = "2.1.0" +description = "MkDocs plugin to directly insert tables from files into markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs-table-reader-plugin-2.1.0.tar.gz", hash = "sha256:cef5a1127e2c04955d5716e67ede66971a0a5ee3dd5386af6cba53c707c78b8b"}, + {file = "mkdocs_table_reader_plugin-2.1.0-py3-none-any.whl", hash = "sha256:b98041627b4982c5a5c6dac6f2e97767c53658771eed926057aa48c61a4e494f"}, +] + +[package.dependencies] +mkdocs = ">=1.0" +pandas = ">=1.1" +PyYAML = ">=5.4.1" +tabulate = ">=0.8.7" + +[[package]] +name = "mkdocstrings" +version = "0.23.0" +description = "Automatic documentation from sources, for MkDocs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings-0.23.0-py3-none-any.whl", hash = "sha256:051fa4014dfcd9ed90254ae91de2dbb4f24e166347dae7be9a997fe16316c65e"}, + {file = "mkdocstrings-0.23.0.tar.gz", hash = "sha256:d9c6a37ffbe7c14a7a54ef1258c70b8d394e6a33a1c80832bce40b9567138d1c"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} +Jinja2 = ">=2.11.1" +Markdown = ">=3.3" +MarkupSafe = ">=1.1" +mkdocs = ">=1.2" +mkdocs-autorefs = ">=0.3.1" +pymdown-extensions = ">=6.3" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.10\""} + +[package.extras] +crystal = ["mkdocstrings-crystal (>=0.3.4)"] +python = ["mkdocstrings-python (>=0.5.2)"] +python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] + +[[package]] +name = "mkdocstrings-python" +version = "1.8.0" +description = "A Python handler for mkdocstrings." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings_python-1.8.0-py3-none-any.whl", hash = "sha256:4209970cc90bec194568682a535848a8d8489516c6ed4adbe58bbc67b699ca9d"}, + {file = "mkdocstrings_python-1.8.0.tar.gz", hash = "sha256:1488bddf50ee42c07d9a488dddc197f8e8999c2899687043ec5dd1643d057192"}, +] + +[package.dependencies] +griffe = ">=0.37" +mkdocstrings = ">=0.20" + +[[package]] +name = "mypy" +version = "1.9.0" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8a67616990062232ee4c3952f41c779afac41405806042a8126fe96e098419f"}, + {file = "mypy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d357423fa57a489e8c47b7c85dfb96698caba13d66e086b412298a1a0ea3b0ed"}, + {file = "mypy-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c87c15aed320de9b438ae7b00c1ac91cd393c1b854c2ce538e2a72d55df150"}, + {file = "mypy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:48533cdd345c3c2e5ef48ba3b0d3880b257b423e7995dada04248725c6f77374"}, + {file = "mypy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:4d3dbd346cfec7cb98e6cbb6e0f3c23618af826316188d587d1c1bc34f0ede03"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:653265f9a2784db65bfca694d1edd23093ce49740b2244cde583aeb134c008f3"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a3c007ff3ee90f69cf0a15cbcdf0995749569b86b6d2f327af01fd1b8aee9dc"}, + {file = "mypy-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2418488264eb41f69cc64a69a745fad4a8f86649af4b1041a4c64ee61fc61129"}, + {file = "mypy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68edad3dc7d70f2f17ae4c6c1b9471a56138ca22722487eebacfd1eb5321d612"}, + {file = "mypy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:85ca5fcc24f0b4aeedc1d02f93707bccc04733f21d41c88334c5482219b1ccb3"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aceb1db093b04db5cd390821464504111b8ec3e351eb85afd1433490163d60cd"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0235391f1c6f6ce487b23b9dbd1327b4ec33bb93934aa986efe8a9563d9349e6"}, + {file = "mypy-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d5ddc13421ba3e2e082a6c2d74c2ddb3979c39b582dacd53dd5d9431237185"}, + {file = "mypy-1.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:190da1ee69b427d7efa8aa0d5e5ccd67a4fb04038c380237a0d96829cb157913"}, + {file = "mypy-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe28657de3bfec596bbeef01cb219833ad9d38dd5393fc649f4b366840baefe6"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e54396d70be04b34f31d2edf3362c1edd023246c82f1730bbf8768c28db5361b"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5e6061f44f2313b94f920e91b204ec600982961e07a17e0f6cd83371cb23f5c2"}, + {file = "mypy-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a10926e5473c5fc3da8abb04119a1f5811a236dc3a38d92015cb1e6ba4cb9e"}, + {file = "mypy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b685154e22e4e9199fc95f298661deea28aaede5ae16ccc8cbb1045e716b3e04"}, + {file = "mypy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d741d3fc7c4da608764073089e5f58ef6352bedc223ff58f2f038c2c4698a89"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:587ce887f75dd9700252a3abbc9c97bbe165a4a630597845c61279cf32dfbf02"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f88566144752999351725ac623471661c9d1cd8caa0134ff98cceeea181789f4"}, + {file = "mypy-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61758fabd58ce4b0720ae1e2fea5cfd4431591d6d590b197775329264f86311d"}, + {file = "mypy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e49499be624dead83927e70c756970a0bc8240e9f769389cdf5714b0784ca6bf"}, + {file = "mypy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:571741dc4194b4f82d344b15e8837e8c5fcc462d66d076748142327626a1b6e9"}, + {file = "mypy-1.9.0-py3-none-any.whl", hash = "sha256:a260627a570559181a9ea5de61ac6297aa5af202f06fd7ab093ce74e7181e43e"}, + {file = "mypy-1.9.0.tar.gz", hash = "sha256:3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "natsort" +version = "8.4.0" +description = "Simple yet flexible natural sorting in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"}, + {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"}, +] + +[package.extras] +fast = ["fastnumbers (>=2.0.0)"] +icu = ["PyICU (>=1.0.0)"] + +[[package]] +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "packaging" +version = "24.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, +] + +[[package]] +name = "paginate" +version = "0.5.6" +description = "Divides large result sets into pages for easier browsing" +optional = false +python-versions = "*" +files = [ + {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, +] + +[[package]] +name = "pandas" +version = "2.2.1" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8df8612be9cd1c7797c93e1c5df861b2ddda0b48b08f2c3eaa0702cf88fb5f88"}, + {file = "pandas-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0f573ab277252ed9aaf38240f3b54cfc90fff8e5cab70411ee1d03f5d51f3944"}, + {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f02a3a6c83df4026e55b63c1f06476c9aa3ed6af3d89b4f04ea656ccdaaaa359"}, + {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c38ce92cb22a4bea4e3929429aa1067a454dcc9c335799af93ba9be21b6beb51"}, + {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c2ce852e1cf2509a69e98358e8458775f89599566ac3775e70419b98615f4b06"}, + {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53680dc9b2519cbf609c62db3ed7c0b499077c7fefda564e330286e619ff0dd9"}, + {file = "pandas-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:94e714a1cca63e4f5939cdce5f29ba8d415d85166be3441165edd427dc9f6bc0"}, + {file = "pandas-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f821213d48f4ab353d20ebc24e4faf94ba40d76680642fb7ce2ea31a3ad94f9b"}, + {file = "pandas-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c70e00c2d894cb230e5c15e4b1e1e6b2b478e09cf27cc593a11ef955b9ecc81a"}, + {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e97fbb5387c69209f134893abc788a6486dbf2f9e511070ca05eed4b930b1b02"}, + {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101d0eb9c5361aa0146f500773395a03839a5e6ecde4d4b6ced88b7e5a1a6403"}, + {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7d2ed41c319c9fb4fd454fe25372028dfa417aacb9790f68171b2e3f06eae8cd"}, + {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af5d3c00557d657c8773ef9ee702c61dd13b9d7426794c9dfeb1dc4a0bf0ebc7"}, + {file = "pandas-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:06cf591dbaefb6da9de8472535b185cba556d0ce2e6ed28e21d919704fef1a9e"}, + {file = "pandas-2.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:88ecb5c01bb9ca927ebc4098136038519aa5d66b44671861ffab754cae75102c"}, + {file = "pandas-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:04f6ec3baec203c13e3f8b139fb0f9f86cd8c0b94603ae3ae8ce9a422e9f5bee"}, + {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a935a90a76c44fe170d01e90a3594beef9e9a6220021acfb26053d01426f7dc2"}, + {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c391f594aae2fd9f679d419e9a4d5ba4bce5bb13f6a989195656e7dc4b95c8f0"}, + {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9d1265545f579edf3f8f0cb6f89f234f5e44ba725a34d86535b1a1d38decbccc"}, + {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:11940e9e3056576ac3244baef2fedade891977bcc1cb7e5cc8f8cc7d603edc89"}, + {file = "pandas-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4acf681325ee1c7f950d058b05a820441075b0dd9a2adf5c4835b9bc056bf4fb"}, + {file = "pandas-2.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9bd8a40f47080825af4317d0340c656744f2bfdb6819f818e6ba3cd24c0e1397"}, + {file = "pandas-2.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df0c37ebd19e11d089ceba66eba59a168242fc6b7155cba4ffffa6eccdfb8f16"}, + {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739cc70eaf17d57608639e74d63387b0d8594ce02f69e7a0b046f117974b3019"}, + {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d3558d263073ed95e46f4650becff0c5e1ffe0fc3a015de3c79283dfbdb3df"}, + {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4aa1d8707812a658debf03824016bf5ea0d516afdea29b7dc14cf687bc4d4ec6"}, + {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:76f27a809cda87e07f192f001d11adc2b930e93a2b0c4a236fde5429527423be"}, + {file = "pandas-2.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:1ba21b1d5c0e43416218db63037dbe1a01fc101dc6e6024bcad08123e48004ab"}, + {file = "pandas-2.2.1.tar.gz", hash = "sha256:0ab90f87093c13f3e8fa45b48ba9f39181046e8f3317d3aadb2fffbb1b978572"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pillow" +version = "10.2.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, + {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, + {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, + {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, + {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, + {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, + {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, + {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, + {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, + {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, + {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, + {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, + {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, + {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, + {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, + {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, + {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.2.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] + +[[package]] +name = "pluggy" +version = "1.4.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poetry-dynamic-versioning" +version = "1.2.0" +description = "Plugin for Poetry to enable dynamic versioning based on VCS tags" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "poetry_dynamic_versioning-1.2.0-py3-none-any.whl", hash = "sha256:8dbef9728d866eb3d1a4edbb29c7ac8abdf96e3ca659473e950e2c016f3785ec"}, + {file = "poetry_dynamic_versioning-1.2.0.tar.gz", hash = "sha256:1a7bbdba2530499e73dfc6ac0af19de29020ab4aaa3e507573877114e6b71ed6"}, +] + +[package.dependencies] +dunamai = ">=1.18.0,<2.0.0" +jinja2 = ">=2.11.1,<4" +tomlkit = ">=0.4" + +[package.extras] +plugin = ["poetry (>=1.2.0,<2.0.0)"] + +[[package]] +name = "pre-commit" +version = "3.7.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pre_commit-3.7.0-py2.py3-none-any.whl", hash = "sha256:5eae9e10c2b5ac51577c3452ec0a490455c45a0533f7960f993a0d01e59decab"}, + {file = "pre_commit-3.7.0.tar.gz", hash = "sha256:e209d61b8acdcf742404408531f0c37d49d2c734fd7cff2d6076083d191cb060"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "pydantic" +version = "2.6.4" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.6.4-py3-none-any.whl", hash = "sha256:cc46fce86607580867bdc3361ad462bab9c222ef042d3da86f2fb333e1d916c5"}, + {file = "pydantic-2.6.4.tar.gz", hash = "sha256:b1704e0847db01817624a6b86766967f552dd9dbf3afba4004409f908dcc84e6"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.16.3" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.16.3" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.16.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:75b81e678d1c1ede0785c7f46690621e4c6e63ccd9192af1f0bd9d504bbb6bf4"}, + {file = "pydantic_core-2.16.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9c865a7ee6f93783bd5d781af5a4c43dadc37053a5b42f7d18dc019f8c9d2bd1"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:162e498303d2b1c036b957a1278fa0899d02b2842f1ff901b6395104c5554a45"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f583bd01bbfbff4eaee0868e6fc607efdfcc2b03c1c766b06a707abbc856187"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b926dd38db1519ed3043a4de50214e0d600d404099c3392f098a7f9d75029ff8"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:716b542728d4c742353448765aa7cdaa519a7b82f9564130e2b3f6766018c9ec"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4ad7f7ee1a13d9cb49d8198cd7d7e3aa93e425f371a68235f784e99741561f"}, + {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd87f48924f360e5d1c5f770d6155ce0e7d83f7b4e10c2f9ec001c73cf475c99"}, + {file = "pydantic_core-2.16.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0df446663464884297c793874573549229f9eca73b59360878f382a0fc085979"}, + {file = "pydantic_core-2.16.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4df8a199d9f6afc5ae9a65f8f95ee52cae389a8c6b20163762bde0426275b7db"}, + {file = "pydantic_core-2.16.3-cp310-none-win32.whl", hash = "sha256:456855f57b413f077dff513a5a28ed838dbbb15082ba00f80750377eed23d132"}, + {file = "pydantic_core-2.16.3-cp310-none-win_amd64.whl", hash = "sha256:732da3243e1b8d3eab8c6ae23ae6a58548849d2e4a4e03a1924c8ddf71a387cb"}, + {file = "pydantic_core-2.16.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:519ae0312616026bf4cedc0fe459e982734f3ca82ee8c7246c19b650b60a5ee4"}, + {file = "pydantic_core-2.16.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b3992a322a5617ded0a9f23fd06dbc1e4bd7cf39bc4ccf344b10f80af58beacd"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d62da299c6ecb04df729e4b5c52dc0d53f4f8430b4492b93aa8de1f541c4aac"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2acca2be4bb2f2147ada8cac612f8a98fc09f41c89f87add7256ad27332c2fda"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b662180108c55dfbf1280d865b2d116633d436cfc0bba82323554873967b340"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7c6ed0dc9d8e65f24f5824291550139fe6f37fac03788d4580da0d33bc00c97"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1bb0827f56654b4437955555dc3aeeebeddc47c2d7ed575477f082622c49e"}, + {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e56f8186d6210ac7ece503193ec84104da7ceb98f68ce18c07282fcc2452e76f"}, + {file = "pydantic_core-2.16.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:936e5db01dd49476fa8f4383c259b8b1303d5dd5fb34c97de194560698cc2c5e"}, + {file = "pydantic_core-2.16.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33809aebac276089b78db106ee692bdc9044710e26f24a9a2eaa35a0f9fa70ba"}, + {file = "pydantic_core-2.16.3-cp311-none-win32.whl", hash = "sha256:ded1c35f15c9dea16ead9bffcde9bb5c7c031bff076355dc58dcb1cb436c4721"}, + {file = "pydantic_core-2.16.3-cp311-none-win_amd64.whl", hash = "sha256:d89ca19cdd0dd5f31606a9329e309d4fcbb3df860960acec32630297d61820df"}, + {file = "pydantic_core-2.16.3-cp311-none-win_arm64.whl", hash = "sha256:6162f8d2dc27ba21027f261e4fa26f8bcb3cf9784b7f9499466a311ac284b5b9"}, + {file = "pydantic_core-2.16.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f56ae86b60ea987ae8bcd6654a887238fd53d1384f9b222ac457070b7ac4cff"}, + {file = "pydantic_core-2.16.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9bd22a2a639e26171068f8ebb5400ce2c1bc7d17959f60a3b753ae13c632975"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4204e773b4b408062960e65468d5346bdfe139247ee5f1ca2a378983e11388a2"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f651dd19363c632f4abe3480a7c87a9773be27cfe1341aef06e8759599454120"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aaf09e615a0bf98d406657e0008e4a8701b11481840be7d31755dc9f97c44053"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e47755d8152c1ab5b55928ab422a76e2e7b22b5ed8e90a7d584268dd49e9c6b"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:500960cb3a0543a724a81ba859da816e8cf01b0e6aaeedf2c3775d12ee49cade"}, + {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf6204fe865da605285c34cf1172879d0314ff267b1c35ff59de7154f35fdc2e"}, + {file = "pydantic_core-2.16.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d33dd21f572545649f90c38c227cc8631268ba25c460b5569abebdd0ec5974ca"}, + {file = "pydantic_core-2.16.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:49d5d58abd4b83fb8ce763be7794d09b2f50f10aa65c0f0c1696c677edeb7cbf"}, + {file = "pydantic_core-2.16.3-cp312-none-win32.whl", hash = "sha256:f53aace168a2a10582e570b7736cc5bef12cae9cf21775e3eafac597e8551fbe"}, + {file = "pydantic_core-2.16.3-cp312-none-win_amd64.whl", hash = "sha256:0d32576b1de5a30d9a97f300cc6a3f4694c428d956adbc7e6e2f9cad279e45ed"}, + {file = "pydantic_core-2.16.3-cp312-none-win_arm64.whl", hash = "sha256:ec08be75bb268473677edb83ba71e7e74b43c008e4a7b1907c6d57e940bf34b6"}, + {file = "pydantic_core-2.16.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b1f6f5938d63c6139860f044e2538baeee6f0b251a1816e7adb6cbce106a1f01"}, + {file = "pydantic_core-2.16.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a1ef6a36fdbf71538142ed604ad19b82f67b05749512e47f247a6ddd06afdc7"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704d35ecc7e9c31d48926150afada60401c55efa3b46cd1ded5a01bdffaf1d48"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d937653a696465677ed583124b94a4b2d79f5e30b2c46115a68e482c6a591c8a"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9803edf8e29bd825f43481f19c37f50d2b01899448273b3a7758441b512acf8"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72282ad4892a9fb2da25defeac8c2e84352c108705c972db82ab121d15f14e6d"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f752826b5b8361193df55afcdf8ca6a57d0232653494ba473630a83ba50d8c9"}, + {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4384a8f68ddb31a0b0c3deae88765f5868a1b9148939c3f4121233314ad5532c"}, + {file = "pydantic_core-2.16.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4b2bf78342c40b3dc830880106f54328928ff03e357935ad26c7128bbd66ce8"}, + {file = "pydantic_core-2.16.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:13dcc4802961b5f843a9385fc821a0b0135e8c07fc3d9949fd49627c1a5e6ae5"}, + {file = "pydantic_core-2.16.3-cp38-none-win32.whl", hash = "sha256:e3e70c94a0c3841e6aa831edab1619ad5c511199be94d0c11ba75fe06efe107a"}, + {file = "pydantic_core-2.16.3-cp38-none-win_amd64.whl", hash = "sha256:ecdf6bf5f578615f2e985a5e1f6572e23aa632c4bd1dc67f8f406d445ac115ed"}, + {file = "pydantic_core-2.16.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bda1ee3e08252b8d41fa5537413ffdddd58fa73107171a126d3b9ff001b9b820"}, + {file = "pydantic_core-2.16.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:21b888c973e4f26b7a96491c0965a8a312e13be108022ee510248fe379a5fa23"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be0ec334369316fa73448cc8c982c01e5d2a81c95969d58b8f6e272884df0074"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5b6079cc452a7c53dd378c6f881ac528246b3ac9aae0f8eef98498a75657805"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee8d5f878dccb6d499ba4d30d757111847b6849ae07acdd1205fffa1fc1253c"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7233d65d9d651242a68801159763d09e9ec96e8a158dbf118dc090cd77a104c9"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6119dc90483a5cb50a1306adb8d52c66e447da88ea44f323e0ae1a5fcb14256"}, + {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:578114bc803a4c1ff9946d977c221e4376620a46cf78da267d946397dc9514a8"}, + {file = "pydantic_core-2.16.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d8f99b147ff3fcf6b3cc60cb0c39ea443884d5559a30b1481e92495f2310ff2b"}, + {file = "pydantic_core-2.16.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4ac6b4ce1e7283d715c4b729d8f9dab9627586dafce81d9eaa009dd7f25dd972"}, + {file = "pydantic_core-2.16.3-cp39-none-win32.whl", hash = "sha256:e7774b570e61cb998490c5235740d475413a1f6de823169b4cf94e2fe9e9f6b2"}, + {file = "pydantic_core-2.16.3-cp39-none-win_amd64.whl", hash = "sha256:9091632a25b8b87b9a605ec0e61f241c456e9248bfdcf7abdf344fdb169c81cf"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:36fa178aacbc277bc6b62a2c3da95226520da4f4e9e206fdf076484363895d2c"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:dcca5d2bf65c6fb591fff92da03f94cd4f315972f97c21975398bd4bd046854a"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a72fb9963cba4cd5793854fd12f4cfee731e86df140f59ff52a49b3552db241"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b60cc1a081f80a2105a59385b92d82278b15d80ebb3adb200542ae165cd7d183"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cbcc558401de90a746d02ef330c528f2e668c83350f045833543cd57ecead1ad"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:fee427241c2d9fb7192b658190f9f5fd6dfe41e02f3c1489d2ec1e6a5ab1e04a"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f4cb85f693044e0f71f394ff76c98ddc1bc0953e48c061725e540396d5c8a2e1"}, + {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b29eeb887aa931c2fcef5aa515d9d176d25006794610c264ddc114c053bf96fe"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a425479ee40ff021f8216c9d07a6a3b54b31c8267c6e17aa88b70d7ebd0e5e5b"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5c5cbc703168d1b7a838668998308018a2718c2130595e8e190220238addc96f"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b6add4c0b39a513d323d3b93bc173dac663c27b99860dd5bf491b240d26137"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f76ee558751746d6a38f89d60b6228fa174e5172d143886af0f85aa306fd89"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:00ee1c97b5364b84cb0bd82e9bbf645d5e2871fb8c58059d158412fee2d33d8a"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:287073c66748f624be4cef893ef9174e3eb88fe0b8a78dc22e88eca4bc357ca6"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed25e1835c00a332cb10c683cd39da96a719ab1dfc08427d476bce41b92531fc"}, + {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:86b3d0033580bd6bbe07590152007275bd7af95f98eaa5bd36f3da219dcd93da"}, + {file = "pydantic_core-2.16.3.tar.gz", hash = "sha256:1cac689f80a3abab2d3c0048b29eea5751114054f032a941a32de4c852c59cad"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.2.1" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.2.1-py3-none-any.whl", hash = "sha256:0235391d26db4d2190cb9b31051c4b46882d28a51533f97440867f012d4da091"}, + {file = "pydantic_settings-2.2.1.tar.gz", hash = "sha256:00b9f6a5e95553590434c0fa01ead0b216c3e10bc54ae02e37f359948643c5ed"}, +] + +[package.dependencies] +pydantic = ">=2.3.0" +python-dotenv = ">=0.21.0" + +[package.extras] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + +[[package]] +name = "pygments" +version = "2.17.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] + +[package.extras] +plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pylint" +version = "2.17.7" +description = "python code static checker" +optional = false +python-versions = ">=3.7.2" +files = [ + {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, + {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, +] + +[package.dependencies] +astroid = ">=2.15.8,<=2.17.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, +] +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pymdown-extensions" +version = "10.7.1" +description = "Extension pack for Python Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pymdown_extensions-10.7.1-py3-none-any.whl", hash = "sha256:f5cc7000d7ff0d1ce9395d216017fa4df3dde800afb1fb72d1c7d3fd35e710f4"}, + {file = "pymdown_extensions-10.7.1.tar.gz", hash = "sha256:c70e146bdd83c744ffc766b4671999796aba18842b268510a329f7f64700d584"}, +] + +[package.dependencies] +markdown = ">=3.5" +pyyaml = "*" + +[package.extras] +extra = ["pygments (>=2.12)"] + +[[package]] +name = "pytest" +version = "7.4.4" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "pytest-html" +version = "4.1.1" +description = "pytest plugin for generating HTML reports" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_html-4.1.1-py3-none-any.whl", hash = "sha256:c8152cea03bd4e9bee6d525573b67bbc6622967b72b9628dda0ea3e2a0b5dd71"}, + {file = "pytest_html-4.1.1.tar.gz", hash = "sha256:70a01e8ae5800f4a074b56a4cb1025c8f4f9b038bba5fe31e3c98eb996686f07"}, +] + +[package.dependencies] +jinja2 = ">=3.0.0" +pytest = ">=7.0.0" +pytest-metadata = ">=2.0.0" + +[package.extras] +docs = ["pip-tools (>=6.13.0)"] +test = ["assertpy (>=1.1)", "beautifulsoup4 (>=4.11.1)", "black (>=22.1.0)", "flake8 (>=4.0.1)", "pre-commit (>=2.17.0)", "pytest-mock (>=3.7.0)", "pytest-rerunfailures (>=11.1.2)", "pytest-xdist (>=2.4.0)", "selenium (>=4.3.0)", "tox (>=3.24.5)"] + +[[package]] +name = "pytest-metadata" +version = "3.1.1" +description = "pytest plugin for test session metadata" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_metadata-3.1.1-py3-none-any.whl", hash = "sha256:c8e0844db684ee1c798cfa38908d20d67d0463ecb6137c72e91f418558dd5f4b"}, + {file = "pytest_metadata-3.1.1.tar.gz", hash = "sha256:d2a29b0355fbc03f168aa96d41ff88b1a3b44a3b02acbe491801c98a048017c8"}, +] + +[package.dependencies] +pytest = ">=7.0.0" + +[package.extras] +test = ["black (>=22.1.0)", "flake8 (>=4.0.1)", "pre-commit (>=2.17.0)", "tox (>=3.24.5)"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] + +[package.dependencies] +pyyaml = "*" + +[[package]] +name = "rdkit" +version = "2023.9.5" +description = "A collection of chemoinformatics and machine-learning software written in C++ and Python" +optional = false +python-versions = "*" +files = [ + {file = "rdkit-2023.9.5-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cc1f623284962e5763bc0e67b1b4e9667a7bbd5e1ed22f205d2980100c2e779"}, + {file = "rdkit-2023.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:de0a7162423fe33dcb588a2048829db81bfff929a206793e83a52292fb86be0f"}, + {file = "rdkit-2023.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef0b02d12b883fa3d09b82f75db1c8baea96f4a941a84402c90a9c51243a92c5"}, + {file = "rdkit-2023.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cf95598a285bd90fb730e5dbf5cc31407ce39e39638b667961e1bc024968aa1"}, + {file = "rdkit-2023.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:2a3f1363bfeb89862e15fd3f88bea4e4d5036c469d389f2b615f30783ff7d1fd"}, + {file = "rdkit-2023.9.5-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:e7462b739d720bcb85cd0a633e5ae008ded73a38bbfa4302bea9e068a1bbe888"}, + {file = "rdkit-2023.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:80ee3cbf31f1808cd18b0e442c2a2d75de0a9837bcb1ac8009c2280e35c8018a"}, + {file = "rdkit-2023.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56cef89057a83c4392d792c5e617b5bb0c2ad35ae2d7d2fec3cd77b2af94c3a"}, + {file = "rdkit-2023.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fc360a266b83c19c7dcf85b5c67dbe4372c1e0cb0cc2580f3b3cf6af6819a98"}, + {file = "rdkit-2023.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:fcf3a4447eff8abbd405029e840f2560f1773cde585af818a74947c5fba7e10f"}, + {file = "rdkit-2023.9.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c03ddac22acaaff28f66091f8d31128c0734c1e4f97ea8cb8d85edeee3e16176"}, + {file = "rdkit-2023.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0c44d467f4a234a3682235a03825db916d35caeeaf7d2b0c73a6a5be85e0a476"}, + {file = "rdkit-2023.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04abe69371077a6daf419b6ed25c3ec86c8f858a468fb53508170467b799ef13"}, + {file = "rdkit-2023.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0620912f43019986b859d0c1a63dbf2ff339264ce796483ad7fd01bcb1fa0634"}, + {file = "rdkit-2023.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:6f1cb9e295ebe77e8e70485adc78dda35c687bc3ac2063fb88202aba11148ae3"}, + {file = "rdkit-2023.9.5-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:7b43a43fd819de90dc3c81ad10b0bb25351351b36b20e63b6af4efb3fb0f3e30"}, + {file = "rdkit-2023.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64c55039fd3861355176406c3385f5e81e17aefdfebd123e97909b63fc451dbc"}, + {file = "rdkit-2023.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6859310b7b04c0e6b46bbaf68d9137079a857ca1afe2b2c3beadfa4724515536"}, + {file = "rdkit-2023.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7bfda62f45eec82527e501ce74f08d514c22fd925bbf9631189fbff41e6280b"}, + {file = "rdkit-2023.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:7e8078d01f4bb9aa77da5ef2087df1cbae6919de5b0f90b983ef920ec8792229"}, + {file = "rdkit-2023.9.5-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:4b848fbdc44f26d817963f90389af55b294d6b9efd07f20146255443fbcf6718"}, + {file = "rdkit-2023.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:443593f5e0ab119f09c63aed00b6739f5e6c8f617a0028e1e81036784fe96e47"}, + {file = "rdkit-2023.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c267b5a6135b58c2cbd2846d61b4663b75496a883e1ccd46eb3bff1098f53bf7"}, + {file = "rdkit-2023.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a7b39f1a98505017d6dd6876a592449cf76d718f370efd00e0ca6d80479812c"}, + {file = "rdkit-2023.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:1b99cca22cad650392b25db1f8f86cae619fa62c6a710eb173d0e10faec9d2e5"}, +] + +[package.dependencies] +numpy = "*" +Pillow = "*" + +[[package]] +name = "regex" +version = "2023.12.25" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.7" +files = [ + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rich" +version = "13.7.1" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rich-click" +version = "1.7.4" +description = "Format click help output nicely with rich" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rich-click-1.7.4.tar.gz", hash = "sha256:7ce5de8e4dc0333aec946113529b3eeb349f2e5d2fafee96b9edf8ee36a01395"}, + {file = "rich_click-1.7.4-py3-none-any.whl", hash = "sha256:e363655475c60fec5a3e16a1eb618118ed79e666c365a36006b107c17c93ac4e"}, +] + +[package.dependencies] +click = ">=7" +rich = ">=10.7.0" +typing-extensions = "*" + +[package.extras] +dev = ["flake8", "flake8-docstrings", "mypy", "packaging", "pre-commit", "pytest", "pytest-cov", "types-setuptools"] + +[[package]] +name = "scipy" +version = "1.12.0" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, +] + +[package.dependencies] +numpy = ">=1.22.4,<1.29.0" + +[package.extras] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "setuptools" +version = "69.2.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.2.0-py3-none-any.whl", hash = "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c"}, + {file = "setuptools-69.2.0.tar.gz", hash = "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.4" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, + {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, +] + +[[package]] +name = "typing-extensions" +version = "4.10.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, +] + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "virtualenv" +version = "20.25.1" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.25.1-py3-none-any.whl", hash = "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a"}, + {file = "virtualenv-20.25.1.tar.gz", hash = "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "watchdog" +version = "4.0.0" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, + {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, + {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, + {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, + {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, + {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, + {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, + {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "wcmatch" +version = "8.5.1" +description = "Wildcard/glob file name matcher." +optional = false +python-versions = ">=3.8" +files = [ + {file = "wcmatch-8.5.1-py3-none-any.whl", hash = "sha256:24c19cedc92bc9c9e27f39db4e1824d72f95bd2cea32b254a47a45b1a1b227ed"}, + {file = "wcmatch-8.5.1.tar.gz", hash = "sha256:c0088c7f6426cf6bf27e530e2b7b734031905f7e490475fd83c7c5008ab581b3"}, +] + +[package.dependencies] +bracex = ">=2.1.1" + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" +files = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +] + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + +[[package]] +name = "wrapt" +version = "1.16.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] + +[[package]] +name = "zipp" +version = "3.18.1" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.9" +content-hash = "7844d73e4381c3672c2b4fe058b55d009373c474493d8e520ed60519215d590e" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..edc6197 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,264 @@ +[tool.poetry] +name = "gypsum_dl" +version = "1.0.0.post1" +description = "Convert 1D and 2D molecular representations into 3D structures." +authors = [ + "durrantlab ", +] +license = "Apache-2.0" +readme = "README.md" + +[tool.poetry.scripts] +gypsum-dl = "gypsum_dl.run:main" + +[tool.poetry.dependencies] +python = "^3.9" +loguru = "^0.7.2" +rdkit = "^2023.9.5" +numpy = "^1.26.4" +scipy = "^1.12.0" + +[tool.poetry.group.dev.dependencies] +black = "^23.9.0" +isort = "^5.12.0" +pre-commit = "^3.4.0" +pylint = "^2.17.5" +mypy = "^1.5.1" +mypy-extensions = "^1.0.0" +bump-my-version = "^0.11.0" +poetry-dynamic-versioning = "^1.1.0" + +[tool.poetry.group.test.dependencies] +pytest = "^7.4.2" +pytest-cov = "^4.1.0" +pytest-html = "^4.0.1" +coverage = "^7.3.1" +colorama = "^0.4.6" + +[tool.poetry.group.docs.dependencies] +mkdocs = "^1.5.3" +mkdocs-material = "^9.4.7" +material-plausible-plugin = "^0.2.0" +pymdown-extensions = "^10.3.1" +mkdocs-table-reader-plugin = "^2.0.3" +mkdocstrings = "^0.23.0" +mkdocstrings-python = "^1.7.3" +mkdocs-gen-files = "^0.5.0" +mkdocs-awesome-pages-plugin = "^2.9.2" + +[tool.bumpversion] +current_version = "0.0.0" +tag = true +commit = true + +[[tool.bumpversion.files]] +filename = "CHANGELOG.md" +no_regex = false +search = "\\[Unreleased\\]" +replace = "[Unreleased]\n\n## [{new_version}] - {now:%Y-%m-%d}" + +[tool.poetry-dynamic-versioning] +enable = false +vcs = "git" +format-jinja = "{%- if distance == 0 -%}{{ serialize_pep440(base) }}{%- else -%}{{ serialize_pep440(base, post=distance) }}{%- endif -%}" + +[tool.poetry-dynamic-versioning.substitution] +patterns = [ + "(^__version__\\s*(?::.*?)?=\\s*['\"])[^'\"]*(['\"])", +] + +[tool.pylint.messages_control] +good-names = [ + "i", + "j", + "e", + "ex", +] +ignore = [ + "CVS", + "conf.py", +] + +[tool.black] +target-version = [ + "py312", +] +line-length = 88 +color = true +exclude = "/(\n \\.git\n | \\.hg\n | \\.mypy_cache\n | \\.tox\n | \\.venv\n | _build\n | buck-out\n | build\n | dist\n | env\n | venv\n)/\n" + +[tool.isort] +py_version = 312 +line_length = 88 +known_typing = [ + "typing", + "types", + "typing_extensions", + "mypy", + "mypy_extensions", +] +sections = [ + "FUTURE", + "TYPING", + "STDLIB", + "THIRDPARTY", + "FIRSTPARTY", + "LOCALFOLDER", +] +profile = "black" +include_trailing_comma = true +multi_line_output = 3 +indent = 4 +color_output = true + +[tool.mypy] +python_version = "3.12" +pretty = true +show_traceback = true +color_output = true +allow_redefinition = false +check_untyped_defs = true +disallow_any_generics = true +disallow_incomplete_defs = true +ignore_missing_imports = true +implicit_reexport = false +no_implicit_optional = true +show_column_numbers = true +show_error_codes = true +show_error_context = true +strict_equality = true +strict_optional = true +warn_no_return = true +warn_redundant_casts = true +warn_return_any = true +warn_unreachable = true +warn_unused_configs = true +warn_unused_ignores = true + +[tool.pytest.ini_options] +norecursedirs = [ + "gypsum_dl", + "*.egg", + ".eggs", + "dist", + "build", + "docs", + ".tox", + ".git", + "__pycache__", +] +doctest_optionflags = [ + "NUMBER", + "NORMALIZE_WHITESPACE", + "IGNORE_EXCEPTION_DETAIL", +] +addopts = [ + "--strict-markers", + "--tb=short", + "--doctest-modules", + "--doctest-continue-on-failure", +] + +[tool.coverage.run] +source = [ + "tests", +] + +[build-system] +requires = [ + "poetry-core>=1.0.0", + "poetry-dynamic-versioning>=1.0.0,<2.0.0", +] +build-backend = "poetry_dynamic_versioning.backend" + +[coverage.paths] +source = "gypsum_dl" + +[coverage.run] +branch = true + +[coverage.report] +fail_under = 50 +show_missing = true + +["tool.poetry.group.conda.dependencies"] +appdirs = "^1.4.4" +Brotli = "^1.0.9" +build = "^1.2.1" +CacheControl = "^0.14.0" +cachy = "^0.3.0" +certifi = "^2024.2.2" +cffi = "^1.16.0" +cfgv = "^3.3.1" +charset-normalizer = "^2.0.4" +cleo = "^2.1.0" +click = "^8.1.7" +click-default-group = "^1.2.2" +clikit = "^0.6.2" +colorama = "^0.4.6" +conda_lock = "^2.5.6" +conda_poetry_liaison = "^0.1.2" +crashtest = "^0.4.1" +cryptography = "^42.0.5" +distlib = "^0.3.6" +dulwich = "^0.21.3" +ensureconda = "^1.4.4" +fastjsonschema = "^2.19.1" +filelock = "^3.13.1" +gitdb = "^4.0.7" +GitPython = "^3.1.37" +html5lib = "^1.1" +identify = "^2.5.35" +idna = "^3.4" +importlib_metadata = "^7.1.0" +installer = "^0.7.0" +"jaraco.classes" = "^3.2.1" +jeepney = "^0.7.1" +Jinja2 = "^3.1.3" +keyring = "^24.3.1" +MarkupSafe = "^2.1.3" +more-itertools = "^10.1.0" +mpi4py = "^3.1.5" +msgpack = "^1.0.3" +nodeenv = "^1.8.0" +numpy = "^1.26.4" +packaging = "^23.2" +pastel = "^0.2.1" +pexpect = "^4.9.0" +pip = "^23.3.1" +pkginfo = "^1.9.6" +platformdirs = "^3.11.0" +poetry = "^1.8.2" +poetry-core = "^1.9.0" +poetry-plugin-export = "^1.7.1" +pre_commit = "^3.7.0" +ptyprocess = "^0.7.0" +pycparser = "^2.21" +pydantic = "^2.5.3" +pydantic_core = "^2.14.6" +pylev = "^1.3.0" +pyOpenSSL = "^24.0.0" +pyproject_hooks = "^1.0.0" +PySocks = "^1.7.1" +PyYAML = "^6.0.1" +rapidfuzz = "^3.5.2" +requests = "^2.31.0" +requests-toolbelt = "^1.0.0" +"ruamel.yaml" = "^0.17.21" +SecretStorage = "^3.3.1" +setuptools = "^68.2.2" +shellingham = "^1.5.4" +six = "^1.16.0" +smmap = "^4.0.0" +tomli = "^2.0.1" +tomli_w = "^1.0.0" +tomlkit = "^0.12.4" +toolz = "^0.12.0" +trove-classifiers = "^2024.3.25" +typing_extensions = "^4.9.0" +ukkonen = "^1.0.1" +urllib3 = "^1.26.18" +virtualenv = "^20.24.1" +webencodings = "^0.5.1" +wheel = "^0.41.2" +zipp = "^3.17.0" diff --git a/run_gypsum_dl.py b/run_gypsum_dl.py deleted file mode 100755 index a77c2e3..0000000 --- a/run_gypsum_dl.py +++ /dev/null @@ -1,307 +0,0 @@ -#!/usr/bin/env python - -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -Gypsum-DL 1.2.1 is a conversion script to transform smiles strings and 2D SDFs -into 3D models. -""" - - -def print_gypsum_citation(): - """ - Print out the citation for the Gypsum-DL paper. - Because this is before the Parallelizer is initiallized it requires - limiting the print statement to the cpu ranked=0. - Without this check, in MPI mode it would print once per available cpu. - """ - - import sys - - # And always report citation information. - citation_print = ( - "\nIf you use Gypsum-DL in your research, please cite:\n\n" - + "Ropp, Patrick J., Jacob O. Spiegel, Jennifer L. Walker, Harrison Green,\n" - ) - citation_print += "Guillermo A. Morales, Katherine A. Milliken, John J. Ringe, and Jacob D. Durrant.\n" - citation_print += "(2019) Gypsum-DL: An Open-source Program for Preparing Small-molecule Libraries for \n" - citation_print += ( - "Structure-based Virtual Screening. Journal of Cheminformatics 11:1. " - ) - citation_print += "\ndoi:10.1186/s13321-019-0358-3.\n" - - try: - from mpi4py import MPI - - comm = MPI.COMM_WORLD - rank = comm.rank - if rank == 0: - print(citation_print) - except Exception: - print(citation_print) - - -# print out the citation of Gypsum-DL paper. -print_gypsum_citation() - -import argparse -import copy -from gypsum_dl.Start import prepare_molecules -from gypsum_dl.Test.Tester import run_test -from gypsum_dl import Utils - -PARSER = argparse.ArgumentParser( - formatter_class=argparse.RawDescriptionHelpFormatter, - description=""" -Gypsum-DL 1.2.1, a free, open-source program for preparing 3D small-molecule -models. Beyond simply assigning atomic coordinates, Gypsum-DL accounts for -alternate ionization, tautomeric, chiral, cis/trans isomeric, and -ring-conformational forms.""", - epilog=""" -EXAMPLES OF USE: - -1. Prepare a virtual library and save all 3D models to a single SDF file in the - present directory: - -python run_gypsum_dl.py --source ./examples/sample_molecules.smi - -2. Instead save all 3D models to a different, existing folder: - -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ - --output_folder /my/folder/ - -3. Additionally save the models associated with each input molecule to - separate files: - -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ - --output_folder /my/folder/ --separate_output_files - -4. In addition to saving a 3D SDF file, also save 3D PDB files and an HTML file - with 2D structures (for debugging). - -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ - --output_folder /my/folder/ --add_pdb_output --add_html_output - -5. Save at most two variants per input molecule: - -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ - --output_folder /my/folder/ --max_variants_per_compound 2 - -6. Control how Gypsum-DL ionizes the input molecules: - -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ - --output_folder /my/folder/ --min_ph 12 --max_ph 14 --pka_precision 1 - -7. Run Gypsum-DL in serial mode (using only one processor): - -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ - --job_manager serial - -8. Run Gypsum-DL in multiprocessing mode, using 4 processors: - -python run_gypsum_dl.py --source ./examples/sample_molecules.smi \\ - --job_manager multiprocessing --num_processors 4 - -9. Run Gypsum-DL in mpi mode using all available processors: - -mpirun -n $NTASKS python -m mpi4py run_gypsum_dl.py \\ - --source ./examples/sample_molecules.smi \\ - --job_manager mpi --num_processors -1 - -10. Gypsum-DL can also take parameters from a JSON file: - -python run_gypsum_dl.py --json myparams.json - -Where myparams.json might look like: - -{ - "source": "./examples/sample_molecules.smi", - "separate_output_files": true, - "job_manager": "multiprocessing", - "output_folder": "/my/folder/", - "add_pdb_output": true, - "add_html_output": true, - "num_processors": -1 -} -""", -) - -PARSER.add_argument( - "--json", - "-j", - type=str, - metavar="param.json", - help="Name of a json file containing all parameters. \ - Overrides all other arguments specified at the commandline.", -) -PARSER.add_argument( - "--source", - "-s", - type=str, - metavar="input.smi", - help="Name of the source file (e.g., input.smi). Note: support for SMI (SMILES) files is better than support for SDF files, though Gypsum-DL can handle both.", -) -PARSER.add_argument( - "--output_folder", - "-o", - type=str, - help="The path to an existing folder where the Gypsum-DL " - + "output file(s) will be saved.", -) -PARSER.add_argument( - "--job_manager", - type=str, - default="multiprocessing", - choices=["mpi", "multiprocessing", "serial"], - help="Determine what style of multiprocessing to use: mpi, \ - multiprocessing, or serial. Serial will override the \ - num_processors flag, forcing it to be one. MPI mode \ - requires mpi4py 2.1.0 or higher and should be executed \ - as: mpirun -n $NTASKS python -m mpi4py run_gypsum_dl.py \ - ...-settings...", -) -PARSER.add_argument( - "--num_processors", - "-p", - type=int, - metavar="N", - default=1, - help="Number of processors to use for parallel \ - calculations.", -) -PARSER.add_argument( - "--max_variants_per_compound", - "-m", - type=int, - metavar="V", - help="The maximum number of variants to create per input \ - molecule.", -) -PARSER.add_argument( - "--thoroughness", - "-t", - type=int, - help="How widely to search for low-energy conformers. \ - Larger values increase run times but can produce better \ - results.", -) -PARSER.add_argument( - "--separate_output_files", - action="store_true", - help="Indicates that the outputs should be split between \ - files. If true, each output .sdf file will correspond to a \ - single input file, but different 3D conformers will still \ - be stored in the same file.", -) -PARSER.add_argument( - "--add_pdb_output", - action="store_true", - help="Indicates that the outputs should also be written in \ - the .pdb format. Creates one PDB file for each molecular \ - variant.", -) -PARSER.add_argument( - "--add_html_output", - action="store_true", - help="Indicates that the outputs should also be written in \ - the .html format, for debugging. Attempts to open a \ - browser for viewing.", -) -PARSER.add_argument( - "--min_ph", metavar="MIN", type=float, help="Minimum pH to consider." -) -PARSER.add_argument( - "--max_ph", metavar="MAX", type=float, help="Maximum pH to consider." -) -PARSER.add_argument( - "--pka_precision", - metavar="D", - type=float, - help="Size of pH substructure ranges. See Dimorphite-DL \ - publication for details.", -) -PARSER.add_argument( - "--skip_optimize_geometry", action="store_true", help="Skips the optimization step." -) -PARSER.add_argument( - "--skip_alternate_ring_conformations", - action="store_true", - help="Skips the non-aromatic ring-conformation \ - generation step.", -) -PARSER.add_argument( - "--skip_adding_hydrogen", action="store_true", help="Skips the ionization step." -) -PARSER.add_argument( - "--skip_making_tautomers", - action="store_true", - help="Skips tautomer-generation step.", -) -PARSER.add_argument( - "--skip_enumerate_chiral_mol", - action="store_true", - help="Skips the ennumeration of unspecified chiral \ - centers.", -) -PARSER.add_argument( - "--skip_enumerate_double_bonds", - action="store_true", - help="Skips the ennumeration of double bonds.", -) - -PARSER.add_argument( - "--let_tautomers_change_chirality", - action="store_true", - help="Allow tautomers that change \ - the total number of chiral centers (see README.md for \ - further explanation).", -) - -PARSER.add_argument( - "--use_durrant_lab_filters", - action="store_true", - help="Use substructure filters to \ - remove molecular variants that, though technically \ - possible, were judged improbable by members of the \ - Durrant lab. See README.md for more details.", -) - -PARSER.add_argument( - "--2d_output_only", action="store_true", help="Skips the generate-3D-models step." -) -PARSER.add_argument( - "--cache_prerun", - "-c", - action="store_true", - help="Run this before running Gypsum-DL in mpi mode.", -) -PARSER.add_argument( - "--test", action="store_true", help="Tests Gypsum-DL to check for programming bugs." -) - -ARGS_DICT = vars(PARSER.parse_args()) -if ARGS_DICT["test"] == True: - run_test() -elif ARGS_DICT["cache_prerun"] == False: - - INPUTS = copy.deepcopy(ARGS_DICT) - - for k, v in ARGS_DICT.items(): - if v is None: - del INPUTS[k] - prepare_molecules(INPUTS) - Utils.log("Finished Gypsum-DL") -else: - pass diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..95f3971 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,12 @@ +import os + +import pytest + +from gypsum_dl import enable_logging + +TEST_DIR = os.path.dirname(__file__) + + +@pytest.fixture(scope="session", autouse=True) +def turn_on_logging(): + enable_logging(10) diff --git a/tests/test_example.py b/tests/test_example.py new file mode 100644 index 0000000..04ca121 --- /dev/null +++ b/tests/test_example.py @@ -0,0 +1,2 @@ +def test_example(): + pass From cfec0d658d66f495708a04aea17a5bb8ab40c4f8 Mon Sep 17 00:00:00 2001 From: Alex Maldonado Date: Tue, 30 Apr 2024 15:32:59 -0400 Subject: [PATCH 2/3] Add mkdocs yaml --- mkdocs.yml | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 mkdocs.yml diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..9ac0aaa --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,137 @@ +docs_dir: docs + +site_name: gypsum_dl +site_author: Durrant Lab + +# Git host +repo_name: durrantlab/gypsum_dl +repo_url: https://github.com/durrantlab/gypsum_dl + +# https://squidfunk.github.io/mkdocs-material/ +theme: + name: material + custom_dir: docs/.overrides + language: en + palette: + # Palette toggle for light mode + - scheme: default + toggle: + icon: material/lightbulb-outline + name: Switch to dark mode + + # Palette toggle for dark mode + - scheme: dark + toggle: + icon: material/lightbulb + name: Switch to light mode + font: + text: Roboto + code: Roboto Mono + icon: + repo: fontawesome/brands/github + annotation: material/star-four-points-circle + features: + - content.code.annotate + - content.code.copy + - content.code.select + - navigation.instant + - navigation.instant.prefetch + - navigation.instant.progress + - navigation.tabs + - navigation.tabs.sticky + - navigation.tracking + - navigation.top + - navigation.indexes + - navigation.path + - navigation.prune + - toc.follow + - search.suggest + +validation: + omitted_files: warn + absolute_links: warn + unrecognized_links: warn + +# Options need to be indented twice for some reason? +plugins: + - search + - autorefs + - material-plausible + - table-reader + - gen-files: + scripts: + - docs/gen_ref_pages.py + - mkdocstrings: + handlers: + python: + paths: ["gypsum_dl"] + options: + annotations_path: brief + docstring_style: google + docstring_section_style: list + show_if_no_docstring: true + show_docstring_yields: true + show_docstring_examples: true + show_docstring_raises: true + show_root_toc_entry: true + show_root_full_path: true + show_object_full_path: false + show_symbol_type_heading: true + show_symbol_type_toc: true + show_root_members_full_path: true + show_source: false + line_length: 88 + - awesome-pages: + collapse_single_pages: true + strict: false + order: asc + sort_type: natural + order_by: title + +extra: + generator: false + +extra_css: + - css/base.css + - css/colors.css + - css/mkdocstrings.css + +extra_javascript: + - js/mathjax.js + - https://polyfill.io/v3/polyfill.min.js?features=es6 + - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js + +markdown_extensions: + - abbr + - toc: + permalink: true + - admonition + - attr_list + - def_list + - footnotes + - md_in_html + - tables + - pymdownx.arithmatex: + generic: true + - pymdownx.betterem + - pymdownx.caret + - pymdownx.details + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.keys + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.snippets + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + - pymdownx.tabbed: + alternate_style: true + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.tilde From e6199fc1a97b802ef5d3902ef0909af577b38bc4 Mon Sep 17 00:00:00 2001 From: Alex Maldonado Date: Tue, 30 Apr 2024 15:33:31 -0400 Subject: [PATCH 3/3] Start major refactor --- gypsum_dl/ChemUtils.py | 25 ++------------ gypsum_dl/MolContainer.py | 19 ++--------- gypsum_dl/MolObjectHandling.py | 15 --------- gypsum_dl/MyMol.py | 21 ++---------- gypsum_dl/Steps/IO/LoadFiles.py | 19 +---------- gypsum_dl/Steps/IO/ProcessOutput.py | 14 -------- gypsum_dl/Steps/IO/SaveToPDB.py | 14 -------- gypsum_dl/Steps/IO/SaveToSDF.py | 16 +-------- gypsum_dl/Steps/IO/Web2DOutput.py | 16 +-------- gypsum_dl/Steps/IO/__init__.py | 15 --------- gypsum_dl/Steps/SMILES/AddHydrogens.py | 16 +-------- gypsum_dl/Steps/SMILES/DeSaltOrigSmiles.py | 16 +-------- gypsum_dl/Steps/SMILES/DurrantLabFilter.py | 16 +-------- gypsum_dl/Steps/SMILES/EnumerateChiralMols.py | 16 +-------- .../Steps/SMILES/EnumerateDoubleBonds.py | 20 ++--------- gypsum_dl/Steps/SMILES/MakeTautomers.py | 20 ++--------- gypsum_dl/Steps/SMILES/PrepareSmiles.py | 14 -------- gypsum_dl/Steps/SMILES/__init__.py | 15 --------- gypsum_dl/Steps/ThreeD/Convert2DTo3D.py | 23 ++----------- ...GenerateAlternate3DNonaromaticRingConfs.py | 16 +-------- gypsum_dl/Steps/ThreeD/Minimize3D.py | 16 +-------- gypsum_dl/Steps/ThreeD/PrepareThreeD.py | 14 -------- gypsum_dl/Steps/ThreeD/__init__.py | 15 --------- gypsum_dl/Steps/__init__.py | 15 --------- gypsum_dl/Test/Tester.py | 14 -------- gypsum_dl/__init__.py | 15 --------- .../{Parallelizer.py => parallelizer.py} | 16 --------- gypsum_dl/run.py | 18 ++-------- gypsum_dl/{Start.py => start.py} | 20 ++--------- gypsum_dl/{Utils.py => utils.py} | 33 ++++--------------- 30 files changed, 34 insertions(+), 488 deletions(-) rename gypsum_dl/{Parallelizer.py => parallelizer.py} (98%) rename gypsum_dl/{Start.py => start.py} (96%) rename gypsum_dl/{Utils.py => utils.py} (85%) diff --git a/gypsum_dl/ChemUtils.py b/gypsum_dl/ChemUtils.py index 54b3282..69a126a 100755 --- a/gypsum_dl/ChemUtils.py +++ b/gypsum_dl/ChemUtils.py @@ -1,30 +1,11 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. +"""The module includes definitions to manipulate the molecules.""" -""" -The module includes definitions to manipulate the molecules. -""" - -import __future__ - -import gypsum_dl.Utils as Utils +from . import utils as Utils try: from rdkit import Chem - from rdkit.Chem import AllChem -except Exception: +except ImportError: Utils.exception("You need to install rdkit and its dependencies.") diff --git a/gypsum_dl/MolContainer.py b/gypsum_dl/MolContainer.py index 31c473c..d29d5e3 100755 --- a/gypsum_dl/MolContainer.py +++ b/gypsum_dl/MolContainer.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - """ This module describes the MolContainer, which contains different MyMol.MyMol objects. Each object in this container is derived from the same input molecule @@ -22,11 +8,10 @@ """ -import __future__ - import gypsum_dl.ChemUtils as ChemUtils import gypsum_dl.MyMol as MyMol -import gypsum_dl.Utils as Utils + +from . import utils as Utils try: from rdkit import Chem diff --git a/gypsum_dl/MolObjectHandling.py b/gypsum_dl/MolObjectHandling.py index b4affd6..3ae10ca 100755 --- a/gypsum_dl/MolObjectHandling.py +++ b/gypsum_dl/MolObjectHandling.py @@ -1,19 +1,4 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - ##### MolObjectHandling.py -import __future__ import rdkit diff --git a/gypsum_dl/MyMol.py b/gypsum_dl/MyMol.py index d669be2..10c7d0e 100755 --- a/gypsum_dl/MyMol.py +++ b/gypsum_dl/MyMol.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - """ This module contains classes and functions for processing individual molecules (variants). All variants of the same input molecule are grouped together in @@ -22,20 +8,17 @@ MyMol.MyConformer """ - -import __future__ - import contextlib import copy import operator -import random import sys # Disable the unnecessary RDKit warnings from rdkit import RDLogger import gypsum_dl.MolObjectHandling as MOH -import gypsum_dl.Utils as Utils + +from . import utils as Utils RDLogger.DisableLog("rdApp.*") diff --git a/gypsum_dl/Steps/IO/LoadFiles.py b/gypsum_dl/Steps/IO/LoadFiles.py index 7f5f56a..99eb25a 100755 --- a/gypsum_dl/Steps/IO/LoadFiles.py +++ b/gypsum_dl/Steps/IO/LoadFiles.py @@ -1,25 +1,8 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - """ A module for loading in files. """ - -import __future__ - -from gypsum_dl import Utils +from . import utils as Utils try: from rdkit import Chem diff --git a/gypsum_dl/Steps/IO/ProcessOutput.py b/gypsum_dl/Steps/IO/ProcessOutput.py index cb2083e..8b5825a 100755 --- a/gypsum_dl/Steps/IO/ProcessOutput.py +++ b/gypsum_dl/Steps/IO/ProcessOutput.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - """ The proccess_output definition determines which formats are saved to the disk (output). diff --git a/gypsum_dl/Steps/IO/SaveToPDB.py b/gypsum_dl/Steps/IO/SaveToPDB.py index b8d4c51..201fe68 100644 --- a/gypsum_dl/Steps/IO/SaveToPDB.py +++ b/gypsum_dl/Steps/IO/SaveToPDB.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - """ Contains the function for saving the output to PDB files. """ diff --git a/gypsum_dl/Steps/IO/SaveToSDF.py b/gypsum_dl/Steps/IO/SaveToSDF.py index 31b3cf9..1fd9741 100755 --- a/gypsum_dl/Steps/IO/SaveToSDF.py +++ b/gypsum_dl/Steps/IO/SaveToSDF.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - """ Saves output files to SDF. """ @@ -21,7 +7,7 @@ import os -import gypsum_dl.Utils as Utils +import gypsum_dl.utils as Utils try: from rdkit import Chem diff --git a/gypsum_dl/Steps/IO/Web2DOutput.py b/gypsum_dl/Steps/IO/Web2DOutput.py index 5c6f500..d163eec 100755 --- a/gypsum_dl/Steps/IO/Web2DOutput.py +++ b/gypsum_dl/Steps/IO/Web2DOutput.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - """ Saves the output to an HTML file (2D images only). This is mostly for debugging. @@ -22,7 +8,7 @@ import os import gypsum_dl.ChemUtils as ChemUtils -import gypsum_dl.Utils as Utils +import gypsum_dl.utils as Utils try: from rdkit import Chem diff --git a/gypsum_dl/Steps/IO/__init__.py b/gypsum_dl/Steps/IO/__init__.py index 2a1d820..07ad7ba 100755 --- a/gypsum_dl/Steps/IO/__init__.py +++ b/gypsum_dl/Steps/IO/__init__.py @@ -1,18 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - import os # gypsum_dl/gypsum_dl/Steps/IO/ diff --git a/gypsum_dl/Steps/SMILES/AddHydrogens.py b/gypsum_dl/Steps/SMILES/AddHydrogens.py index ef37091..dfaa61e 100755 --- a/gypsum_dl/Steps/SMILES/AddHydrogens.py +++ b/gypsum_dl/Steps/SMILES/AddHydrogens.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - """ This module identifies and enumerates the possible protonation sites of molecules. @@ -23,7 +9,7 @@ import gypsum_dl.MolContainer as MolCont import gypsum_dl.MyMol as MyMol import gypsum_dl.Parallelizer as Parallelizer -import gypsum_dl.Utils as Utils +import gypsum_dl.utils as Utils from gypsum_dl.Steps.SMILES.dimorphite_dl.dimorphite_dl import Protonate diff --git a/gypsum_dl/Steps/SMILES/DeSaltOrigSmiles.py b/gypsum_dl/Steps/SMILES/DeSaltOrigSmiles.py index b53e396..b7892f0 100755 --- a/gypsum_dl/Steps/SMILES/DeSaltOrigSmiles.py +++ b/gypsum_dl/Steps/SMILES/DeSaltOrigSmiles.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - """ Desalts the input SMILES strings. If an input SMILES string contains to molecule, keep the larger one. @@ -23,7 +9,7 @@ import gypsum_dl.ChemUtils as ChemUtils import gypsum_dl.MyMol as MyMol import gypsum_dl.Parallelizer as Parallelizer -import gypsum_dl.Utils as Utils +import gypsum_dl.utils as Utils try: from rdkit import Chem diff --git a/gypsum_dl/Steps/SMILES/DurrantLabFilter.py b/gypsum_dl/Steps/SMILES/DurrantLabFilter.py index edfd7e3..f2a1857 100755 --- a/gypsum_dl/Steps/SMILES/DurrantLabFilter.py +++ b/gypsum_dl/Steps/SMILES/DurrantLabFilter.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - """ This module removes molecules with prohibited substructures, per Durrant-lab filters. @@ -22,7 +8,7 @@ import gypsum_dl.ChemUtils as ChemUtils import gypsum_dl.Parallelizer as Parallelizer -import gypsum_dl.Utils as Utils +import gypsum_dl.utils as Utils try: from rdkit import Chem diff --git a/gypsum_dl/Steps/SMILES/EnumerateChiralMols.py b/gypsum_dl/Steps/SMILES/EnumerateChiralMols.py index 1f92a0f..18770c7 100755 --- a/gypsum_dl/Steps/SMILES/EnumerateChiralMols.py +++ b/gypsum_dl/Steps/SMILES/EnumerateChiralMols.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - """ A module for generating alternate chiralities. """ @@ -26,7 +12,7 @@ import gypsum_dl.ChemUtils as ChemUtils import gypsum_dl.MyMol as MyMol import gypsum_dl.Parallelizer as Parallelizer -import gypsum_dl.Utils as Utils +import gypsum_dl.utils as Utils try: from rdkit import Chem diff --git a/gypsum_dl/Steps/SMILES/EnumerateDoubleBonds.py b/gypsum_dl/Steps/SMILES/EnumerateDoubleBonds.py index a52bdfd..ba2c651 100755 --- a/gypsum_dl/Steps/SMILES/EnumerateDoubleBonds.py +++ b/gypsum_dl/Steps/SMILES/EnumerateDoubleBonds.py @@ -1,20 +1,4 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - -""" -Module for enumerating unspecified double bonds (cis vs. trans). -""" +"""Module for enumerating unspecified double bonds (cis vs. trans).""" import __future__ @@ -27,7 +11,7 @@ import gypsum_dl.ChemUtils as ChemUtils import gypsum_dl.MyMol as MyMol import gypsum_dl.Parallelizer as Parallelizer -import gypsum_dl.Utils as Utils +import gypsum_dl.utils as Utils try: from rdkit import Chem diff --git a/gypsum_dl/Steps/SMILES/MakeTautomers.py b/gypsum_dl/Steps/SMILES/MakeTautomers.py index f4e11be..cf8ef8d 100755 --- a/gypsum_dl/Steps/SMILES/MakeTautomers.py +++ b/gypsum_dl/Steps/SMILES/MakeTautomers.py @@ -1,20 +1,4 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - -""" -This module makes alternate tautomeric states, using MolVS. -""" +"""This module makes alternate tautomeric states, using MolVS.""" import __future__ @@ -25,7 +9,7 @@ import gypsum_dl.MolObjectHandling as MOH import gypsum_dl.MyMol as MyMol import gypsum_dl.Parallelizer as Parallelizer -import gypsum_dl.Utils as Utils +import gypsum_dl.utils as Utils try: from rdkit import Chem diff --git a/gypsum_dl/Steps/SMILES/PrepareSmiles.py b/gypsum_dl/Steps/SMILES/PrepareSmiles.py index b2fa23a..27a9c37 100755 --- a/gypsum_dl/Steps/SMILES/PrepareSmiles.py +++ b/gypsum_dl/Steps/SMILES/PrepareSmiles.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - """ Runs the smile preparation process. Generates alternate ionization, tautomeric, chiral forms, etc. diff --git a/gypsum_dl/Steps/SMILES/__init__.py b/gypsum_dl/Steps/SMILES/__init__.py index ead4b12..c92ba7c 100755 --- a/gypsum_dl/Steps/SMILES/__init__.py +++ b/gypsum_dl/Steps/SMILES/__init__.py @@ -1,18 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - import os # gypsum_dl/gypsum_dl/Steps/SMILES/ diff --git a/gypsum_dl/Steps/ThreeD/Convert2DTo3D.py b/gypsum_dl/Steps/ThreeD/Convert2DTo3D.py index 4c5e9e9..c0fba28 100755 --- a/gypsum_dl/Steps/ThreeD/Convert2DTo3D.py +++ b/gypsum_dl/Steps/ThreeD/Convert2DTo3D.py @@ -1,30 +1,13 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - """ A module to so the 2D to 3D conversion, though the actual code for that conversion is in MyMol.MyMol.make_first_3d_conf_no_min() """ -import __future__ - -import copy - import gypsum_dl.ChemUtils as ChemUtils -import gypsum_dl.Parallelizer as Parallelizer -import gypsum_dl.Utils as Utils +import gypsum_dl.utils as Utils + +from ... import parallelizer as Parallelizer try: from rdkit import Chem diff --git a/gypsum_dl/Steps/ThreeD/GenerateAlternate3DNonaromaticRingConfs.py b/gypsum_dl/Steps/ThreeD/GenerateAlternate3DNonaromaticRingConfs.py index 543e3a9..676dc0b 100755 --- a/gypsum_dl/Steps/ThreeD/GenerateAlternate3DNonaromaticRingConfs.py +++ b/gypsum_dl/Steps/ThreeD/GenerateAlternate3DNonaromaticRingConfs.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - """ This module generates alternate non-aromatic ring conformations on the fly, since most modern docking programs (e.g., Vina) can't consider alternate ring @@ -26,7 +12,7 @@ import gypsum_dl.ChemUtils as ChemUtils import gypsum_dl.Parallelizer as Parallelizer -import gypsum_dl.Utils as Utils +import gypsum_dl.utils as Utils from gypsum_dl.MyMol import MyConformer try: diff --git a/gypsum_dl/Steps/ThreeD/Minimize3D.py b/gypsum_dl/Steps/ThreeD/Minimize3D.py index ce96a31..1eaff9d 100755 --- a/gypsum_dl/Steps/ThreeD/Minimize3D.py +++ b/gypsum_dl/Steps/ThreeD/Minimize3D.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - """ This module performs a final 3D minimization to improve the small-molecule geometry. @@ -22,7 +8,7 @@ import copy import gypsum_dl.ChemUtils as ChemUtils -import gypsum_dl.Utils as Utils +import gypsum_dl.utils as Utils from gypsum_dl.MyMol import MyConformer diff --git a/gypsum_dl/Steps/ThreeD/PrepareThreeD.py b/gypsum_dl/Steps/ThreeD/PrepareThreeD.py index 183d84a..33917b2 100755 --- a/gypsum_dl/Steps/ThreeD/PrepareThreeD.py +++ b/gypsum_dl/Steps/ThreeD/PrepareThreeD.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - """ Runs the 3D preparation process. """ diff --git a/gypsum_dl/Steps/ThreeD/__init__.py b/gypsum_dl/Steps/ThreeD/__init__.py index 917e5e6..2cde320 100755 --- a/gypsum_dl/Steps/ThreeD/__init__.py +++ b/gypsum_dl/Steps/ThreeD/__init__.py @@ -1,18 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - - import os # gypsum_dl/gypsum_dl/Steps/ThreeD diff --git a/gypsum_dl/Steps/__init__.py b/gypsum_dl/Steps/__init__.py index 7127866..59d06b5 100755 --- a/gypsum_dl/Steps/__init__.py +++ b/gypsum_dl/Steps/__init__.py @@ -1,18 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - - import os # gypsum_dl/gypsum_dl/Steps/ThreeD diff --git a/gypsum_dl/Test/Tester.py b/gypsum_dl/Test/Tester.py index c8965e4..5b7223a 100644 --- a/gypsum_dl/Test/Tester.py +++ b/gypsum_dl/Test/Tester.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - """ This module is for testing Gypsum-DL. Not quite unit tests, but good enough for now. diff --git a/gypsum_dl/__init__.py b/gypsum_dl/__init__.py index 4a7f90f..17aa753 100755 --- a/gypsum_dl/__init__.py +++ b/gypsum_dl/__init__.py @@ -1,18 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - import os # gypsum_dl/gypsum_dl/ diff --git a/gypsum_dl/Parallelizer.py b/gypsum_dl/parallelizer.py similarity index 98% rename from gypsum_dl/Parallelizer.py rename to gypsum_dl/parallelizer.py index c5c2787..d85ac4e 100755 --- a/gypsum_dl/Parallelizer.py +++ b/gypsum_dl/parallelizer.py @@ -1,17 +1,3 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - """ Parallelizer.py @@ -28,8 +14,6 @@ """ -import __future__ - import multiprocessing import sys diff --git a/gypsum_dl/run.py b/gypsum_dl/run.py index c55949e..cbc10c3 100755 --- a/gypsum_dl/run.py +++ b/gypsum_dl/run.py @@ -1,22 +1,8 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - import argparse import copy -from . import Utils -from .Start import prepare_molecules +from . import utils as Utils +from .start import prepare_molecules from .Test.Tester import run_test diff --git a/gypsum_dl/Start.py b/gypsum_dl/start.py similarity index 96% rename from gypsum_dl/Start.py rename to gypsum_dl/start.py index afa72e7..3e9bfbc 100755 --- a/gypsum_dl/Start.py +++ b/gypsum_dl/start.py @@ -1,32 +1,16 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - """ Contains the prepare_molecules definition which reads, prepares, and writes small molecules. """ -import __future__ - import json import os import sys from collections import OrderedDict from datetime import datetime -import gypsum_dl.Utils as Utils -from gypsum_dl.Parallelizer import Parallelizer, flatten_list +from . import utils as Utils +from .parallelizer import Parallelizer try: from rdkit import Chem diff --git a/gypsum_dl/Utils.py b/gypsum_dl/utils.py similarity index 85% rename from gypsum_dl/Utils.py rename to gypsum_dl/utils.py index f7beb8a..2b2a468 100755 --- a/gypsum_dl/Utils.py +++ b/gypsum_dl/utils.py @@ -1,28 +1,8 @@ -# Copyright 2023 Jacob D. Durrant -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - -""" -Some helpful utility definitions used throughout the code. -""" - - -import __future__ +"""Some helpful utility definitions used throughout the code.""" import contextlib import random import string -import subprocess import textwrap @@ -32,11 +12,12 @@ def group_mols_by_container_index(mol_lst): a dictionary, where they keys are the contnr_idx values themselves. - :param mol_lst: The list of MyMol.MyMol objects. - :type mol_lst: list - :return: A dictionary, where keys are contnr_idx values and values are - lists of MyMol.MyMol objects - :rtype: dict + Args: + mol_lst: The list of MyMol.MyMol objects. + + Returns: + A dictionary, where keys are `contnr_idx` values and values are lists of + MyMol.MyMol objects """ # Make the dictionary.