Skip to main content

🚀 pyshipit

Publish Python packages to PyPI without the pain. One CLI for init, build, bump, check, and publish.

Python 3.8+ License: MIT


🤔 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__.py with real content
  • build and twine are 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.

  1. Fork the repo
  2. Create a branch: git checkout -b feature/my-feature
  3. Make your changes + add tests
  4. 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)

Source distribution for pyshipit 0.1.0
File Size Uploaded
pyshipit-0.1.0.tar.gz 12.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyshipit 0.1.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page