🚀 pyshipit
Publish Python packages to PyPI without the pain. One CLI for init, build, bump, check, and publish.
🤔 Why pyshipit?
Publishing a Python package today means juggling pyproject.toml syntax, build, twine, version bumps, and remembering to clean dist/ every time. One typo and you get a cryptic 403 from PyPI.
pyshipit wraps the whole workflow into five simple commands.
pyshipit init # interactively create pyproject.toml
pyshipit check # verify your project is ready to publish
pyshipit build # clean + build wheel and sdist
pyshipit bump patch # 1.0.0 → 1.0.1
pyshipit publish # upload to PyPI with helpful error messages
📦 Installation
pip install pyshipit
🚀 Quick Start
mkdir my-new-package && cd my-new-package
pyshipit init
# answers a few questions, writes pyproject.toml + README.md
pyshipit check
# ✅ pyproject.toml found
# ✅ Version found: 0.1.0
# ⚠️ No LICENSE file found
pyshipit build
# ✅ Build complete! 2 files in dist/
pyshipit publish
# uploads dist/* to PyPI, with __token__ guidance built in
📖 Commands
pyshipit init
Interactively generates a complete pyproject.toml — asks for name, version, description, author, license, dependencies, keywords, and whether it's a CLI tool (adds an entry point automatically).
pyshipit check
Runs a pre-publish checklist:
- pyproject.toml exists and has a valid version
- README.md / LICENSE present
- Package folder has
__init__.pywith real content buildandtwineare installed
🔍 pyshipit check
✅ pyproject.toml found
✅ Version found: 0.1.0
✅ README.md found (842 bytes)
⚠️ No LICENSE file found
→ Add a LICENSE file (MIT is common)
✅ Package folder(s) found: mypackage
✅ mypackage/__init__.py has content
⚠️ No dist/ folder found
→ Run 'pyshipit build' to build first
✅ 'build' is installed
✅ 'twine' is installed
Results: 6 passed | 2 warnings | 0 failed
✨ Ready to publish (with minor warnings). Run 'pyshipit publish'.
pyshipit build
Cleans old dist/, build/, and *.egg-info folders, then runs python -m build, and lists the resulting files with sizes.
pyshipit bump <major|minor|patch>
Bumps the version in pyproject.toml using semantic versioning rules.
pyshipit bump patch # 1.2.3 → 1.2.4
pyshipit bump minor # 1.2.3 → 1.3.0
pyshipit bump major # 1.2.3 → 2.0.0
pyshipit publish
Runs twine upload dist/*, but first shows exactly what will be uploaded, reminds you to use __token__ as the username, and on failure prints the most common fixes (name taken, bad token, version already exists).
🆚 pyshipit vs the manual way
| Task | Manual | pyshipit |
|---|---|---|
| Create pyproject.toml | Copy a template, edit by hand | pyshipit init |
| Clean + build | rm -rf dist build *.egg-info && python -m build |
pyshipit build |
| Bump version | Find and edit the line by hand | pyshipit bump patch |
| Pre-flight checks | None — find out via a 403 error | pyshipit check |
| Publish | Remember twine syntax + token format | pyshipit publish |
🧪 Running Tests
pip install pytest
pytest tests/ -v
📄 License
MIT — free to use in personal and commercial projects.
🤝 Contributing
Pull requests welcome! Open an issue first to discuss any large changes.
- Fork the repo
- Create a branch:
git checkout -b feature/my-feature - Make your changes + add tests
- Open a Pull Request
Metadata
Release files for pyshipit 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyshipit-0.1.0.tar.gz | 12.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyshipit-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 24.9 kB
Release files / pyshipit-0.1.0.tar.gz
| Download URL | pyshipit-0.1.0.tar.gz |
|---|---|
| Size | 12.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
571934799f12998befcf0d5061ca50346e2a229f5556e08135c2997fa881572e
|
|
BLAKE2b-256 checksum How to use checksums |
48d03e08403d826fee19d55a7af7e89ec101bf56bc64ab5a6c152acef30d8203
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.5
|
Release files / pyshipit-0.1.0-py3-none-any.whl
| Download URL | pyshipit-0.1.0-py3-none-any.whl |
|---|---|
| Size | 12.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0ef3d646139863d15a1ca66aa349c3945c854505cf2003984ca3f6c638a70b44
|
|
BLAKE2b-256 checksum How to use checksums |
d85c1e0e68f385cf7a2177aeb50493028e5ff25d404c8b900bc31d8548a6a3a5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.5
|