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

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyshipit-0.1.0.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyshipit-0.1.0-py3-none-any.whl (12.7 kB view details)

Uploaded Python 3

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

Hashes for pyshipit-0.1.0.tar.gz
Algorithm Hash digest
SHA256 571934799f12998befcf0d5061ca50346e2a229f5556e08135c2997fa881572e
MD5 b4ce288cb4e5ef05be10afef0ba312a2
BLAKE2b-256 48d03e08403d826fee19d55a7af7e89ec101bf56bc64ab5a6c152acef30d8203

See more details on using hashes here.

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

Hashes for pyshipit-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0ef3d646139863d15a1ca66aa349c3945c854505cf2003984ca3f6c638a70b44
MD5 a4c545c6eb6f946952313e771422efac
BLAKE2b-256 d85c1e0e68f385cf7a2177aeb50493028e5ff25d404c8b900bc31d8548a6a3a5

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page