Skip to content

Generates a Python project structure for starting new projects

License

Notifications You must be signed in to change notification settings

sanders41/python-project-generator

Repository files navigation

Python Project Generator

Tests Status crates.io

Generates a Python project structure with github actions for continuous integration and continuous deployment. Both pure Python projects and Python projects with Rust modules using PyO3 can be created.

Pure Python project included packages

For package managment choose between:

Dev packages:

  • mypy for static type checking
  • pytest for testing
  • pytest-cov for test coverage reports
  • ruff for linting and code formatting

Python project with Rust modules included packages

  • maturin for package management
  • mypy for static type checking
  • pytest for testing
  • pytest-cov for test coverage reports
  • ruff for linting and code formatting
  • PyO3 for managing the Rust/Python FFI
  • justfile for running commands (to use this you will need to install just)

Installation

Install with cargo:

cargo install python-project-generator

Install on Arch with the AUR:

paru -S python-project-generator-bin

Install on Debian/Ubuntu:

Note: Change the version to match the version you want to install.

curl -LO https://github.com/sanders41/python-project-generator/releases/download/v1.0.16/python-project-generator_1.0.16_amd64.deb
sudo dpkg -i python-project-generator_1.0.16_amd64.deb

Python Project Generator can also be installed with binaries provided with each release here, or with cargo.

How to use

Create a new project

From your terminal run:

python-project create

You will be asked a series of questions that will be used to generate your project. The project generator will check pypi for the lastest version of the included packages and use those while generating the project. This feature can be disabled by using with either -s or --skip-download-latest-packages when running the generator. If either there is an issue with retrieving the latest versions or if you have decided to skip looking up the latest version, the packages will be be created with default versions.

python-project create -s

Options

  • License

    Choose from MIT, Apache 2, or no license.

  • Python Version

    This will be the default Python version used. For example when releasing the project this is the version of Python that will be used.

  • Minimum Python Version

    This is the minimum supported Python version for the project. This is also the version that is used for ruff's upgrade target version.

  • Python Versions for Github Actions Testing

    Versions listed here will be the versions used for testing in CI.

  • Project Manager

    Specifies how project dependencies and builds should be handled

  • Application or Library

    Choosing application will create main.py and __main__.py files. Choosing library will omit these files.

  • Max Line Length

    This controls how long the ruff formatter will use for line wrapping.

  • Use Dependabot

    Dependabot can be used to keep dependencies up to date. If enabled dependabot will automatically create PRs to update dependencies when they are available.

  • Dependabot Schedule

    When dependabot is enabed the schedule controls how often dependabot will check for updates and create PRs.

  • Use Continuous Deployment

    This will create a GitHub Action to deploy the project to pypi when a new release is created. Note that for this to work you will need to get an API token for the project from pypi and add it to as a new repsitory secret called PYPI_API_KEY in the GitHub project.

  • Release Drafter

    Choosing yes will create a release drafter action automatically adds the tile of the PR, who created it, and it's PR number to a draft GitHub release. By default the release will get a patch version update. Adding a bug label will get a patch version update and add it to the Bug section of the release notes. Adding an enhancement label to a PR will create a release with a minor version bump, and a breaking-change label will create a major version bump. The draft release will get the release version tag for the highest label applied to the merged PRs in the release. PRs can be excluded from the release notes by applying a skip-changelog label to the PR.

  • Use Multi OS CI

    Choosing yes will setup CI to run tests on Linux, Mac, and Windows. If no is chosen tests will only run on Linux in CI.

After running the generator a new directory will be created with the name you used for the Project Slug. Change to this directory then install the python packages and pre-commit hooks.

Pure Python Projects

Install the Python dependencies when using Poetry.

poetry install

Install the Python dependencies when using setuptools.

First create a virtual environment and activate it.

python -m venv .venv
. .venv/bin/activate
python -m pip install -r requirements-dev.txt

Install the Python dependencies when using uv.

First create a virtual environment and activate it.

uv venv
. .venv/bin/activate

Next create a lock file

uv lock

Then install the dependencies

uv sync --frozen

Install the pre-commit hooks.

pre-commit install

PyO3 projects

First create a virtual environment and activate it.

python -m venv .venv
. .venv/bin/activate

Install the dependencies and build the rust module.

just install

Install the pre-commit hooks.

pre-commit install

Now your project is ready to use.

Save custom default values

You can specify default values for many of the project options. For example to save a default creator:

python-project config creator "Wade Watts"

To see a full list of values that be set as defaults run:

python-project config --help

To view the current saved defaults:

python-project config show

To remove custom defaults:

python-project config reset

Information

just

just allows you to add project specific commands to the project that can be run from the command line. It is very similar to make but has the advantage of being cross platform compatable and purposee build for running commands.

As an example, if you have the following in the justfile (this is included with the default file generated by this project):

@lint:
  echo mypy
  just --justfile {{justfile()}} mypy
  echo ruff
  just --justfile {{justfile()}} ruff
  echo ruff-format
  just --justfile {{justfile()}} ruff-format

@mypy:
  uv run mypy meilisearch_python_sdk tests

@ruff:
  uv run ruff check .

@ruff-format:
  uv run ruff format meilisearch_python_sdk tests examples

Then you can run mypy, ruff check, and ruff format with:

just mypy
just ruff
just ruff format

You can also run all 3 with 1 just command:

just lint

pre-commit

pre-commit runs linting and formatting on your code (as defined in the provided .pre-commit-config.yaml file) every time you make a commit to your code. If any of the lints fail pre-commit will cancel the commit. When possible, pre-commit will also automatically fix any errors that fail. For example pre-commit can automatically apply changes that fail ruff fromatting. pre-commit caches information and only runs on files that have changed so it is fast and doesn't slow down your work flow will preventing you from forgetting to run checks.

Contributing

If you are interested in contributing please see our contributing guide