diff --git a/.copier-answers.yaml b/.copier-answers.yaml index c7496c6..2de64f9 100644 --- a/.copier-answers.yaml +++ b/.copier-answers.yaml @@ -1,9 +1,9 @@ # Changes here will be overwritten by Copier -_commit: c53b04c +_commit: e29838a _src_path: https://github.com/python-project-templates/base.git add_docs: true -add_wiki: true add_extension: rust +add_wiki: true email: 3105306+timkpaine@users.noreply.github.com github: python-project-templates project_description: A Rust-Python project template diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index fec4766..1a47a59 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -83,7 +83,7 @@ jobs: - name: Make dist run: | - make dist-rust + make dist-rs make dist-py-sdist make dist-py-wheel make dist-check diff --git a/.github/workflows/wiki.yaml b/.github/workflows/wiki.yaml new file mode 100644 index 0000000..1588acd --- /dev/null +++ b/.github/workflows/wiki.yaml @@ -0,0 +1,27 @@ +name: Publish Docs + +on: + push: + branches: + - main + paths: + - "docs/**" + - "README.md" + workflow_dispatch: + +concurrency: + group: docs + cancel-in-progress: true + +permissions: + contents: write + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cp README.md docs/wiki/Home.md + - uses: Andrew-Chen-Wang/github-wiki-action@v4 + with: + path: docs/wiki diff --git a/Makefile b/Makefile index f5509fe..9ac8fa4 100644 --- a/Makefile +++ b/Makefile @@ -1,26 +1,26 @@ ######### # BUILD # ######### -.PHONY: develop-py develop-rust develop +.PHONY: develop-py develop-rs develop develop-py: uv pip install -e .[develop] -develop-rust: +develop-rs: make -C rust develop -develop: develop-rust develop-py ## setup project for development +develop: develop-rs develop-py ## setup project for development -.PHONY: build-py build-rust build dev +.PHONY: build-py build-rs build dev build-py: maturin build -build-rust: +build-rs: make -C rust build dev: build ## lightweight in-place build for iterative dev $(_CP_COMMAND) -build: build-rust build-py ## build the project +build: build-rs build-py ## build the project .PHONY: install install: ## install python library @@ -36,28 +36,36 @@ endif ######### # LINTS # ######### -.PHONY: lint-py lint-rust lint lints +.PHONY: lint-py lint-rs lint-docs lint lints lint-py: ## run python linter with ruff python -m ruff check python_template_rust python -m ruff format --check python_template_rust -lint-rust: ## run rust linter +lint-rs: ## run rust linter make -C rust lint -lint: lint-rust lint-py ## run project linters +lint-docs: ## lint docs with mdformat and codespell + python -m mdformat --check README.md docs/wiki/ + python -m codespell_lib README.md docs/wiki/ + +lint: lint-rs lint-py lint-docs ## run project linters # alias lints: lint -.PHONY: fix-py fix-rust fix format +.PHONY: fix-py fix-rs fix-docs fix format fix-py: ## fix python formatting with ruff python -m ruff check --fix python_template_rust python -m ruff format python_template_rust -fix-rust: ## fix rust formatting +fix-rs: ## fix rust formatting make -C rust fix -fix: fix-rust fix-py ## run project autoformatters +fix-docs: ## autoformat docs with mdformat and codespell + python -m mdformat README.md docs/wiki/ + python -m codespell_lib --write README.md docs/wiki/ + +fix: fix-rs fix-py fix-docs ## run project autoformatters # alias format: fix @@ -88,19 +96,19 @@ tests-py: test-py coverage-py: ## run python tests and collect test coverage python -m pytest -v python_template_rust/tests --cov=python_template_rust --cov-report term-missing --cov-report xml -.PHONY: test-rust tests-rust coverage-rust -test-rust: ## run rust tests +.PHONY: test-rs tests-rs coverage-rs +test-rs: ## run rust tests make -C rust test # alias -tests-rust: test-rust +tests-rs: test-rs -coverage-rust: ## run rust tests and collect test coverage +coverage-rs: ## run rust tests and collect test coverage make -C rust coverage .PHONY: test coverage tests -test: test-py test-rust ## run all tests -coverage: coverage-py coverage-rust ## run all tests and collect test coverage +test: test-py test-rs ## run all tests +coverage: coverage-py coverage-rs ## run all tests and collect test coverage # alias tests: test @@ -125,7 +133,7 @@ major: ## bump a major version ######## # DIST # ######## -.PHONY: dist-py-wheel dist-py-sdist dist-rust dist-check dist publish +.PHONY: dist-py-wheel dist-py-sdist dist-rs dist-check dist publish dist-py-wheel: # build python wheel python -m cibuildwheel --output-dir dist @@ -133,13 +141,13 @@ dist-py-wheel: # build python wheel dist-py-sdist: # build python sdist python -m build --sdist -o dist -dist-rust: # build rust dists +dist-rs: # build rust dists make -C rust dist dist-check: ## run python dist checker with twine python -m twine check dist/* -dist: clean build dist-rust dist-py-wheel dist-py-sdist dist-check ## build all dists +dist: clean build dist-rs dist-py-wheel dist-py-sdist dist-check ## build all dists publish: dist # publish python assets diff --git a/README.md b/README.md index 51fc0b8..1092663 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,5 @@ A Rust-Python project template ## Overview - > [!NOTE] > This library was generated using [copier](https://copier.readthedocs.io/en/stable/) from the [Base Python Project Template repository](https://github.com/python-project-templates/base). diff --git a/docs/wiki/_Footer.md b/docs/wiki/_Footer.md new file mode 100644 index 0000000..1d02386 --- /dev/null +++ b/docs/wiki/_Footer.md @@ -0,0 +1 @@ +_This wiki is autogenerated. To made updates, open a PR against the original source file in [`docs/wiki`](https://github.com/python-project-templates/python-template-rust/tree/main/docs/wiki)._ diff --git a/docs/wiki/_Sidebar.md b/docs/wiki/_Sidebar.md new file mode 100644 index 0000000..988b1ac --- /dev/null +++ b/docs/wiki/_Sidebar.md @@ -0,0 +1,16 @@ + + +**[Home](Home)** + +**Get Started** + +- [Installation](Installation) +- [Contributing](Contribute) +- [Development Setup](Local-Development-Setup) +- [Build from Source](Build-from-Source) diff --git a/docs/wiki/contribute/Build-from-Source.md b/docs/wiki/contribute/Build-from-Source.md new file mode 100644 index 0000000..ad883cf --- /dev/null +++ b/docs/wiki/contribute/Build-from-Source.md @@ -0,0 +1,127 @@ +`python-template-rust` is written in Python and Rust. While prebuilt wheels are provided for end users, it is also straightforward to build `python-template-rust` from either the Python [source distribution](https://packaging.python.org/en/latest/specifications/source-distribution-format/) or the GitHub repository. + +- [Make commands](#make-commands) +- [Prerequisites](#prerequisites) +- [Clone](#clone) +- [Install Python dependencies](#install-python-dependencies) +- [Build](#build) +- [Lint and Autoformat](#lint-and-autoformat) +- [Testing](#testing) + +## Make commands + +As a convenience, `python-template-rust` uses a `Makefile` for commonly used commands. You can print the main available commands by running `make` with no arguments + +```bash +> make + +build build the library +clean clean the repository +fix run autofixers +install install library +lint run lints +test run the tests +``` + +## Prerequisites + +`python-template-rust` has a few system-level dependencies which you can install from your machine package manager. Other package managers like `conda`, `nix`, etc, should also work fine. + +## Clone + +Clone the repo with: + +```bash +git clone https://github.com/python-project-templates/python-template-rust.git +cd python-template-rust +``` + +## Install Rust + +Follow the instructions for [installing Rust](https://rustup.rs) for your system. + +## Install Python dependencies + +Python build and develop dependencies are specified in the `pyproject.toml`, but you can manually install them: + +```bash +make requirements +``` + +Note that these dependencies would otherwise be installed normally as part of [PEP517](https://peps.python.org/pep-0517/) / [PEP518](https://peps.python.org/pep-0518/). + +## Build + +Build the python project in the usual manner: + +```bash +make build +``` + +## Lint and Autoformat + +`python-template-rust` has linting and auto formatting. + +| Language | Linter | Autoformatter | Description | +| :------- | :---------- | :------------ | :---------- | +| Python | `ruff` | `ruff` | Style | +| Python | `ruff` | `ruff` | Imports | +| Rust | `clippy` | `clippy` | Style | +| Markdown | `mdformat` | `mdformat` | Style | +| Markdown | `codespell` | | Spelling | + +**Python Linting** + +```bash +make lint-py +``` + +**Python Autoformatting** + +```bash +make fix-py +``` + +**Rust Linting** + +```bash +make lint-rs +``` + +**Rust Autoformatting** + +```bash +make fix-rs +``` + +**Documentation Linting** + +```bash +make lint-docs +``` + +**Documentation Autoformatting** + +```bash +make fix-docs +``` + +## Testing + +`python-template-rust` has both Python and JavaScript tests. The bulk of the functionality is tested in Python, which can be run via `pytest`. First, install the Python development dependencies with + +```bash +make develop +``` + +**Python** + +```bash +make test-py +``` + +**Rust** + +```bash +make test-rs +``` diff --git a/docs/wiki/contribute/Contribute.md b/docs/wiki/contribute/Contribute.md new file mode 100644 index 0000000..83da35a --- /dev/null +++ b/docs/wiki/contribute/Contribute.md @@ -0,0 +1,15 @@ +Contributions are welcome on this project. We distribute under the terms of the [Apache 2.0 license](https://github.com/python-project-templates/python-template-rust/blob/main/LICENSE). + +> [!NOTE] +> +> `python-template-rust` requires [Developer Certificate of Origin](https://en.wikipedia.org/wiki/Developer_Certificate_of_Origin) for all contributions. +> This is enforced by a [Probot GitHub App](https://probot.github.io/apps/dco/), which checks that commits are "signed". +> Read [instructions to configure commit signing](Local-Development-Setup#configure-commit-signing). + +For **bug reports** or **small feature requests**, please open an issue on our [issues page](https://github.com/python-project-templates/python-template-rust/issues). + +For **questions** or to discuss **larger changes or features**, please use our [discussions page](https://github.com/python-project-templates/python-template-rust/discussions). + +For **contributions**, please see our [developer documentation](Local-Development-Setup). We have `help wanted` and `good first issue` tags on our issues page, so these are a great place to start. + +For **documentation updates**, make PRs that update the pages in `/docs/wiki`. The documentation is pushed to the GitHub wiki automatically through a GitHub workflow. Note that direct updates to this wiki will be overwritten. diff --git a/docs/wiki/contribute/Local-Development-Setup.md b/docs/wiki/contribute/Local-Development-Setup.md new file mode 100644 index 0000000..8a07587 --- /dev/null +++ b/docs/wiki/contribute/Local-Development-Setup.md @@ -0,0 +1,55 @@ +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Step 1: Build from Source](#step-1-build-from-source) +- [Step 2: Configuring Git and GitHub for Development](#step-2-configuring-git-and-github-for-development) + - [Create your fork](#create-your-fork) + - [Configure remotes](#configure-remotes) + - [Authenticating with GitHub](#authenticating-with-github) +- [Guidelines](#guidelines) + +## Step 1: Build from Source + +To work on `python-template-rust`, you are going to need to build it from source. See +[Build from Source](Build-from-Source) for +detailed build instructions. + +Once you've built `python-template-rust` from a `git` clone, you will also need to +configure `git` and your GitHub account for `python-template-rust` development. + +## Step 2: Configuring Git and GitHub for Development + +### Create your fork + +The first step is to create a personal fork of `python-template-rust`. To do so, click +the "fork" button at https://github.com/python-project-templates/python-template-rust, or just navigate +[here](https://github.com/python-project-templates/python-template-rust/fork) in your browser. Set the +owner of the repository to your personal GitHub account if it is not +already set that way and click "Create fork". + +### Configure remotes + +Next, you should set some names for the `git` remotes corresponding to +main python-project-templates repository and your fork. See the [GitHub Docs](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/configuring-a-remote-repository-for-a-fork) for more information. + +### Authenticating with GitHub + +If you have not already configured `ssh` access to GitHub, you can find +instructions to do so +[here](https://docs.github.com/en/authentication/connecting-to-github-with-ssh), +including instructions to create an SSH key if you have not done +so. Authenticating with SSH is usually the easiest route. If you are working in +an environment that does not allow SSH connections to GitHub, you can look into +[configuring a hardware +passkey](https://docs.github.com/en/authentication/authenticating-with-a-passkey/about-passkeys) +or adding a [personal access +token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) +to avoid the need to type in your password every time you push to your fork. + +## Guidelines + +After developing a change locally, ensure that both [lints](Build-from-Source#lint-and-autoformat) and [tests](Build-from-Source#testing) pass. Commits should be squashed into logical units, and all commits must be signed (e.g. with the `-s` git flag). We require [Developer Certificate of Origin](https://en.wikipedia.org/wiki/Developer_Certificate_of_Origin) for all contributions. + +If your work is still in-progress, open a [draft pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests). Otherwise, open a normal pull request. It might take a few days for a maintainer to review and provide feedback, so please be patient. If a maintainer asks for changes, please make said changes and squash your commits if necessary. If everything looks good to go, a maintainer will approve and merge your changes for inclusion in the next release. + +Please note that non substantive changes, large changes without prior discussion, etc, are not accepted and pull requests may be closed. diff --git a/pyproject.toml b/pyproject.toml index 88549d7..a7786d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,6 +34,9 @@ develop = [ "bump-my-version", "check-manifest", "cibuildwheel", + "codespell>=2.4,<2.5", + "mdformat>=0.7.22,<0.8", + "mdformat-tables>=1", "maturin>=1,<2", "pytest", "pytest-cov", @@ -52,6 +55,7 @@ Homepage = "https://github.com/python-project-templates/python-template-rust" current_version = "0.1.0" commit = true tag = true +commit_args = "-s" [[tool.bumpversion.files]] filename = "python_template_rust/__init__.py"