diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index e511102..c2083db 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -50,7 +50,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11", "3.12"] + python-version: ["3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v4 diff --git a/.gitignore b/.gitignore index f26bdb1..c2f0d00 100644 --- a/.gitignore +++ b/.gitignore @@ -1,143 +1,89 @@ -# Byte-compiled / optimized / DLL files __pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# 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/ -.nox/ +__pypackages__/ +.cache .coverage .coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover +.dmypy.json +.DS_Store +.eggs/ +.env .hypothesis/ +.idea/ +.installed.cfg +.ipynb_checkpoints +.mypy_cache/ +.nox/ +.pdm-build/ +.pdm-python +.pdm.toml +.pybuilder/ +.pyre/ .pytest_cache/ -cover/ - -# Translations +.Python +.python-version +.pytype/ +.ropeproject +.scrapy +.spyderproject +.spyproject +.tox/ +.venv +.vscode +.webassets-cache +*.bak +*.cover +*.egg +*.egg-info/ +*.log +*.manifest *.mo +*.orig *.pot - -# Django stuff: -*.log -local_settings.py +*.py,cover +*.py[cod] +*.sage.py +*.so +*.spec *.sqlite3 +**/.DS_Store +*~ +*$py.class +/site +archive +build/ +celerybeat-schedule +celerybeat.pid +cover/ +coverage.xml +cython_debug/ db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation +develop-eggs/ +dist/ +dmypy.json docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# package/env management -.python-version -.env -.venv +downloads/ +eggs/ env/ -venv/ ENV/ -*.bak +htmlcov/ +instance/ +ipython_config.py +lib/ +lib64/ +local_settings.py +MANIFEST +nosetests.xml +parts/ +pdm.lock +pip-delete-this-directory.txt +pip-log.txt Pipfile.lock poetry.lock -pdm.lock -.pdm.toml -.pdm-python -.pdm-build/ +profile_default/ +sdist/ +share/python-wheels/ +target/ uv.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# IDEs -.idea/ -.vscode - -# misc -*.orig -archive -*~ -**/.DS_Store +var/ +venv/ +wheels/ diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000..eb02b8c --- /dev/null +++ b/.mailmap @@ -0,0 +1,13 @@ +# I pick the account with the most modified files in git shortlog -sne +# This is used by Git to consolidate the users who used multiple accounts +Andreas Prlic Andreas Prlic <36012160+andreas-invitae@users.noreply.github.com> +Andreas Prlic Andreas Prlic +Caitlin Gong Caitlin Gong +Katie Stahl katie stahl +Manuel Holtgrewe Manuel Holtgrewe +Meng Meng Wang +Reece Hart Reece Hart +Reece Hart Reece Hart +Reece Hart Reece Hart +Reece Hart Reece Hart +Rudy Rico Rudolph Rico diff --git a/Makefile b/Makefile index bbcce4d..ea6378b 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,8 @@ endif SHELL:=zsh -eu -o pipefail -o null_glob SELF:=$(firstword $(MAKEFILE_LIST)) -VE_DIR=venv +VE_DIR:=venv +PY_VERSION:=3.13 TEST_DIRS:=tests DOC_TESTS:=src ./README.md @@ -40,27 +41,23 @@ devready: #=> venv: make a Python 3 virtual environment ${VE_DIR}: - python3 --version - python3 -mvenv $@; \ - source $@/bin/activate; \ - python3 -m ensurepip --upgrade; \ - pip install --upgrade pip setuptools wheel - + uv venv --python ${PY_VERSION} $@ + #=> develop: install package in develop mode .PHONY: develop develop: - pip install -e ".[dev,tests]" + uv pip install -e ".[dev,tests]" pre-commit install #=> install: install package .PHONY: install install: - pip install "." + uv pip install "." #=> build: make sdist and wheel .PHONY: build build: %: - python -m build + uv build ############################################################################ diff --git a/README.md b/README.md index 212e681..87525ea 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ [![codecov](https://codecov.io/gh/biocommons/biocommons.example/graph/badge.svg?token=CCUMQQV5R6)](https://codecov.io/gh/biocommons/biocommons.example) +--- + This repo provides a template for biocommons Python packages. Here's how to use it: 1. Click the [Use this template](https://github.com/biocommons/example/generate) @@ -11,28 +13,43 @@ This repo provides a template for biocommons Python packages. Here's how to use 1. Remove this header. 1. Commit and push. +Delete this section in your generated template. + +--- + ## Installation To install from pypi: ```pip install biocommons.example``` ## Developer Setup -Developers must install zsh, which is required by the Makefile. zsh is included by default in MacOS, and is readily available on all modern Linux distributions. +### Prerequisites -Setup like this: +- [GNU make](https://www.gnu.org/software/make/): Current mechanism for consistent invocation of developer tools. + - Mac: [Install brew](https://brew.sh/), then [install make](https://formulae.brew.sh/formula/make) + - Ubuntu: `sudo apt install make` +- [uv](https://docs.astral.sh/uv/): An extremely fast Python package and project manager, written in Rust. + - All platforms: See the [uv installation instructions](https://docs.astral.sh/uv/getting-started/installation/). +- [zsh](https://www.zsh.org/): Shell used by the Makefile + - Mac: included by default + - Ubuntu: `sudo apt install zsh` + +### One-time developer setup + +Create a Python virtual environment and install dependencies: make devready + +### Development + +Activate your environment: + source venv/bin/activate Code reformatting: make reformat -Install pre-commit hook: - - # included in `make devready`, not necessary for new installations - pre-commit install - Test: make test # for current environment @@ -77,7 +94,3 @@ Try it: * Quality tools: Code linting and reformatting with Ruff * GitHub Actions for testing and packaging - -## ToDo - -* Add devcontainer support diff --git a/pyproject.toml b/pyproject.toml index 928791a..de2b403 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,31 +3,35 @@ name = "biocommons.example" authors = [ { name = "biocommons contributors", email = "biocommons-dev@googlegroups.com" }, ] -description = "Example Package" +description = "biocommons.example Package" readme = "README.md" -license = { file = "LICENSE.txt" } -requires-python = ">=3.10" +license = "Apache-2.0" +# license_files = [ "LICENSE.txt" ] +# requires-python = ">=3.11" classifiers = [ "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", - "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3.13", "Operating System :: OS Independent", ] dynamic = ["version"] -dependencies = ["coloredlogs ~= 15.0", "pyyaml ~= 6.0"] +dependencies = [ + "coloredlogs ~= 15.0", + "pyyaml ~= 6.0", +] [project.optional-dependencies] dev = [ "build ~= 0.8", "ipython ~= 8.4", - "pre-commit ~= 3.4", + "pre-commit>=3.8.0", "ruff == 0.4.4", ] tests = [ "pytest-cov ~= 4.1", - "pytest-optional-tests", "pytest ~= 7.1", "vcrpy", "tox ~= 4.15",