Skip to main content

half_orm development Framework.

Project description

half-orm-dev

WARNING! half-orm-dev is in alpha development phase!

Please report any issues at GitHub Issues

Git-centric patch management and PostgreSQL database versioning for half-orm projects

Python 3.9+ License: GPLv3 half-orm PyPI Downloads

Modern development workflow for PostgreSQL databases with automatic code generation, semantic versioning, and production-ready deployment system.


๐Ÿ“– What is half-orm-dev?

half-orm-dev provides a complete development lifecycle for database-driven applications:

  • Git-centric workflow: Patches stored in Git branches with semantic versioning
  • Test-Driven Development: Automatic validation - tests run before integration, patches blocked if tests fail
  • Code generation: Python classes auto-generated from schema changes
  • Data bootstrapping: Initialize reference data and configurations with tracked scripts
  • Safe deployments: Sequential releases with automatic backups and validation
  • Team collaboration: Distributed locks, branch management, conflict prevention
  • Cloud-friendly: No superuser privileges required (works on AWS RDS, Azure, GCP)

Perfect for teams managing evolving PostgreSQL schemas with Python applications.


โœจ Key Features

๐Ÿงช Systematic Test Validation (Core Safety Feature)

Tests run automatically before patch integration and block merges if they fail.

# When you merge a patch, half-orm-dev:
git checkout ho-patch/123-feature
half_orm dev patch merge

# Behind the scenes:
# 1. Creates temporary validation branch
# 2. Restores database from production schema
# 3. Applies ALL release patches sequentially
# 4. Runs pytest automatically
# 5. โœ… If PASS โ†’ merges into release, status โ†’ "staged"
# 6. โŒ If FAIL โ†’ nothing committed, temp branch deleted

Benefits:

  • โœ… Catch integration issues early
  • โœ… Prevent regressions automatically
  • โœ… Only validated code reaches production
  • โœ… Full release context testing (all patches together)

Cannot be disabled - it's a core safety feature.

๐Ÿ”ง Development Workflow

  • Patch-based development: Isolated branches for each database change
  • Automatic code generation: half-orm Python classes from schema
  • Complete testing: Apply patches with full release context
  • Conflict detection: Distributed locks prevent concurrent modifications

๐Ÿ“ฆ Release Management

  • Semantic versioning: patch/minor/major increments
  • Sequential promotion: stage โ†’ rc โ†’ production workflow
  • Release candidates: RC validation before production
  • Hotfix support: Reopen last released version for urgent fixes
  • Branch cleanup: Automatic deletion after promotion

๐Ÿš€ Production

  • Safe upgrades: Automatic database backups before changes
  • Incremental deployment: Apply releases sequentially
  • Version tracking: Complete release history
  • Cloud-compatible: No superuser privileges required

๐Ÿš€ Installation

Prerequisites

Install

pip install half-orm-dev

Verify Installation

half_orm dev --help

๐Ÿ“– Quick Start

Initialize New Project

# Create project with database (requires git origin)
half_orm dev init myproject --database mydb --git-origin git@github.com:user/myproject.git
cd myproject

Clone Existing Project

# Clone from Git
half_orm dev clone https://github.com/user/project.git
cd project

Basic Development Workflow

# 1. Create a release (integration branch)
half_orm dev release create minor  # Creates ho-release/0.1.0

# 2. Create a patch
half_orm dev patch create 1-users
# โ†’ Creates ho-patch/1-users branch
# โ†’ Auto-added to 0.1.0-patches.toml as "candidate"

# 3. Add schema changes
echo "CREATE TABLE users (
    id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    username TEXT NOT NULL
);" > Patches/1-users/01_users.sql

# 4. Apply patch (generates Python code)
half_orm dev patch apply
# โ†’ Restores database from production state
# โ†’ Applies SQL patches
# โ†’ Generates Python classes (mydb/public/user.py)

# 5. Write tests (TDD approach)
cat > tests/public/user/test_user_logic.py << 'EOF'
from mydb.public.user import User

def test_user_creation():
    """Test user creation business logic."""
    user = User(username='alice').ho_insert()
    assert user['username'] == 'alice'
    assert user['id'] is not None
EOF

# 6. Run tests locally
pytest

# 7. Commit your work
git add .
git commit -m "Add users table with tests"

# 8. Merge patch - AUTOMATIC VALIDATION!
git checkout ho-patch/1-users
half_orm dev patch merge
# โ†’ Creates temp validation branch
# โ†’ Runs pytest automatically
# โ†’ If tests pass: merges into ho-release/0.1.0, status โ†’ "staged"
# โ†’ If tests fail: aborts, nothing committed

# 9. Promote to production
half_orm dev release promote rc    # Optional: create release candidate
half_orm dev release promote prod  # Merge to ho-prod + create tag

๐Ÿ’ป Core Workflow

Branch Strategy

ho-prod (main production branch)
โ”‚
โ”œโ”€โ”€ ho-release/0.17.0 (integration branch, deleted after prod)
โ”‚   โ”œโ”€โ”€ ho-patch/6-feature-x    (temporary, deleted after merge)
โ”‚   โ”œโ”€โ”€ ho-patch/7-bugfix-y     (temporary, deleted after merge)
โ”‚   โ””โ”€โ”€ ho-patch/8-auth-z       (temporary, deleted after merge)
โ”‚
โ””โ”€โ”€ ho-release/0.18.0 (next version in parallel)
    โ””โ”€โ”€ ho-patch/10-new-api     (temporary, deleted after merge)

Branch Types:

  • ho-prod: Stable production branch (source of truth)
  • ho-release/X.Y.Z: Integration branches (temporary)
  • ho-patch/ID: Patch development branches (temporary)

Release Files

.hop/releases/
โ”œโ”€โ”€ 0.17.0-patches.toml    # Development (mutable: candidate/staged status)
โ”œโ”€โ”€ 0.17.0-rc1.txt         # Release candidate snapshot (immutable)
โ”œโ”€โ”€ 0.17.0.txt             # Production snapshot (immutable)
โ”œโ”€โ”€ 0.17.0-hotfix1.txt     # Hotfix snapshot (immutable)
โ””โ”€โ”€ 0.18.0-patches.toml    # Next version in progress

Patch States:

  1. candidate: In development ("patch-id" = "candidate" in TOML)
  2. staged: Integrated, awaiting promotion ("patch-id" = "staged" in TOML)
  3. released: Deployed to production (in X.Y.Z.txt snapshot)

Development Cycle

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ DEVELOPMENT WORKFLOW                                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 1. release create <level>     Create ho-release/X.Y.Z       โ”‚
โ”‚ 2. patch create <id>       Create patch (auto-candidate)    โ”‚
โ”‚ 3. patch apply             Apply & test changes             โ”‚
โ”‚ 4. patch merge             Merge into release (TESTS!)      โ”‚
โ”‚                            โœ… Tests pass โ†’ integrated       โ”‚
โ”‚                            โŒ Tests fail โ†’ aborted          โ”‚
โ”‚                                                             โ”‚
โ”‚ RELEASE PROMOTION                                           โ”‚
โ”‚ 5. release promote rc      Create RC (optional)             โ”‚
โ”‚ 6. release promote prod    Merge to ho-prod + deploy        โ”‚
โ”‚                                                             โ”‚
โ”‚ PRODUCTION DEPLOYMENT                                       โ”‚
โ”‚ 7. update                  Check available releases         โ”‚
โ”‚ 8. upgrade                 Apply on production servers      โ”‚
โ”‚                                                             โ”‚
โ”‚ HOTFIX (urgent production fix)                              โ”‚
โ”‚ 9. release hotfix          Reopen last released version     โ”‚
โ”‚10. patch create/merge      Fix and validate                 โ”‚
โ”‚11. release promote hotfix  Deploy hotfix                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ“– Command Reference

Init & Clone

# Create new project (requires git origin)
half_orm dev init <package_name> --database <db_name> --git-origin <url>

# Clone existing project
half_orm dev clone <git_origin>

Check

# Verify and update project configuration
half_orm dev check

# Preview what would be done
half_orm dev check --dry-run

Note: This command runs automatically before other commands (git hooks, configuration, stale branches cleanup).

Release Commands

A release must be created before creating patches.

# Create new release (must be on ho-prod branch)
half_orm dev release create patch   # X.Y.(Z+1)
half_orm dev release create minor   # X.(Y+1).0
half_orm dev release create major   # (X+1).0.0

# Promote to release candidate (optional)
half_orm dev release promote rc

# Promote to production
half_orm dev release promote prod

# Hotfix workflow
half_orm dev release hotfix           # Reopen production version
half_orm dev release promote hotfix   # Deploy hotfix

Patch Commands

# Create new patch (must be on ho-release/* branch)
half_orm dev patch create <patch_id>

# Apply current patch (must be on ho-patch/* branch)
half_orm dev patch apply

# Merge patch into release (AUTOMATIC VALIDATION!)
# Must be on ho-patch/* branch
half_orm dev patch merge

Tip: Patch IDs must start with a number (e.g., 123-add-users). This number automatically closes the corresponding GitHub/GitLab issue #123 when the patch is merged.

Patch files: SQL (.sql) or Python (.py) files in Patches/<patch_id>/, executed in lexicographic order.

Production Commands

# Check available releases
half_orm dev update

# Apply releases to production
half_orm dev upgrade [--to-release X.Y.Z]

# Dry run (simulate upgrade)
half_orm dev upgrade --dry-run

Data Bootstrap

Mark patch files with -- @HOP:bootstrap (SQL) or # @HOP:bootstrap (Python) to declare reference data:

-- @HOP:bootstrap
INSERT INTO roles (name) VALUES ('admin'), ('user') ON CONFLICT DO NOTHING;

These files are automatically:

  • Copied to bootstrap/ during patch merge
  • Executed during production upgrade
  • Tracked in database (each script runs once)

Note: Use half_orm dev <command> --help for detailed help on each command.


๐ŸŽฏ Example: Team Collaboration

# Integration Manager: Create release
half_orm dev release create minor  # Creates ho-release/0.17.0

# Developer A: Work on feature
git checkout ho-release/0.17.0
half_orm dev patch create 456-dashboard
# ... develop and test ...
git checkout ho-patch/456-dashboard
half_orm dev patch merge  # Tests run automatically
# โ†’ Status: "staged" in 0.17.0-patches.toml

# Developer B: Sync and create patch
git checkout ho-release/0.17.0
git pull origin ho-release/0.17.0  # Get A's changes
half_orm dev patch create 789-reports
# ... develop and test ...
git merge origin/ho-release/0.17.0  # Sync again
git checkout ho-patch/789-reports
half_orm dev patch merge
# โ†’ Tests run with BOTH 456 + 789 together!
# โ†’ Both validated in full release context

๐ŸŽ“ Development Philosophy

half-orm-dev combines Domain-Driven Design with Test-Driven Development, integrated into Git:

  1. Schema as domain model - The PostgreSQL schema defines your domain; Python classes are auto-generated
  2. Write tests first - Define expected behavior before implementation
  3. Develop in isolation - Each patch has its own branch and directory
  4. Validate automatically - Tests run during patch merge, blocking integration if they fail
  5. Deploy with confidence - Only validated code reaches production

This approach ensures that every schema change is tested in the full release context before integration.


๐Ÿ“š Documentation

For detailed technical documentation, see docs/ARCHITECTURE.md.


๐Ÿ”ง Troubleshooting

Error: "Must be on ho-release/* branch"

# Create release or switch to release branch
half_orm dev release create minor
# or
git checkout ho-release/0.17.0

Error: "Must be on ho-patch/* branch"

# Solution: Create or switch to patch branch
# First ensure you're on ho-release/*
git checkout ho-release/0.17.0
half_orm dev patch create <patch_id>
# or
git checkout ho-patch/<patch_id>

Error: "Patch not found in candidates file"

# Solution: Patch must be created from ho-release/* branch
# to be automatically added to candidates
git checkout ho-release/0.17.0
half_orm dev patch create <patch_id>

Error: "Repository is not clean"

# Solution: Commit or stash changes
git status
git add .
git commit -m "Your message"
# or
git stash

Error: "Repository not synced with origin"

# This should not happen - commands handle git operations automatically
# If it does occur:
git pull origin ho-prod

Error: "No staged releases found"

# Solution: Create a release first
half_orm dev release create patch

Error: "Active RC exists"

# Cannot promote different version while RC exists
# Solution: Promote current RC to production first
half_orm dev release promote prod

# Then promote your stage
half_orm dev release promote rc

Error: "Tests failed for patch integration"

# Fix tests or code, then retry
half_orm dev patch apply  # Test locally first
pytest  # Verify tests pass

# Fix issues
vim Patches/123-feature/01_schema.sql
vim tests/test_feature.py

# Try again
git checkout ho-patch/123-feature
half_orm dev patch merge  # Tests will run again

For more troubleshooting, see docs/ARCHITECTURE.md.


๐Ÿค Contributing

Contributions are welcome! See CONTRIBUTING.md for development setup and guidelines.

Quick start for contributors:

# Clone repository
git clone https://github.com/half-orm/half-orm-dev.git
cd half-orm-dev

# Create virtual environment
python -m venv .venv
source .venv/bin/activate

# Install in development mode
pip install -e .

# Run tests
pytest                      # All tests
pytest -m "not integration" # Unit tests only
pytest -m integration       # Integration tests only

๐Ÿ“ž Getting Help


๐Ÿ“„ License

This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.


Made with โค๏ธ by the half-orm team

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

half_orm_dev-0.17.5a5.tar.gz (182.8 kB view details)

Uploaded Source

Built Distribution

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

half_orm_dev-0.17.5a5-py3-none-any.whl (200.2 kB view details)

Uploaded Python 3

File details

Details for the file half_orm_dev-0.17.5a5.tar.gz.

File metadata

  • Download URL: half_orm_dev-0.17.5a5.tar.gz
  • Upload date:
  • Size: 182.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for half_orm_dev-0.17.5a5.tar.gz
Algorithm Hash digest
SHA256 85c16de12acc6d2893e2a85db6c18f61436f25494119f04771ddefe2a9e15c8f
MD5 a81a9e6a0a49fef7f079c5e73108dc28
BLAKE2b-256 43c67353c850f4315687d4cdfa6153abd5dae91e06f52db87178f749d597b7c5

See more details on using hashes here.

File details

Details for the file half_orm_dev-0.17.5a5-py3-none-any.whl.

File metadata

File hashes

Hashes for half_orm_dev-0.17.5a5-py3-none-any.whl
Algorithm Hash digest
SHA256 ae5f7486c3b7573bd12229189dc9cc1d644cea5f41834bd411e2af65367c92d6
MD5 1c1ced5e78b37f774efa093bf9df7254
BLAKE2b-256 43840b769c5ebdb8c1f375849f0e3ce075afa37eaa26ff0f3252ccc9088d8f20

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