diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..a09674c --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,102 @@ +name: Publish to PyPI and TestPyPI + +on: push + +jobs: + build: + name: Build Distribution + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Get history and tags for SCM versioning to work + if: ${{ !startsWith(github.ref, 'refs/tags/') }} + run: | + git fetch --prune --unshallow + git tag -d $(git tag --points-at HEAD) + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.x" + - name: Install pypa/build + run: pip install build --user + - name: Build a binary wheel and a source tarball + run: python3 -m build + - name: Store the distribution packages + uses: actions/upload-artifact@v4 + with: + name: python-package-distributions + path: dist/ + + publish-to-pypi: + name: Publish to PyPI + if: startsWith(github.ref, 'refs/tags/') # only publish to PyPI on tag pushes + needs: [build] + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/TopoEmbedX + permissions: + id-token: write + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + - name: Publish distribution 📦 to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + + github-release: + name: Sign and Upload as GitHub Release + needs: [publish-to-pypi] + runs-on: ubuntu-latest + + permissions: + contents: write + id-token: write + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + - name: Sign the dists with Sigstore + uses: sigstore/gh-action-sigstore-python@v3.0.0 + with: + inputs: >- + ./dist/*.tar.gz + ./dist/*.whl + - name: Create GitHub Release + env: + GITHUB_TOKEN: ${{ github.token }} + run: gh release create '${{ github.ref_name }}' --repo '${{ github.repository }}' --notes "" + - name: Upload artifact signatures to GitHub Release + env: + GITHUB_TOKEN: ${{ github.token }} + run: gh release upload '${{ github.ref_name }}' dist/** --repo '${{ github.repository }}' + + publish-to-testpypi: + name: Publish to TestPyPI + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + needs: [build] + runs-on: ubuntu-latest + + environment: + name: testpypi + url: https://test.pypi.org/p/TopoEmbedX + + permissions: + id-token: write + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + - name: Publish distribution 📦 to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ diff --git a/.gitignore b/.gitignore index 8b7199b..d98ec77 100644 --- a/.gitignore +++ b/.gitignore @@ -14,5 +14,10 @@ coverage.xml **/*.cpython-38.pyc **/__pycache__/** __pycache__/ +dist/ docs/build/ -toponetx/.DS_Store \ No newline at end of file +topoembedx/.DS_Store +topoembedx/_version.py + +# Sphinx documentation +docs/_build/ diff --git a/pyproject.toml b/pyproject.toml index 29c92be..af93bfa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,27 +1,32 @@ [build-system] -requires = ["setuptools"] +requires = ["setuptools>=64.0", "setuptools_scm>=8"] build-backend = "setuptools.build_meta" [project] name = "TopoEmbedX" dynamic = ["version"] authors = [ - {name = "PyT-Team Authors", email = "mustafahajij@gmail.com"} + {name = "Mustafa Hajij", email = "mhajij@usfca.edu"}, + {name = "Mathilde Papillon", email = "papillon@ucsb.edu"}, + {name = "Florian Frantzen", email = "florian.frantzen@cs.rwth-aachen.de"} ] readme = "README.md" description = "Representation Learning on Topological Domains" license = {file = "LICENSE.txt"} classifiers = [ - "License :: OSI Approved :: MIT License", - "Development Status :: 4 - Beta", + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", "Intended Audience :: Science/Research", + "Operating System :: OS Independent", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Mathematics", "Topic :: Scientific/Engineering :: Artificial Intelligence", - "Natural Language :: English", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11" ] requires-python = ">= 3.10" dependencies=[ @@ -66,11 +71,8 @@ dev = ["TopoEmbedX[test, lint]"] all = ["TopoEmbedX[dev, doc]"] [project.urls] -homepage="https://github.com/pyt-team/TopoEmbedX" -repository="https://github.com/pyt-team/TopoEmbedX" - -[tool.ruff] -extend-include = ["*.ipynb"] +documentation="https://pyt-team.github.io/topoembedx/" +source="https://github.com/pyt-team/TopoEmbedX/" [tool.ruff.format] docstring-code-format = true @@ -99,19 +101,18 @@ ignore = ["E501"] # line too long [tool.ruff.lint.pydocstyle] convention = "numpy" -[tool.setuptools.dynamic] -version = {attr = "topoembedx.__version__"} - [tool.setuptools.packages.find] -include = [ - "topoembedx", - "topoembedx.*" -] +include = ["topoembedx"] + +[tool.setuptools_scm] +local_scheme = "no-local-version" +version_file = "topoembedx/_version.py" [tool.mypy] warn_redundant_casts = true +warn_unreachable = true warn_unused_ignores = true -show_error_codes = true +enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] disable_error_code = ["import-untyped"] plugins = "numpy.typing.mypy_plugin" diff --git a/topoembedx/__init__.py b/topoembedx/__init__.py index 7cada5b..8a56802 100644 --- a/topoembedx/__init__.py +++ b/topoembedx/__init__.py @@ -1,5 +1,4 @@ """Initialize the library with modules and other content.""" -__version__ = "0.0.1" from .classes.cell2vec import Cell2Vec from .classes.cell_diff2vec import CellDiff2Vec