{"id":15057023,"url":"https://github.com/withprecedent/snickerdoodle","last_synced_at":"2025-04-10T10:05:05.985Z","repository":{"id":187591558,"uuid":"676273607","full_name":"WithPrecedent/snickerdoodle","owner":"WithPrecedent","description":"Easy-to-use, general-purpose, modern cookiecutter template for Python","archived":false,"fork":false,"pushed_at":"2024-11-27T16:49:29.000Z","size":1597,"stargazers_count":2,"open_issues_count":3,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-24T08:55:00.673Z","etag":null,"topics":["badges","cookiecutter","editorconfig","github-actions","mkdocs","mkdocs-material","pdm","pre-commit","ruff","template"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/WithPrecedent.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":"2023-08-08T20:36:25.000Z","updated_at":"2024-11-27T16:48:40.000Z","dependencies_parsed_at":"2023-08-11T09:58:21.536Z","dependency_job_id":"eb8a3b9b-3bfb-41b9-b2d8-d7c0501b49f1","html_url":"https://github.com/WithPrecedent/snickerdoodle","commit_stats":null,"previous_names":["withprecedent/snickerdoodle"],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WithPrecedent%2Fsnickerdoodle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WithPrecedent%2Fsnickerdoodle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WithPrecedent%2Fsnickerdoodle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WithPrecedent%2Fsnickerdoodle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WithPrecedent","download_url":"https://codeload.github.com/WithPrecedent/snickerdoodle/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248198879,"owners_count":21063628,"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":["badges","cookiecutter","editorconfig","github-actions","mkdocs","mkdocs-material","pdm","pre-commit","ruff","template"],"created_at":"2024-09-24T22:00:59.881Z","updated_at":"2025-04-10T10:05:05.951Z","avatar_url":"https://github.com/WithPrecedent.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# snickerdoodle\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://github.com/WithPrecedent/snickerdoodle/blob/main/docs/img/snickerdoodle.png?raw=true\" alt=\"snickerdoodle cookie logo\" style=\"width:250px;\"/\u003e\n\u003c/p\u003e\n\n| | |\n| --- | --- |\n| Version | [![PyPI Latest Release](https://img.shields.io/pypi/v/snickerdoodle.svg?style=for-the-badge\u0026color=steelblue\u0026label=PyPI\u0026logo=PyPI\u0026logoColor=yellow)](https://pypi.org/project/snickerdoodle/) [![GitHub Latest Release](https://img.shields.io/github/v/tag/WithPrecedent/snickerdoodle?style=for-the-badge\u0026color=navy\u0026label=GitHub\u0026logo=github)](https://github.com/WithPrecedent/snickerdoodle/releases)\n| Status | [![Development Status](https://img.shields.io/badge/Development-Active-seagreen?style=for-the-badge\u0026logo=git)](https://www.repostatus.org/#active) [![Project Stability](https://img.shields.io/pypi/status/snickerdoodle?style=for-the-badge\u0026logo=pypi\u0026label=Stability\u0026logoColor=yellow)](https://pypi.org/project/snickerdoodle/)\n| Documentation | [![Hosted By](https://img.shields.io/badge/hosted_by-GitHub_Pages-blue?style=for-the-badge\u0026color=navy\u0026logo=github)](https://withprecedent.github.io/snickerdoodle)\n| Compatibility | [![Compatible Python Versions](https://img.shields.io/pypi/pyversions/snickerdoodle?style=for-the-badge\u0026color=steelblue\u0026label=Python\u0026logo=python\u0026logoColor=yellow)](https://pypi.python.org/pypi/snickerdoodle/) [![Linux](https://img.shields.io/badge/Linux-lightseagreen?style=for-the-badge\u0026logo=linux\u0026labelColor=gray\u0026logoColor=white)](https://www.linux.org/) [![MacOS](https://img.shields.io/badge/MacOS-snow?style=for-the-badge\u0026logo=apple\u0026labelColor=gray)](https://www.apple.com/macos/) [![Windows](https://img.shields.io/badge/Windows-blue?style=for-the-badge\u0026logo=warp\u0026labelColor=gray)](https://www.microsoft.com/en-us/windows?r=1)\n| Stats | [![PyPI Download Rate (per month)](https://img.shields.io/pypi/dm/snickerdoodle?style=for-the-badge\u0026color=steelblue\u0026label=Downloads%20💾\u0026logo=pypi\u0026logoColor=yellow)](https://pypi.org/project/snickerdoodle) [![GitHub Stars](https://img.shields.io/github/stars/withprecedent/snickerdoodle?style=for-the-badge\u0026color=navy\u0026label=Stars%20⭐\u0026logo=github)](https://github.com/withprecedent/snickerdoodle/stargazers) [![GitHub Contributors](https://img.shields.io/github/contributors/withprecedent/snickerdoodle?style=for-the-badge\u0026color=navy\u0026label=Contributors%20🙋\u0026logo=github)](https://github.com/withprecedent/snickerdoodle/graphs/contributors) [![GitHub Issues](https://img.shields.io/github/issues/withprecedent/snickerdoodle?style=for-the-badge\u0026color=navy\u0026label=Issues%20📘\u0026logo=github)](https://github.com/withprecedent/snickerdoodle/graphs/contributors) [![GitHub Forks](https://img.shields.io/github/forks/withprecedent/snickerdoodle?style=for-the-badge\u0026color=navy\u0026label=Forks%20🍴\u0026logo=github)](https://github.com/withprecedent/snickerdoodle/forks) |\n| | |\n\n## What is snickerdoodle?\n\n`snickerdoodle` is an easy-to-use, general-purpose cookiecutter template for\nPython projects utilizing modern tools and best practices. To see an example repository using this template,\ncheck out\n[`snickerdoodle_demo`](https://github.com/withprecedent/snickerdoodle_demo).\n\n## Why use snickerdoodle?\n\nThere are a lot of cookiecutter templates. However, many are difficult to use,\noverly opinionated, or underdocumented. I created `snickerdoodle` because I\ncouldn't\nfind another `cookiecutter` template meeting these criteria:\n\n* **Modern**: follows best practices, using modern, actively developed tools.\n* **Batteries Included**: allows you to start coding immediately.\n* **Flexible**: no required usage of any external services.\n  (SonarCloud, Travis, CircleCI, Tox, etc.).\n* **Low-Maintenance**: every commit automatically deploys the documentation as\n  well as\n  lints, formats, and tests the repository.\n* **Well-Documented**: the\n  [documentation](https://withprecedent.github.io/snickerdoodle) includes\n  complete guides for [new](https://withprecedent.github.io/snickerdoodle/tutorial/) and [advanced](https://withprecedent.github.io/snickerdoodle/advanced/) users.\n* **PEP-Compliant**: all included tools follow accepted\n  [PEPs](https://peps.python.org/pep-0001/) (unfortunately, that ruled out using\n  `poetry`, which is [still not](https://github.com/python-poetry/roadmap/issues/3) [PEP 621](https://peps.python.org/pep-0621/) or\n  [PEP 631](https://peps.python.org/pep-0631/)\n  compliant, three years after they were accepted,\n  [resulting in compatibility](https://github.com/python-poetry/poetry/issues/496)\n  [problems because of its](https://github.com/python-poetry/poetry/issues/3332)\n  [non-standard `pyproject.toml` format](https://github.com/python-poetry/poetry/issues/8415)).\n\n### Tools\n\nTo accomplish those goals, `snickerdoodle` includes modern, stable tools for package construction and\nmanagement that do not require any external services or costs:\n\n* Dependency Management: [![Dependency Manager](https://img.shields.io/badge/PDM-mediumpurple?style=flat-square\u0026logo=pdm\u0026labelColor=gray)](https://PDM.fming.dev) and [![Dependency Maintainer](https://img.shields.io/badge/dependabot-navy?style=flat-square\u0026logo=dependabot\u0026logoColor=white\u0026labelColor=gray)](https://github.com/dependabot)\n* Documentation:\n  [![Documentation Tool](https://img.shields.io/badge/MkDocs-magenta?style=flat-square\u0026color=deepskyblue\u0026logo=markdown\u0026labelColor=gray)](https://www.mkdocs.org/)\n  with the [![Documentation Theme](https://img.shields.io/badge/Material-magenta?style=flat-square\u0026color=deepskyblue\u0026logo=material-design\u0026logoColor=white\u0026labelColor=gray)](https://squidfunk.github.io/mkdocs-material/) theme\n  on [![Documentation Host](https://img.shields.io/badge/GitHub_Pages-blue?style=flat-square\u0026color=navy\u0026logo=github\u0026labelColor=gray)](https://withprecedent.github.io/snickerdoodle)\n* Testing: [![Testing](https://img.shields.io/badge/pytest-steelblue?style=flat-square\u0026logo=pytest\u0026logoolor=white\u0026labelColor=gray)](https://github.com/TezRomacH/python-package-template/blob/master/.pre-commit-config.yaml)\n* CI/CD: [![CI](https://img.shields.io/badge/GitHub_Actions-navy?style=flat-square\u0026logo=githubactions\u0026labelColor=gray\u0026logoColor=white)](https://github.com/features/actions)\n* Code Style:\n  [![Linter](https://img.shields.io/endpoint?style=flat-square\u0026url=https://raw.githubusercontent.com/charliermarsh/Ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/Ruff),\n  [![Pre-commit](https://img.shields.io/badge/pre--commit-darkolivegreen?style=flat-square\u0026logo=pre-commit\u0026logoColor=white\u0026labelColor=gray)](https://github.com/TezRomacH/python-package-template/blob/master/.pre-commit-config.yaml),\n  and [![Editor Settings](https://img.shields.io/badge/Editor_Config-paleturquoise?style=flat-square\u0026logo=editorconfig\u0026labelColor=gray)](https://editorconfig.org/)\n* Templating: [![Template Manager](https://img.shields.io/badge/Cookiecutter-bisque?style=flat-square\u0026logo=cookiecutter\u0026labelColor=gray)](https://www.cookiecutter.io/)\n\n### Options\n\nIn addition to the included tools above, `snickerdoodle` includes several\noptions in the `cookiecutter` questionnaire that can be automatically applied\nas part of the templating process:\n\n* Badge Style: [![flat\n  style](https://img.shields.io/badge/flat-crimson?style=flat)](https://www.shields.io/),\n  [![flat-square\n  style](https://img.shields.io/badge/flat--square-orange?style=flat-square)](https://www.shields.io/),\n  [![for-the-badge\n  style](https://img.shields.io/badge/For--the--badge-blue?style=for-the-badge)](https://www.shields.io/),\n  [![plastic\n  style](https://img.shields.io/badge/plastic-purple?style=plastic)](https://www.shields.io/),\n or [![social\n  style](https://img.shields.io/badge/social-red?style=social)](https://www.shields.io/)\n* Push an [Initial Commit](https://github.com/WithPrecedent/snickerdoodle_demo) to GitHub\n* Build and Deploy [Basic Documentation](https://withprecedent.github.io/snickerdoodle_demo/) to GitHub Pages\n* Create a Virtual Environment in the Repository's \".venv\" Folder\n\n## Getting started\n\n### Setup\n\nIf you are new to `cookiecutter` or simply want to guarantee that the created repository works as intended, follow the instructions in the [`snickerdoodle` tutorial](https://withprecedent.github.io/snickerdoodle/tutorial/).\n\nIf you are familiar with `cookiecutter` templates, you can go about the\nnormal construction process. However, if you do not select the optional\nautomatic setup features in the questionnaire, you should follow the instructions\nfor manually setting up your [virtual\nenvironment](https://withprecedent.github.io/snickerdoodle/tutorial/#Create-Virtual-Environment)\nand [deploying your\ndocumentation](https://withprecedent.github.io/snickerdoodle/tutorial/#Deploy-Documentation)\nin the [`snickerdoodle`\ntutorial](https://withprecedent.github.io/snickerdoodle/tutorial/). It is\nespecially important to follow the document deployment process for your initial deployment - after that GitHub Actions will automatically update and redeploy the\ndocumentation (and you need not use the manual process again).\n\n### Usage\n\nAfter your repository is created, you can start coding right away. Every push to GitHub will run any tests in the \"tests\" folder,\ndeploy documentation to GitHub Pages, and apply `ruff` for linting and\nformatting. For more information about the following topics, just click on the\ncorresponding hyperlink.\n\n* [Formatting and Linting](https://withprecedent.github.io/snickerdoodle/advanced/#formatting-and-linting)\n* [GitHub Actions](https://withprecedent.github.io/snickerdoodle/advanced/#github-actions)\n* [Publishing](https://withprecedent.github.io/snickerdoodle/advanced/#publishing)\n* [Repository Layout](https://withprecedent.github.io/snickerdoodle/advanced/#repository-layout)\n* [Versioning](https://withprecedent.github.io/snickerdoodle/advanced/#versioning)\n\n## Contributing\n\nContributors are always welcome and should find `snickerdoodle` easy to work\nwith. The template is highly documented so that users and developers can adapt\nor extend `snickerdoodle` to work with their projects. So, forking and creating\ndifferent template spins is encouraged. If you want to contribute directly, feel free to grab an [issue](https://github.com/WithPrecedent/snickerdoodle/issues) to work on\nor make a suggested improvement. If you wish to contribute, please read the\n[Contribution Guide](./contributing.md) and [Code of\nConduct](./code_of_conduct.md).\n\n## Similar Projects\n\nThese are other `cookiecutter` templates using `pdm` as their dependency manager:\n\n* [cookiecutter-docker-python-pdm](https://github.com/mnako/cookiecutter-docker-python-pdm): uses Docker and `black`.\n* [cookie](https://github.com/chris-santiago/cookie): uses `mkdocs` and GitHub Actions, but also adds `conda`, `nox`, `black`, and `pyright`.\n\nAnd, these are other general-purpose `cookiecutter` templates that are well-maintained, modern, and well-documented:\n\n* [cookiecutter-hypermodern-python](https://github.com/cjolowicz/cookiecutter-hypermodern-python): uses, among other tools, `sphinx`, GitHub Actions, `nox`, `mypy`, `flake8`, and `poetry`. If you do not mind those choices and wanted a modern, maintained template, this is the one to use.\n* [cookiecutter-pylibrary](https://github.com/ionelmc/cookiecutter-pylibrary): a newer template that is minimal compared to most and uses, among other tools, `sphinx`, GitHub Actions, `setuptools`, Tox, and Travis-CI.\n* [wolt python package cookiecutter](https://github.com/woltapp/wolt-python-package-cookiecutter): an interesting template that uses [`cruft`](https://github.com/cruft/cruft) instead of base `cookiecutter`. The created repository uses, among other tools, `mkdocs`, GitHub Actions, `black`, `flake8`, and `poetry`.\n\nIf you are interested in going beyond `cookiecutter` (or its forks),\n[`copier`](https://github.com/copier-org/copier) is a powerful, newer templating package\nand there is a great template that incorporates\nseveral of the tools used in `snickerdoodle`:\n\n* [copier-pdm](https://github.com/pdm-project/copier-pdm): includes, among other\n tools, `pdm`,\n  `mkdocs`, and `ruff`.\n\n## Acknowledgements\n\nI'd also like to extend a special thanks to [pawamoy](https://github.com/pawamoy) whose excellent `pdm` and `mkdocs` extensions and utlities are incorporated into `snickerdoodle`. Some of the scripts, documentation, configuration files, and other CI code were all adapted from pawamoy's repositories.\n\nI would also like to thank the University of Kansas School of Law for tolerating and supporting this law professor's coding efforts, an endeavor which is well outside the typical scholarly activities in the discipline.\n\n## License\n\n[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg?style=for-the-badge\u0026color=firebrick\u0026logo=apache)](https://opensource.org/licenses/Apache-2.0)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwithprecedent%2Fsnickerdoodle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwithprecedent%2Fsnickerdoodle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwithprecedent%2Fsnickerdoodle/lists"}