Skip to main content

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.

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

Project details


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.

Supported by

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