diff --git a/.github/workflows/pages.yaml b/.github/workflows/pages.yaml index 3803607..a4b4c52 100644 --- a/.github/workflows/pages.yaml +++ b/.github/workflows/pages.yaml @@ -48,4 +48,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v2 + uses: actions/deploy-pages@v2 \ No newline at end of file diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/pypi-publish.yml new file mode 100644 index 0000000..bf9cd88 --- /dev/null +++ b/.github/workflows/pypi-publish.yml @@ -0,0 +1,63 @@ +# This workflow will install Python dependencies, run tests and lint with a single version of Python +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Publish to PyPI + +on: + push: + tags: "*" + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.9 + uses: actions/setup-python@v4 + with: + python-version: 3.9 + + - name: Install System dependencies + run: | + sudo apt install pandoc + + - name: Install Python dependencies + run: | + python -m pip install --upgrade pip + pip install flake8 pytest tox + + # - name: Lint with flake8 + # run: | + # # stop the build if there are Python syntax errors or undefined names + # flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + # # flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + + # Skip docs build and deploy as this is handled in a separate action + # - name: Test with tox + # run: | + # tox + # + # - name: Build docs + # run: | + # tox -e docs + # + # - run: touch ./docs/_build/html/.nojekyll + # + # - name: GH Pages Deployment + # uses: JamesIves/github-pages-deploy-action@4.1.3 + # with: + # branch: gh-pages # The branch the action should deploy to. + # folder: ./docs/_build/html + # clean: true # Automatically remove deleted files from the deploy branch + + - name: Build Project and Publish + run: | + python -m tox -e clean,build + + - name: Publish package + uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29 + with: + user: __token__ + password: ${{ secrets.PYPI_TOKEN }} diff --git a/.github/workflows/pypi-test.yml b/.github/workflows/pypi-test.yml new file mode 100644 index 0000000..806f184 --- /dev/null +++ b/.github/workflows/pypi-test.yml @@ -0,0 +1,41 @@ + # This workflow will install Python dependencies, run tests and lint with a single version of Python + # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Test the library + +on: workflow_dispatch +# push: +# branches: [main] +# pull_request: +# branches: [main] + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + + name: Python ${{ matrix.python-version }} + steps: + - uses: actions/checkout@v2 + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + cache: "pip" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install flake8 pytest tox + + # - name: Lint with flake8 + # run: | + # # stop the build if there are Python syntax errors or undefined names + # flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + # # flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + + - name: Test with tox + run: | + tox diff --git a/docs/conf.py b/docs/conf.py index 76844a1..4391891 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -10,7 +10,6 @@ import os import sys - # -- Path setup -------------------------------------------------------------- __location__ = os.path.dirname(__file__) @@ -28,18 +27,20 @@ # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ["sphinx.ext.autodoc", - "sphinx.ext.intersphinx", - "sphinx.ext.todo", - "sphinx.ext.autosummary", - "sphinx.ext.viewcode", - "sphinx.ext.coverage", - "sphinx.ext.doctest", - "sphinx.ext.ifconfig", - "sphinx.ext.mathjax", - "sphinx.ext.napoleon", - "nbsphinx", - "sphinx_gallery.load_style"] +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.intersphinx", + "sphinx.ext.todo", + "sphinx.ext.autosummary", + "sphinx.ext.viewcode", + "sphinx.ext.coverage", + "sphinx.ext.doctest", + "sphinx.ext.ifconfig", + "sphinx.ext.mathjax", + "sphinx.ext.napoleon", + "nbsphinx", + "sphinx_gallery.load_style", + ] # autodoc configuration autodoc_typehints = "description" diff --git a/setup.cfg b/setup.cfg index 7f8e311..fdf5c93 100644 --- a/setup.cfg +++ b/setup.cfg @@ -5,7 +5,6 @@ [metadata] name = scimilarity -version = 0.1.0 description = Single cell embedding into latent space and retrieving with kNN. author = Graham Heimberg, Tony Kuo, Nathaniel Diamant, Omar Salem, Héctor Corrada Bravo, Jason A. Vander Heiden author_email = heimberg@gene.com @@ -48,6 +47,7 @@ python_requires = >=3.7 # new major versions. This works if the required packages follow Semantic Versioning. # For more information, check out https://semver.org/. install_requires = + importlib-metadata; python_version<"3.8" anndata>=0.8.0 captum>=0.5.0 circlify>=0.14.0 @@ -65,7 +65,6 @@ install_requires = torch>=1.10.1 tqdm zarr>=2.6.1 - importlib-metadata; python_version<"3.8" [options.packages.find] where = src @@ -131,5 +130,7 @@ exclude = [pyscaffold] # PyScaffold's parameters when the project was created. # This will be used when updating. Do not change! -version = 4.2.1 +version = 4.5 package = scimilarity +extensions = + markdown diff --git a/setup.py b/setup.py index 75a802a..1546bea 100644 --- a/setup.py +++ b/setup.py @@ -2,18 +2,15 @@ Setup file for scimilarity. Use setup.cfg to configure your project. - This file was generated with PyScaffold 4.2.1. + This file was generated with PyScaffold 4.5. PyScaffold helps you to put up the scaffold of your new Python project. Learn more under: https://pyscaffold.org/ """ from setuptools import setup - if __name__ == "__main__": try: - setup( - setup_requires=["setuptools_scm"], - ) + setup(use_scm_version={"version_scheme": "no-guess-dev"}) except: # noqa print( "\n\nAn error occurred while building the project, " diff --git a/src/scimilarity/__init__.py b/src/scimilarity/__init__.py index 0c25a84..8deeaed 100644 --- a/src/scimilarity/__init__.py +++ b/src/scimilarity/__init__.py @@ -1,4 +1,3 @@ -import subprocess import sys if sys.version_info[:2] >= (3, 8): diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..69f8159 --- /dev/null +++ b/tox.ini @@ -0,0 +1,93 @@ +# Tox configuration file +# Read more under https://tox.wiki/ +# THIS SCRIPT IS SUPPOSED TO BE AN EXAMPLE. MODIFY IT ACCORDING TO YOUR NEEDS! + +[tox] +minversion = 3.24 +envlist = default +isolated_build = True + + +[testenv] +description = Invoke pytest to run automated tests +setenv = + TOXINIDIR = {toxinidir} +passenv = + HOME + SETUPTOOLS_* +extras = + testing +commands = + pytest {posargs} + + +# # To run `tox -e lint` you need to make sure you have a +# # `.pre-commit-config.yaml` file. See https://pre-commit.com +# [testenv:lint] +# description = Perform static analysis and style checks +# skip_install = True +# deps = pre-commit +# passenv = +# HOMEPATH +# PROGRAMDATA +# SETUPTOOLS_* +# commands = +# pre-commit run --all-files {posargs:--show-diff-on-failure} + + +[testenv:{build,clean}] +description = + build: Build the package in isolation according to PEP517, see https://github.com/pypa/build + clean: Remove old distribution files and temporary build artifacts (./build and ./dist) +# https://setuptools.pypa.io/en/stable/build_meta.html#how-to-use-it +skip_install = True +changedir = {toxinidir} +deps = + build: build[virtualenv] +passenv = + SETUPTOOLS_* +commands = + clean: python -c 'import shutil; [shutil.rmtree(p, True) for p in ("build", "dist", "docs/_build")]' + clean: python -c 'import pathlib, shutil; [shutil.rmtree(p, True) for p in pathlib.Path("src").glob("*.egg-info")]' + build: python -m build {posargs} +# By default, both `sdist` and `wheel` are built. If your sdist is too big or you don't want +# to make it available, consider running: `tox -e build -- --wheel` + + +[testenv:{docs,doctests,linkcheck}] +description = + docs: Invoke sphinx-build to build the docs + doctests: Invoke sphinx-build to run doctests + linkcheck: Check for broken links in the documentation +passenv = + SETUPTOOLS_* +setenv = + DOCSDIR = {toxinidir}/docs + BUILDDIR = {toxinidir}/docs/_build + docs: BUILD = html + doctests: BUILD = doctest + linkcheck: BUILD = linkcheck +deps = + -r {toxinidir}/docs/requirements.txt + # ^ requirements.txt shared with Read The Docs +commands = + sphinx-build --color -b {env:BUILD} -d "{env:BUILDDIR}/doctrees" "{env:DOCSDIR}" "{env:BUILDDIR}/{env:BUILD}" {posargs} + + +[testenv:publish] +description = + Publish the package you have been developing to a package index server. + By default, it uses testpypi. If you really want to publish your package + to be publicly accessible in PyPI, use the `-- --repository pypi` option. +skip_install = True +changedir = {toxinidir} +passenv = + # See: https://twine.readthedocs.io/en/latest/ + TWINE_USERNAME + TWINE_PASSWORD + TWINE_REPOSITORY + TWINE_REPOSITORY_URL +deps = twine +commands = + python -m twine check dist/* + python -m twine upload {posargs:--repository {env:TWINE_REPOSITORY:testpypi}} dist/*