{"id":21459946,"url":"https://github.com/juftin/cookiecutter-python","last_synced_at":"2025-07-15T02:31:51.878Z","repository":{"id":56710438,"uuid":"523573974","full_name":"juftin/cookiecutter-python","owner":"juftin","description":"juftin's personal cookiecutter template for python projects","archived":false,"fork":false,"pushed_at":"2024-04-01T13:42:09.000Z","size":226,"stargazers_count":7,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-08T19:52:22.545Z","etag":null,"topics":["cookiecutter","cookiecutter-python","cookiecutter-template","python"],"latest_commit_sha":null,"homepage":"https://juftin.com/cookiecutter-python","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/juftin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-08-11T03:30:48.000Z","updated_at":"2024-06-07T08:44:14.000Z","dependencies_parsed_at":"2023-01-31T22:31:12.034Z","dependency_job_id":"afa9cca4-a52e-49fb-9916-9505a09d7d9b","html_url":"https://github.com/juftin/cookiecutter-python","commit_stats":null,"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/juftin/cookiecutter-python","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juftin%2Fcookiecutter-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juftin%2Fcookiecutter-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juftin%2Fcookiecutter-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juftin%2Fcookiecutter-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/juftin","download_url":"https://codeload.github.com/juftin/cookiecutter-python/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juftin%2Fcookiecutter-python/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265390885,"owners_count":23757605,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cookiecutter","cookiecutter-python","cookiecutter-template","python"],"created_at":"2024-11-23T06:37:16.636Z","updated_at":"2025-07-15T02:31:51.348Z","avatar_url":"https://github.com/juftin.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv style=\"text-align: center;\"\u003e\n  \u003ch1 style=\"font-size: 36px; margin-top: 0;\" align=\"center\"\u003e\n    cookiecutter-python\n  \u003c/h1\u003e\n  \u003cp style=\"margin-bottom: 0;\" align=\"center\"\u003e\n    \u003ca href=\"https://github.com/juftin/cookiecutter-python\"\u003e\n      \u003cimg src=\"https://i.imgur.com/g8yxsTP.png\" width=\"400\"\u003e\n    \u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n[juftin]'s personal [cookiecutter] template for Python projects.\n\n```shell\ncookiecutter gh:juftin/cookiecutter-python\n```\n\n## Features\n\n-   [hatch] for managing the project's virtual environment and development tools\n-   [ruff] for code formatting and linting\n-   [mypy] for type checking\n-   [hatch-pip-compile] for dependency management + lockfiles\n-   [pre-commit] for managing git hooks\n-   [GitHub Actions] for CI/CD\n-   [MkDocs] and [mkdocs-material] for documentation\n-   [GitHub Pages] for hosting documentation\n-   [semantic-release] and [gitmoji] for automated releases\n-   Publishes to [PyPI] and [Docker Hub]\n\n## Quickstart Guide\n\n### Requirements\n\nInstall [cookiecutter]:\n\n```shell\npipx install cookiecutter\n```\n\n[pipx] is preferred, but you can also install with `pip install --user`.\n\n### Creating a project\n\n#### Cookiecutter\n\nGenerate a Python project:\n\n```shell\ncookiecutter gh:juftin/cookiecutter-python\n```\n\n#### Git Init\n\nChange to the root directory of your new project, create a Git\nrepository, and install [pre-commit]\n\n```shell\ngit init\npre-commit install\ngit add .\npre-commit run --all-files\ngit add .\ngit commit\n```\n\nAlso, make sure to commit your lockfiles, they're created at `requirements.txt`\nand in the `requirements` directory. They will be created automatically\nwhen you run a `hatch` command in the respective environment for the first time.\n\n```shell\nhatch run cov\nhatch run lint:all\nhatch run docs:serve\ngit add requirements.txt requirements/\ngit commit -m \"🔐 add lockfiles\"\n```\n\n#### Secrets Init\n\nThis project uses GitHub Actions to deploy releases, documentation, and\nto publish artifacts to PyPI / Docker Hub. You will need to create\nsecrets in your GitHub repository to enable these features.\n\n-   `PERSONAL_ACCESS_TOKEN`: A GitHub Personal Access Token with `repo` permissions\n-   `PYPI_TOKEN`: Your PyPI token (optional)\n-   `DOCKER_USERNAME`: Your Docker Hub username (optional)\n-   `DOCKER_TOKEN`: Your Docker Hub token (optional)\n\nA `.env` file is provided in the project root for local development, to\nsync your secrets to GitHub, run the following command with the [GitHub CLI]:\n\n```shell\ngh secret set --env-file .env\n```\n\n#### cruft\n\n[cruft] is a tool for updating cookiecutter templates after they've been\ngenerated. To use cruft, install it with `pipx`:\n\n```shell\npipx install cruft\n```\n\nThen, use `cruft` instead of `cookiecutter` to generate your project:\n\n```shell\ncruft create https://github.com/juftin/cookiecutter-python\n```\n\nLater, if you want to update your project with the latest changes from\nthe template:\n\n```shell\ncruft update\n```\n\n#### Developing\n\nThis project generates its own documentation for how to use the\nproject's tools. To view the documentation locally, run:\n\n```shell\nhatch run docs:serve\n```\n\nOnce the server is running, you can view the documentation at\n[localhost:8080/contributing] or see a preview at [juftin.com/cookiecutter-python/contributing].\n\n[pre-commit]: https://github.com/pre-commit/pre-commit\n[gitmoji]: https://gitmoji.dev\n[semantic-release]: https://github.com/semantic-release/semantic-release\n[Cookiecutter]: https://github.com/cookiecutter/cookiecutter\n[hatch]: https://github.com/pypa/hatch\n[MkDocs]: https://github.com/mkdocs/mkdocs\n[mkdocs-material]: https://github.com/squidfunk/mkdocs-material\n[Github Actions]: https://github.com/features/actions\n[Github Pages]: https://pages.github.com/\n[juftin]: https://github.com/juftin\n[pipx]: https://github.com/pypa/pipx\n[PyPI]: https://pypi.org/\n[Docker Hub]: https://hub.docker.com/\n[hatch-pip-compile]: https://github.com/juftin/hatch-pip-compile\n[GitHub CLI]: https://cli.github.com/\n[localhost:8080/contributing]: http://localhost:8080/contributing\n[ruff]: https://github.com/astral/ruff/\n[mypy]: https://github.com/python/mypy\n[juftin.com/cookiecutter-python/contributing]: https://juftin.com/cookiecutter-python/contributing/\n[cruft]: https://github.com/cruft/cruft\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuftin%2Fcookiecutter-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjuftin%2Fcookiecutter-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuftin%2Fcookiecutter-python/lists"}