{"id":19874103,"url":"https://github.com/pythoninthegrass/mvp","last_synced_at":"2025-05-02T10:30:55.300Z","repository":{"id":191954404,"uuid":"685622911","full_name":"pythoninthegrass/mvp","owner":"pythoninthegrass","description":"minimum viable python","archived":false,"fork":false,"pushed_at":"2025-04-13T05:05:34.000Z","size":3755,"stargazers_count":3,"open_issues_count":6,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-13T05:28:46.811Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pythoninthegrass.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING","funding":".github/FUNDING.yml","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,"zenodo":null},"funding":{"github":["pythoninthegrass"]}},"created_at":"2023-08-31T16:34:17.000Z","updated_at":"2025-04-13T05:05:12.000Z","dependencies_parsed_at":"2023-09-01T18:18:47.093Z","dependency_job_id":"5a2777e7-ec09-4244-9ed4-08c7b78bddc9","html_url":"https://github.com/pythoninthegrass/mvp","commit_stats":null,"previous_names":["pythoninthegrass/mvp"],"tags_count":2,"template":true,"template_full_name":"pythoninthegrass/python_template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoninthegrass%2Fmvp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoninthegrass%2Fmvp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoninthegrass%2Fmvp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoninthegrass%2Fmvp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pythoninthegrass","download_url":"https://codeload.github.com/pythoninthegrass/mvp/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252023197,"owners_count":21682139,"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":[],"created_at":"2024-11-12T16:21:44.156Z","updated_at":"2025-05-02T10:30:55.294Z","avatar_url":"https://github.com/pythoninthegrass.png","language":"Shell","readme":"\u003c!-- markdownlint-disable MD022 MD031 MD036 MD032 --\u003e\n# mvp\n\n\u003c!-- ![\"It's dangerous to go alone! Take this.\"](static/image.jpg) --\u003e\n\u003c!-- \u003cimg src=\"https://user-images.githubusercontent.com/4097471/144654508-823c6e31-5e10-404c-9f9f-0d6b9d6ce617.jpg\" width=\"300\"\u003e --\u003e\n\n**minimum viable python**\n\n## Summary\nSets up a new development environment for a Mac or Linux (i.e., UNIX) box.\n\n**Table of Contents**\n* [mvp](#mvp)\n  * [Summary](#summary)\n  * [Setup](#setup)\n    * [Minimum requirements](#minimum-requirements)\n    * [Recommended requirements](#recommended-requirements)\n  * [Development](#development)\n    * [Cookiecutter](#cookiecutter)\n    * [Devbox](#devbox)\n    * [Taskfile](#taskfile)\n    * [Tilt](#tilt)\n  * [TODO](#todo)\n  * [Further Reading](#further-reading)\n\n## Setup\n\n### Minimum requirements\n\n* [Python 3.11](https://www.python.org/downloads/)\n\n### Recommended requirements\n\n* [asdf](https://asdf-vm.com/guide/getting-started.html)\n* [devbox](https://www.jetpack.io/devbox/docs/quickstart/)\n* [task](https://taskfile.dev/#/installation)\n\n## Development\n\n### Cookiecutter\n\n* [Install cookiecutter](https://cookiecutter.readthedocs.io/en/stable/README.html#installation)\n\n    ```bash\n    # asdf (my vote)\n    asdf plugin add cookiecutter\n    asdf install cookiecutter latest\n    asdf set -u cookiecutter latest\n\n    # pipx\n    pipx install cookiecutter\n\n    # python user directory\n    python -m pip install --user cookiecutter\n    ```\n\n* Use cookiecutter to create a new project\n\n    ```bash\n    # interactive\n    cookiecutter gh:pythoninthegrass/mvp\n\n    # non-interactive\n    cookiecutter gh:pythoninthegrass/mvp\n\n    # local debugging\n    cd /tmp\n    cookiecutter ~/git/mvp --no-input -f\n    ```\n\n### Devbox\n\nDevbox takes care of setting up a dev environment automatically.\n\nUnder the hood it uses [Nix Package Manager](https://search.nixos.org/packages).\n\n```bash\n# install base dependencies\nmake install\n\n# install devbox\ntask install-devbox\n\n# enter dev environment w/deps\ndevbox shell\n\n# run repl\npython\n\n# exit dev environment\nexit\n\n# run tests\ndevbox run test\n```\n\n### Taskfile\n```bash\nλ task\ntask: [default] task --list\ntask: Available tasks for this project:\n* default:               Default task\n* format:                Run formatters\n* install:               Install project dependencies\n* install-devbox:        Install devbox\n* lint:                  Run linters\n* pre-commit:            Run pre-commit hooks\n* pyclean:               Remove .pyc and __pycache__\n* test:                  Run tests\n* docker:build:          Build the docker image\n* docker:down:           Stop and remove containers, networks, and volumes with docker compose\n* docker:exec:           Shell into a running container\n* docker:login:          Login to the container registry\n* docker:logs:           Follow the logs of a running container\n* docker:net:            Create docker network\n* docker:prune:          Prune docker\n* docker:push:           Push the docker image to the registry\n* docker:stop:           Stop the project with docker compose\n* docker:up:             Start the project with docker compose\n* docker:vol:            Create docker volume\n* orbstack:create:       Create an orbstack VM        (aliases: orb:create)\n* orbstack:delete:       Delete an orbstack VM        (aliases: orb:delete)\n* orbstack:exec:         SSH into an orbstack VM      (aliases: orb:exec)\n* orbstack:list:         List orbstack VMs            (aliases: orb:list)\n* orbstack:start:        Start an orbstack VM         (aliases: orb:start)\n* orbstack:stop:         Stop an orbstack VM          (aliases: orb:stop)\n* orbstack:update:       Update orbstack app          (aliases: orb:update)\n* redis:start:           Start Redis server\n* redis:stop:            Stop Redis server\n* uv:export-reqs:        Export requirements.txt\n* uv:install:            Install project dependencies\n* uv:install-uv:         Install uv\n* uv:lock:               Update the project's lockfile.\n* uv:sync:               Sync dependencies with lockfile\n* uv:update-deps:        Update dependencies\n* uv:venv:               Create a virtual environment                                                    \n```\n\n### Tilt\n```bash\nminikube start --memory=2048 --cpus=2 --kubernetes-version=v1.28.3 -p minikube\ngit clone https://github.com/tilt-dev/tilt-example-python\ncd tilt-example-python/3-recommended\ntilt up\nminikube stop\nminikube delete\nrm -rf tilt-example-python\n```\n\n## TODO\n* [Open Issues](https://github.com/pythoninthegrass/mvp/issues)\n* QA [Ansible playbook](ansible/playbook.yml)\n  * Test\n    * macOS\n    * Ubuntu\n* Write boilerplate pytest tests\n* CI/CD\n\n## Further Reading\n* [python](https://www.python.org/)\n* [asdf](https://asdf-vm.com/guide/getting-started.html#_2-download-asdf)\n* [poetry](https://python-poetry.org/docs/)\n* [docker-compose](https://docs.docker.com/compose/install/)\n* [pre-commit hooks](https://pre-commit.com/)\n","funding_links":["https://github.com/sponsors/pythoninthegrass"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpythoninthegrass%2Fmvp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpythoninthegrass%2Fmvp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpythoninthegrass%2Fmvp/lists"}