Skip to main content

Python bytecode compiler and PyPI publishing toolkit for monorepos

Project description

sage-pypi-publisher

A tiny toolkit to compile Python packages to bytecode, build wheels, and publish to PyPI/TestPyPI. Extracted from SAGE's internal sage-dev tooling and made standalone.

Features

  • Copy a package tree and compile .py.pyc (keeps __init__.py and _version.py).
  • Auto-adjust pyproject.toml / MANIFEST.in to include compiled artifacts and binary extensions.
  • Build wheels with python -m build.
  • 🚀 NEW: Smart --for-pypi mode - one command for perfect PyPI publishing!
  • NEW: Universal wheel support - one wheel works on all Python 3.x versions!
  • NEW: Source distribution (sdist) support - users can install from source on any version
  • Upload via twine (with --dry-run by default).
  • Simple Typer-based CLI.

Solving the Multi-Version Problem

Problem: Your package declares support for Python 3.8-3.12, but you only upload a wheel for Python 3.11. Users on other versions can't install it!

Solution: sage-pypi-publisher now uses Smart Mode by default 🎯

# That's it! No extra flags needed - smart mode is automatic
sage-pypi-publisher build . --upload --no-dry-run

What happens automatically:

  • Pure Python packages: Builds universal wheel (py3-none-any) that works on ALL Python 3.x versions!
  • Packages with C extensions: Builds for current Python + provides source code for others
  • ✅ Always includes source distribution (sdist) as fallback
  • ✅ No need to build wheels for each Python version separately!

Why this works:

  • Universal wheel (py3-none-any): One file works on Python 3.8, 3.9, 3.10, 3.11, 3.12, and future versions!
  • Source distribution: If universal wheel doesn't work, users can compile from source
  • Zero configuration: Works perfectly out of the box!

Installation

pip install .
# or
pip install sage-pypi-publisher

CLI

Quick Start

🎯 Simplest Usage (Smart Mode - Default!)

# Just build - automatically chooses best strategy!
sage-pypi-publisher build .

# Build and upload to TestPyPI
sage-pypi-publisher build . --upload -r testpypi

# Build and upload to PyPI (production)
sage-pypi-publisher build . --upload --no-dry-run -r pypi

What Smart Mode Does (Automatically):

  • 🔍 Detects if your package is pure Python or has C extensions
  • 📦 Pure Python → builds universal wheel (works on ALL Python 3.x!)
  • 🔧 C extensions → builds for current Python version
  • 📚 Always includes source distribution (sdist)
  • ✅ Perfect for packages declaring Python 3.8+ support!

Manual Control (Advanced):

# Disable smart mode (old behavior - current Python only)
sage-pypi-publisher build . --no-for-pypi

# Force universal wheel
sage-pypi-publisher build . --universal

# Force specific mode
sage-pypi-publisher build . --mode public

All Commands

sage-pypi-publisher --help

# 🎯 Simplest: Build with smart mode (default!)
sage-pypi-publisher build .

# Build and upload to PyPI
sage-pypi-publisher build . --upload --no-dry-run

# Compile only (bytecode mode by default)
sage-pypi-publisher compile /path/to/pkg -o /tmp/out

# Compile in public mode (keep source)
sage-pypi-publisher compile /path/to/pkg -o /tmp/out --mode public

# Disable smart mode (old behavior)
sage-pypi-publisher build /path/to/pkg --no-for-pypi

# Force universal wheel (manual override)
sage-pypi-publisher build /path/to/pkg --universal

# Force manylinux build for C/C++ extensions
sage-pypi-publisher build /path/to/pkg --force-manylinux

# Upload an existing wheel
sage-pypi-publisher upload dist/yourpkg-0.1.0-py3-none-any.whl -r pypi --no-dry-run

Build Modes

  • --mode private (default): Compile to .pyc bytecode (保密模式 - protects source code)
  • --mode public: Keep .py source files (公开模式 - open source)
  • Aliases: bytecode = private, source = public

Python API

Basic Usage

fromPyPI Publishing Options

**Smart Mode (Default) 🎯**
- **Enabled automatically** - no flags needed!
- Pure Python  universal wheel + sdist
- C extensions  current Python wheel + sdist
- Use `--no-for-pypi` to disable

**Manual Override:**
- **`--universal`**: Force universal wheel (py3-none-any) - only works for pure Python packages
- **`--sdist`**: Add source distribution (.tar.gz)
- **`--no-for-pypi`**: Disable smart mode, build for current Python only

**Why NOT build wheels for each Python version?**

You might wonder: "Why not build cp38, cp39, cp310, cp311, cp312 wheels separately?"

**Technical limitation**: To build a wheel for Python 3.10, you need Python 3.10 installed and running. You can't build a true Python 3.10 wheel from Python 3.11 environment.

**Better solution**: 
- Pure Python packages  Use universal wheel (py3-none-any) - ONE wheel for ALL versions!
- C extensions  Provide source distribution (sdist) so users can compile for their Python version
- For production C extensions with multiple versions  Use `cibuildwheel` in CI/CD
wheeUniversal Wheel (Recommended for Pure Python)
```python
from pathlib import Path
from pypi_publisher.compiler import BytecodeCompiler

# For pure Python packages
compiler = BytecodeCompiler(Path("/path/to/pkg"), mode="public")
compiled = compiler.compile_package()

# Build universal wheel (works on ALL Python 3.x)
universal_wheel = compiler.build_universal_wheel(compiled)

# Build source distribution
sdist = compiler.build_sdist(compiled)

# Upload both
for artifact in [universal_wheel, sdist]:
    compiler.upload_wheel(artiface_package()

# Build source distribution
sdist = compiler.build_sdist(compiled)
compiler.upload_wheel(sdist, repository="pypi", dry_run=False)

Git Hooks

sage-pypi-publisher provides intelligent git hooks to simplify version management and PyPI publishing.

Installation

sage-pypi-publisher install-hooks .

Features

  • Auto-detection: Detects version changes in pyproject.toml on push.
  • Interactive Update: Prompts to update version if forgotten.
  • Auto-Publish: Builds and uploads to PyPI automatically upon confirmation.
  • Smart Build: Detects C/C++ extensions for manylinux wheels.

Notes

  • Requires python -m build and twine available.
  • No backward compatibility with sage-dev CLI; PyPI commands have been removed from SAGE.
  • Designed to be monorepo-friendly but works with any package path that contains pyproject.toml.

Test commit

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

isage_pypi_publisher-0.1.9.6.tar.gz (84.8 kB view details)

Uploaded Source

Built Distributions

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

isage_pypi_publisher-0.1.9.6-py2.py3-none-any.whl (92.3 kB view details)

Uploaded Python 2Python 3

isage_pypi_publisher-0.1.9.6-cp310-none-any.whl (76.8 kB view details)

Uploaded CPython 3.10

File details

Details for the file isage_pypi_publisher-0.1.9.6.tar.gz.

File metadata

  • Download URL: isage_pypi_publisher-0.1.9.6.tar.gz
  • Upload date:
  • Size: 84.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.11

File hashes

Hashes for isage_pypi_publisher-0.1.9.6.tar.gz
Algorithm Hash digest
SHA256 3bd35dc3a6f903ea640c5261aa93d27bde5a542dd42c69bd10f355eaabfdb540
MD5 e0eedaea5651cfa4b24163d7e080b7b1
BLAKE2b-256 f049f38d4226406bf381948956b821604f1cd4c0cbfea4553e145218d99d3bfc

See more details on using hashes here.

File details

Details for the file isage_pypi_publisher-0.1.9.6-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for isage_pypi_publisher-0.1.9.6-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 9759fbd2e6bff9d572ca2ee4d675c230303b6c0eed784affceb036e935e19b17
MD5 ae040702abe461be12cbd13eb39f8a42
BLAKE2b-256 38824edb3ce188e0c7d3e9585b35667a62d5aaaf77e09377beaee8f95edf7a85

See more details on using hashes here.

File details

Details for the file isage_pypi_publisher-0.1.9.6-cp310-none-any.whl.

File metadata

File hashes

Hashes for isage_pypi_publisher-0.1.9.6-cp310-none-any.whl
Algorithm Hash digest
SHA256 d6779147cfc76289b384624613b91acc547a80ea45ff714a8f9689023ff38e47
MD5 a71ce18520fee7e46bdaf24989ce95a4
BLAKE2b-256 b4cd8b11a44ed0d3aadebb94ce1d11d551e16c369ba5acb37f1a6edacdd8b8f7

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