diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index 72418f77..fab41575 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -4,42 +4,50 @@ on: push: branches: [ master ] paths: - - '.github/workflows/pytest.yml' - - 'morphct/**' + - morphct/** + - environment.yml + - .github/workflows/pytest.yml pull_request: branches: [ master ] paths: - - '.github/workflows/pytest.yml' - - 'morphct/**' - # Allows workflow to be manually triggered + - morphct/** + - environment.yml + - .github/workflows/pytest.yml + workflow_dispatch: jobs: pytest: - runs-on: ubuntu-latest + if: github.event.pull_request.draft == false + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + python-version: ['3.7'] + + runs-on: ${{ matrix.os }} steps: - name: Check out repository - uses: actions/checkout@v2 - + uses: actions/checkout@v4 + - name: Build environment - uses: conda-incubator/setup-miniconda@v2 + uses: mamba-org/setup-micromamba@v2 with: environment-file: environment.yml - miniforge-variant: Mambaforge - miniforge-version: 4.9.2-4 - use-mamba: true + create-args: >- + python=${{ matrix.python-version }} - name: Install package shell: bash -l {0} - run: pip install . + run: python -m build && pip install dist/*.whl - name: Run pytest with coverage report shell: bash -l {0} - run: python -m pytest --cov=./ --cov-report=xml -v + run: python -m pytest -rs -v --cov=./ --cov-report=xml - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 + uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} file: ./coverage.xml diff --git a/environment.yml b/environment.yml index c0e40cb3..306ec8a5 100644 --- a/environment.yml +++ b/environment.yml @@ -5,20 +5,20 @@ channels: dependencies: - blas=*=openblas - cython=0.29 -- ele=0.2.0 -- freud=2.6.2 -- gsd=2.4.2 -- h5py=2.10 -- hdf5=1.10 +- ele +- freud +- gsd +- h5py<3.0 +- hdf5 - libcint=4 -- matplotlib=3.4.2 -- numpy=1.21 -- openbabel=3.1.1 -- pip=21.0.1 -- pyscf=1.7.6 +- matplotlib +- numpy +- openbabel +- pip +- pyscf<2.0 - python=3.7 -- scipy=1.7 -- signac=1.6.0 -- signac-flow=0.13.0 +- scipy - pytest - pytest-cov +- pip: + - build diff --git a/morphct/__init__.py b/morphct/__init__.py index f88d2648..2e1e5958 100644 --- a/morphct/__init__.py +++ b/morphct/__init__.py @@ -1,17 +1,23 @@ from morphct.chromophores import Chromophore from morphct.mobility_kmc import Carrier -from morphct.__version__ import __version__ -from morphct import (chromophores, execute_qcc, helper_functions, kmc_analyze, - mobility_kmc, transfer_integrals) +from morphct import ( + chromophores, + execute_qcc, + helper_functions, + kmc_analyze, + mobility_kmc, + transfer_integrals +) __all__ = [ - "__version__", - "Chromophore", - "Carrier", - "chromophores", - "execute_qcc", - "helper_functions", - "kmc_analyze", - "mobility_kmc", - "transfer_integrals", - ] + "Chromophore", + "Carrier", + "chromophores", + "execute_qcc", + "helper_functions", + "kmc_analyze", + "mobility_kmc", + "transfer_integrals", +] + +__version__ = "0.5.1" diff --git a/morphct/__version__.py b/morphct/__version__.py deleted file mode 100644 index dd9b22cc..00000000 --- a/morphct/__version__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "0.5.1" diff --git a/morphct/chromophores.py b/morphct/chromophores.py index 2e8b5781..3b9e3085 100644 --- a/morphct/chromophores.py +++ b/morphct/chromophores.py @@ -5,7 +5,7 @@ import sys from warnings import warn -import ele +from ele import element_from_symbol import freud from openbabel import openbabel from openbabel import pybel @@ -229,7 +229,7 @@ def get_chromo_ids_smiles(snap, smarts_str, conversion_dict=None): if conversion_dict is not None: element = conversion_dict[snap.particles.types[typeid]] else: - element = ele.element_from_symbol(snap.particles.types[typeid]) + element = element_from_symbol(snap.particles.types[typeid]) a.SetAtomicNum(element.atomic_number) a.SetVector(*[float(x) for x in unwrapped_positions[i]]) @@ -335,90 +335,90 @@ def set_neighbors_voronoi(chromo_list, snap, conversion_dict=None, d_cut=10): conversion_dict = { - "S1": ele.element_from_symbol("S"), - "H1": ele.element_from_symbol("H"), - "C5": ele.element_from_symbol("C"), - "C1": ele.element_from_symbol("C"), - "C4": ele.element_from_symbol("C"), - "C6": ele.element_from_symbol("C"), - "C8": ele.element_from_symbol("C"), - "C9": ele.element_from_symbol("C"), - "C3": ele.element_from_symbol("C"), - "C7": ele.element_from_symbol("C"), - "C2": ele.element_from_symbol("C"), - "C10": ele.element_from_symbol("C"), + "S1": element_from_symbol("S"), + "H1": element_from_symbol("H"), + "C5": element_from_symbol("C"), + "C1": element_from_symbol("C"), + "C4": element_from_symbol("C"), + "C6": element_from_symbol("C"), + "C8": element_from_symbol("C"), + "C9": element_from_symbol("C"), + "C3": element_from_symbol("C"), + "C7": element_from_symbol("C"), + "C2": element_from_symbol("C"), + "C10":element_from_symbol("C"), } amber_dict = { - "c": ele.element_from_symbol("C"), - "c1": ele.element_from_symbol("C"), - "c2": ele.element_from_symbol("C"), - "c3": ele.element_from_symbol("C"), - "ca": ele.element_from_symbol("C"), - "cp": ele.element_from_symbol("C"), - "cq": ele.element_from_symbol("C"), - "cc": ele.element_from_symbol("C"), - "cd": ele.element_from_symbol("C"), - "ce": ele.element_from_symbol("C"), - "cf": ele.element_from_symbol("C"), - "cg": ele.element_from_symbol("C"), - "ch": ele.element_from_symbol("C"), - "cx": ele.element_from_symbol("C"), - "cy": ele.element_from_symbol("C"), - "cu": ele.element_from_symbol("C"), - "cv": ele.element_from_symbol("C"), - "h1": ele.element_from_symbol("H"), - "h2": ele.element_from_symbol("H"), - "h3": ele.element_from_symbol("H"), - "h4": ele.element_from_symbol("H"), - "h5": ele.element_from_symbol("H"), - "ha": ele.element_from_symbol("H"), - "hc": ele.element_from_symbol("H"), - "hn": ele.element_from_symbol("H"), - "ho": ele.element_from_symbol("H"), - "hp": ele.element_from_symbol("H"), - "hs": ele.element_from_symbol("H"), - "hw": ele.element_from_symbol("H"), - "hx": ele.element_from_symbol("H"), - "f": ele.element_from_symbol("F"), - "cl": ele.element_from_symbol("Cl"), - "br": ele.element_from_symbol("Br"), - "i": ele.element_from_symbol("I"), - "n": ele.element_from_symbol("N"), - "n1": ele.element_from_symbol("N"), - "n2": ele.element_from_symbol("N"), - "n3": ele.element_from_symbol("N"), - "n4": ele.element_from_symbol("N"), - "na": ele.element_from_symbol("N"), - "nb": ele.element_from_symbol("N"), - "nc": ele.element_from_symbol("N"), - "nd": ele.element_from_symbol("N"), - "ne": ele.element_from_symbol("N"), - "nf": ele.element_from_symbol("N"), - "nh": ele.element_from_symbol("N"), - "no": ele.element_from_symbol("N"), - "o": ele.element_from_symbol("O"), - "oh": ele.element_from_symbol("O"), - "os": ele.element_from_symbol("O"), - "ow": ele.element_from_symbol("O"), - "p2": ele.element_from_symbol("P"), - "p3": ele.element_from_symbol("P"), - "p4": ele.element_from_symbol("P"), - "p5": ele.element_from_symbol("P"), - "pb": ele.element_from_symbol("P"), - "pc": ele.element_from_symbol("P"), - "pd": ele.element_from_symbol("P"), - "pe": ele.element_from_symbol("P"), - "pf": ele.element_from_symbol("P"), - "px": ele.element_from_symbol("P"), - "py": ele.element_from_symbol("P"), - "s": ele.element_from_symbol("S"), - "s2": ele.element_from_symbol("S"), - "s4": ele.element_from_symbol("S"), - "s6": ele.element_from_symbol("S"), - "sh": ele.element_from_symbol("S"), - "ss": ele.element_from_symbol("S"), - "sx": ele.element_from_symbol("S"), - "sy": ele.element_from_symbol("S"), + "c": element_from_symbol("C"), + "c1": element_from_symbol("C"), + "c2": element_from_symbol("C"), + "c3": element_from_symbol("C"), + "ca": element_from_symbol("C"), + "cp": element_from_symbol("C"), + "cq": element_from_symbol("C"), + "cc": element_from_symbol("C"), + "cd": element_from_symbol("C"), + "ce": element_from_symbol("C"), + "cf": element_from_symbol("C"), + "cg": element_from_symbol("C"), + "ch": element_from_symbol("C"), + "cx": element_from_symbol("C"), + "cy": element_from_symbol("C"), + "cu": element_from_symbol("C"), + "cv": element_from_symbol("C"), + "h1": element_from_symbol("H"), + "h2": element_from_symbol("H"), + "h3": element_from_symbol("H"), + "h4": element_from_symbol("H"), + "h5": element_from_symbol("H"), + "ha": element_from_symbol("H"), + "hc": element_from_symbol("H"), + "hn": element_from_symbol("H"), + "ho": element_from_symbol("H"), + "hp": element_from_symbol("H"), + "hs": element_from_symbol("H"), + "hw": element_from_symbol("H"), + "hx": element_from_symbol("H"), + "f": element_from_symbol("F"), + "cl": element_from_symbol("Cl"), + "br": element_from_symbol("Br"), + "i": element_from_symbol("I"), + "n": element_from_symbol("N"), + "n1":element_from_symbol("N"), + "n2":element_from_symbol("N"), + "n3":element_from_symbol("N"), + "n4": element_from_symbol("N"), + "na": element_from_symbol("N"), + "nb": element_from_symbol("N"), + "nc": element_from_symbol("N"), + "nd": element_from_symbol("N"), + "ne": element_from_symbol("N"), + "nf": element_from_symbol("N"), + "nh": element_from_symbol("N"), + "no": element_from_symbol("N"), + "o": element_from_symbol("O"), + "oh": element_from_symbol("O"), + "os": element_from_symbol("O"), + "ow": element_from_symbol("O"), + "p2": element_from_symbol("P"), + "p3": element_from_symbol("P"), + "p4": element_from_symbol("P"), + "p5": element_from_symbol("P"), + "pb": element_from_symbol("P"), + "pc": element_from_symbol("P"), + "pd": element_from_symbol("P"), + "pe": element_from_symbol("P"), + "pf": element_from_symbol("P"), + "px": element_from_symbol("P"), + "py": element_from_symbol("P"), + "s": element_from_symbol("S"), + "s2": element_from_symbol("S"), + "s4": element_from_symbol("S"), + "s6": element_from_symbol("S"), + "sh": element_from_symbol("S"), + "ss": element_from_symbol("S"), + "sx": element_from_symbol("S"), + "sy": element_from_symbol("S"), } diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..7603dc7b --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,33 @@ +[build-system] +requires = ["setuptools>=61.2", "versioningit"] +build-backend = "setuptools.build_meta" + +[project] +name = "MorphCT" +description = "Using the Marcus Hoping model, caclulates charge mobility from atomistic molecular dynamics morphologies." +readme = "README.md" +authors = [ + {name = "Eric Jankowski", email = "ericjankowski@boisestate.edu"} +] +license= {text = "GPLv3"} +classifiers=[ + "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + "Programming Language :: Python", + "Programming Language :: Python :: 3", +] +urls = {Homepage = "https://github.com/cmelab/morphct"} +requires-python = ">=3.7" +dynamic = ["version"] + +[tool.setuptools] +zip-safe = false +include-package-data = true +license-files = ["LICENSE"] + +[tool.setuptools.packages.find] +where = ["."] +include = ["morphct*"] +exclude = ["tests*"] + +[tool.setuptools.dynamic] +version = {attr = "morphct.__version__"} diff --git a/setup.py b/setup.py deleted file mode 100644 index 15325465..00000000 --- a/setup.py +++ /dev/null @@ -1,105 +0,0 @@ -"""A setuptools based setup module. -See: -https://packaging.python.org/en/latest/distributing.html -https://github.com/pypa/sampleproject -""" - -# Always prefer setuptools over distutils -from setuptools import setup, find_packages -# To use a consistent encoding -from codecs import open -from os import path -from morphct.__version__ import __version__ - -here = path.abspath(path.dirname(__file__)) - -# Get the long description from the README file -with open(path.join(here, 'README.md'), encoding='utf-8') as f: - long_description = f.read() - -setup( - name='morphct', - - # Versions should comply with PEP440. For a discussion on single-sourcing - # the version across setup.py and the project code, see - # https://packaging.python.org/en/latest/single_source_version.html - version=__version__, - - description='A multi-scale (1A to 1um, 1fs to 1us) organic solar cell simulation suite - from molecules to efficiencies', - long_description=long_description, - - # The project's main homepage. - url='https://github.com/cmelab/morphct', - - # Author details - author='Matty Jones', - author_email='mattyjones@boisestate.edu', - - # Choose your license - license='GPLv3', - - # See https://pypi.python.org/pypi?%3Aaction=list_classifiers - classifiers=[ - # How mature is this project? Common values are - # 3 - Alpha - # 4 - Beta - # 5 - Production/Stable - 'Development Status :: 3 - Alpha', - - # Indicate who your project is intended for - 'Intended Audience :: Science/Research', - - # Pick your license as you wish (should match "license" above) - 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)', - - # Specify the Python versions you support here. In particular, ensure - # that you indicate whether you support Python 2, Python 3 or both. - 'Programming Language :: Python :: 3', - ], - - # What does your project relate to? - keywords='KMC MD organic molecules photovoltaics QCC', - - # You can just specify the packages manually here if your project is - # simple. Or you can use find_packages(). - packages=find_packages(exclude=['contrib', 'docs', 'tests']), - package_dir={'morphct': 'morphct'}, - - # Alternatively, if you want to distribute just a my_module.py, uncomment - # this: - # py_modules=["my_module"], - - # List run-time dependencies here. These will be installed by pip when - # your project is installed. For an analysis of "install_requires" vs pip's - # requirements files see: - # https://packaging.python.org/en/latest/requirements.html - install_requires=['scipy', 'numpy', 'matplotlib'], - - # List additional groups of dependencies here (e.g. development - # dependencies). You can install these using the following syntax, - # for example: - # $ pip install -e .[dev,test] - extras_require={ - 'dev': [''], - 'test': ['pytest'], - }, - - # If there are data files included in your packages that need to be - # installed, specify them here. If using Python 2.6 or less, then these - # have to be included in MANIFEST.in as well. - #package_data={ - # 'sample': ['package_data.dat'], - #}, - - # Although 'package_data' is the preferred approach, in some case you may - # need to place data files outside of your packages. See: - # http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files # noqa - # In this case, 'data_file' will be installed into '/my_data' - #data_files=[('my_data', ['data/data_file'])], - include_package_data=True, - # To provide executable scripts, use entry points in preference to the - # "scripts" keyword. Entry points provide cross-platform support and allow - # pip to create the appropriate form of executable for the target platform. - #entry_points={ - #}, -)