Publish Python packages without the pain — init, build, bump, check, publish.
Project description
🚀 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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyshipit-0.1.0.tar.gz.
File metadata
- Download URL: pyshipit-0.1.0.tar.gz
- Upload date:
- Size: 12.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
571934799f12998befcf0d5061ca50346e2a229f5556e08135c2997fa881572e
|
|
| MD5 |
b4ce288cb4e5ef05be10afef0ba312a2
|
|
| BLAKE2b-256 |
48d03e08403d826fee19d55a7af7e89ec101bf56bc64ab5a6c152acef30d8203
|
File details
Details for the file pyshipit-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pyshipit-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ef3d646139863d15a1ca66aa349c3945c854505cf2003984ca3f6c638a70b44
|
|
| MD5 |
a4c545c6eb6f946952313e771422efac
|
|
| BLAKE2b-256 |
d85c1e0e68f385cf7a2177aeb50493028e5ff25d404c8b900bc31d8548a6a3a5
|