fraiseql-confiture 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of fraiseql-confiture might be problematic. Click here for more details.
- fraiseql_confiture-0.1.0/.github/workflows/ci.yml +147 -0
- fraiseql_confiture-0.1.0/.github/workflows/wheels.yml +115 -0
- fraiseql_confiture-0.1.0/.gitignore +70 -0
- fraiseql_confiture-0.1.0/.python-version +1 -0
- fraiseql_confiture-0.1.0/CHANGELOG.md +164 -0
- fraiseql_confiture-0.1.0/CI_CD_SUMMARY.md +418 -0
- fraiseql_confiture-0.1.0/CLAUDE.md +733 -0
- fraiseql_confiture-0.1.0/CONTRIBUTING.md +719 -0
- fraiseql_confiture-0.1.0/Cargo.lock +436 -0
- fraiseql_confiture-0.1.0/Cargo.toml +29 -0
- fraiseql_confiture-0.1.0/LICENSE +21 -0
- fraiseql_confiture-0.1.0/PHASE2_SUMMARY.md +289 -0
- fraiseql_confiture-0.1.0/PHASES.md +1645 -0
- fraiseql_confiture-0.1.0/PKG-INFO +350 -0
- fraiseql_confiture-0.1.0/PRD.md +620 -0
- fraiseql_confiture-0.1.0/README.md +306 -0
- fraiseql_confiture-0.1.0/RELEASE.md +314 -0
- fraiseql_confiture-0.1.0/db/schema/00_common/00_extensions.sql +7 -0
- fraiseql_confiture-0.1.0/db/schema/00_common/01_confiture_migrations.sql +38 -0
- fraiseql_confiture-0.1.0/docs/api/builder.md +57 -0
- fraiseql_confiture-0.1.0/docs/api/migrator.md +76 -0
- fraiseql_confiture-0.1.0/docs/api/schema-to-schema.md +147 -0
- fraiseql_confiture-0.1.0/docs/api/syncer.md +90 -0
- fraiseql_confiture-0.1.0/docs/getting-started.md +572 -0
- fraiseql_confiture-0.1.0/docs/guides/medium-1-build-from-ddl.md +732 -0
- fraiseql_confiture-0.1.0/docs/guides/medium-2-incremental-migrations.md +821 -0
- fraiseql_confiture-0.1.0/docs/guides/medium-3-production-sync.md +910 -0
- fraiseql_confiture-0.1.0/docs/guides/medium-4-schema-to-schema.md +1396 -0
- fraiseql_confiture-0.1.0/docs/guides/migration-decision-tree.md +447 -0
- fraiseql_confiture-0.1.0/docs/index.md +184 -0
- fraiseql_confiture-0.1.0/docs/meaningful-test-uuids.md +666 -0
- fraiseql_confiture-0.1.0/docs/migration-strategies.md +732 -0
- fraiseql_confiture-0.1.0/docs/organizing-sql-files.md +608 -0
- fraiseql_confiture-0.1.0/docs/performance.md +382 -0
- fraiseql_confiture-0.1.0/docs/reference/cli.md +856 -0
- fraiseql_confiture-0.1.0/docs/reference/configuration.md +789 -0
- fraiseql_confiture-0.1.0/examples/01-basic-migration/.gitignore +29 -0
- fraiseql_confiture-0.1.0/examples/01-basic-migration/README.md +530 -0
- fraiseql_confiture-0.1.0/examples/01-basic-migration/db/environments/local.yaml +14 -0
- fraiseql_confiture-0.1.0/examples/01-basic-migration/db/migrations/001_add_user_bio.py +42 -0
- fraiseql_confiture-0.1.0/examples/01-basic-migration/db/schema/00_common/extensions.sql +11 -0
- fraiseql_confiture-0.1.0/examples/01-basic-migration/db/schema/10_tables/users.sql +20 -0
- fraiseql_confiture-0.1.0/examples/01-basic-migration/db/schema/20_indexes/users_indexes.sql +11 -0
- fraiseql_confiture-0.1.0/examples/02-fraiseql-integration/.gitignore +65 -0
- fraiseql_confiture-0.1.0/examples/02-fraiseql-integration/README.md +1209 -0
- fraiseql_confiture-0.1.0/examples/02-fraiseql-integration/confiture.yaml +151 -0
- fraiseql_confiture-0.1.0/examples/02-fraiseql-integration/db/environments/local.yaml +34 -0
- fraiseql_confiture-0.1.0/examples/02-fraiseql-integration/db/schema/00_extensions/extensions.sql +22 -0
- fraiseql_confiture-0.1.0/examples/02-fraiseql-integration/db/schema/20_indexes/indexes.sql +97 -0
- fraiseql_confiture-0.1.0/examples/02-fraiseql-integration/requirements.txt +27 -0
- fraiseql_confiture-0.1.0/examples/02-fraiseql-integration/schema.py +526 -0
- fraiseql_confiture-0.1.0/examples/03-zero-downtime-migration/README.md +1279 -0
- fraiseql_confiture-0.1.0/examples/03-zero-downtime-migration/SCENARIO.md +675 -0
- fraiseql_confiture-0.1.0/examples/03-zero-downtime-migration/db/new_schema/01_users_table.sql +43 -0
- fraiseql_confiture-0.1.0/examples/03-zero-downtime-migration/db/old_schema/01_users_table.sql +39 -0
- fraiseql_confiture-0.1.0/examples/03-zero-downtime-migration/migration_config.yaml +348 -0
- fraiseql_confiture-0.1.0/examples/03-zero-downtime-migration/scripts/1_setup_fdw.sh +513 -0
- fraiseql_confiture-0.1.0/examples/03-zero-downtime-migration/scripts/2_migrate_data.sh +460 -0
- fraiseql_confiture-0.1.0/examples/04-production-sync-anonymization/.gitignore +159 -0
- fraiseql_confiture-0.1.0/examples/04-production-sync-anonymization/QUICK_START.md +356 -0
- fraiseql_confiture-0.1.0/examples/04-production-sync-anonymization/README.md +1258 -0
- fraiseql_confiture-0.1.0/examples/04-production-sync-anonymization/anonymization_config.yaml +521 -0
- fraiseql_confiture-0.1.0/examples/04-production-sync-anonymization/db/environments/production.yaml +142 -0
- fraiseql_confiture-0.1.0/examples/04-production-sync-anonymization/db/environments/staging.yaml +247 -0
- fraiseql_confiture-0.1.0/examples/04-production-sync-anonymization/sync_script.sh +467 -0
- fraiseql_confiture-0.1.0/examples/04-production-sync-anonymization/verify_anonymization.sql +640 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/.github/workflows/ci.yml +156 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/.github/workflows/deploy-production.yml +234 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/.github/workflows/deploy-staging.yml +130 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/.gitignore +66 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/Makefile +163 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/README.md +1347 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/db/environments/ci.yaml +34 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/db/environments/local.yaml +26 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/db/environments/production.yaml +52 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/db/environments/staging.yaml +39 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/db/migrations/001_add_user_bio.py +50 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/db/migrations/002_add_project_status.py +63 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/db/migrations/003_add_task_priority.py +62 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/pytest.ini +38 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/scripts/backup_production.sh +104 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/scripts/rollback.sh +93 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/scripts/verify_migration.sh +161 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/tests/conftest.py +57 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/tests/test_data_integrity.py +322 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/tests/test_migrations.py +152 -0
- fraiseql_confiture-0.1.0/examples/05-multi-environment-workflow/tests/test_schema_build.py +191 -0
- fraiseql_confiture-0.1.0/examples/README.md +376 -0
- fraiseql_confiture-0.1.0/examples/basic/.gitignore +29 -0
- fraiseql_confiture-0.1.0/examples/basic/README.md +606 -0
- fraiseql_confiture-0.1.0/examples/basic/db/environments/local.yaml +9 -0
- fraiseql_confiture-0.1.0/examples/basic/db/environments/production.yaml +8 -0
- fraiseql_confiture-0.1.0/examples/basic/db/environments/test.yaml +9 -0
- fraiseql_confiture-0.1.0/examples/basic/db/migrations/001_create_initial_schema.py +97 -0
- fraiseql_confiture-0.1.0/examples/basic/db/schema/00_common/extensions.sql +9 -0
- fraiseql_confiture-0.1.0/examples/basic/db/schema/10_tables/comments.sql +25 -0
- fraiseql_confiture-0.1.0/examples/basic/db/schema/10_tables/posts.sql +30 -0
- fraiseql_confiture-0.1.0/examples/basic/db/schema/10_tables/users.sql +27 -0
- fraiseql_confiture-0.1.0/examples/basic/db/seeds/README.md +135 -0
- fraiseql_confiture-0.1.0/examples/basic/db/seeds/common/00_users.sql +8 -0
- fraiseql_confiture-0.1.0/examples/basic/db/seeds/development/00_posts.sql +31 -0
- fraiseql_confiture-0.1.0/examples/basic/db/seeds/development/01_comments.sql +17 -0
- fraiseql_confiture-0.1.0/examples/basic/db/seeds/test/00_posts.sql +19 -0
- fraiseql_confiture-0.1.0/mkdocs.yml +114 -0
- fraiseql_confiture-0.1.0/pyproject.toml +157 -0
- fraiseql_confiture-0.1.0/python/confiture/__init__.py +45 -0
- fraiseql_confiture-0.1.0/python/confiture/cli/__init__.py +0 -0
- fraiseql_confiture-0.1.0/python/confiture/cli/main.py +720 -0
- fraiseql_confiture-0.1.0/python/confiture/config/__init__.py +0 -0
- fraiseql_confiture-0.1.0/python/confiture/config/environment.py +190 -0
- fraiseql_confiture-0.1.0/python/confiture/core/__init__.py +0 -0
- fraiseql_confiture-0.1.0/python/confiture/core/builder.py +336 -0
- fraiseql_confiture-0.1.0/python/confiture/core/connection.py +120 -0
- fraiseql_confiture-0.1.0/python/confiture/core/differ.py +522 -0
- fraiseql_confiture-0.1.0/python/confiture/core/migration_generator.py +298 -0
- fraiseql_confiture-0.1.0/python/confiture/core/migrator.py +369 -0
- fraiseql_confiture-0.1.0/python/confiture/core/schema_to_schema.py +592 -0
- fraiseql_confiture-0.1.0/python/confiture/core/syncer.py +540 -0
- fraiseql_confiture-0.1.0/python/confiture/exceptions.py +141 -0
- fraiseql_confiture-0.1.0/python/confiture/integrations/__init__.py +0 -0
- fraiseql_confiture-0.1.0/python/confiture/models/__init__.py +0 -0
- fraiseql_confiture-0.1.0/python/confiture/models/migration.py +95 -0
- fraiseql_confiture-0.1.0/python/confiture/models/schema.py +203 -0
- fraiseql_confiture-0.1.0/python/db/environments/test.yaml +8 -0
- fraiseql_confiture-0.1.0/python/db/generated/schema_test.sql +65 -0
- fraiseql_confiture-0.1.0/python/db/schema/00_common/extensions.sql +3 -0
- fraiseql_confiture-0.1.0/python/db/schema/10_tables/posts.sql +10 -0
- fraiseql_confiture-0.1.0/python/db/schema/10_tables/users.sql +9 -0
- fraiseql_confiture-0.1.0/python/db/schema/20_views/user_stats.sql +9 -0
- fraiseql_confiture-0.1.0/python/tests/e2e/__init__.py +0 -0
- fraiseql_confiture-0.1.0/python/tests/integration/__init__.py +0 -0
- fraiseql_confiture-0.1.0/python/tests/unit/__init__.py +0 -0
- fraiseql_confiture-0.1.0/src/builder.rs +182 -0
- fraiseql_confiture-0.1.0/src/hasher.rs +209 -0
- fraiseql_confiture-0.1.0/src/lib.rs +20 -0
- fraiseql_confiture-0.1.0/tests/conftest.py +380 -0
- fraiseql_confiture-0.1.0/tests/e2e/test_cli.py +478 -0
- fraiseql_confiture-0.1.0/tests/integration/test_migrator.py +175 -0
- fraiseql_confiture-0.1.0/tests/integration/test_schema_to_schema.py +528 -0
- fraiseql_confiture-0.1.0/tests/integration/test_syncer.py +262 -0
- fraiseql_confiture-0.1.0/tests/integration/test_syncer_anonymization.py +412 -0
- fraiseql_confiture-0.1.0/tests/integration/test_syncer_progress.py +348 -0
- fraiseql_confiture-0.1.0/tests/performance/README.md +281 -0
- fraiseql_confiture-0.1.0/tests/performance/__init__.py +1 -0
- fraiseql_confiture-0.1.0/tests/performance/test_rust_speedup.py +165 -0
- fraiseql_confiture-0.1.0/tests/performance/test_syncer_benchmarks.py +433 -0
- fraiseql_confiture-0.1.0/tests/unit/test_builder.py +511 -0
- fraiseql_confiture-0.1.0/tests/unit/test_builder_comprehensive.py +339 -0
- fraiseql_confiture-0.1.0/tests/unit/test_builder_error_paths.py +125 -0
- fraiseql_confiture-0.1.0/tests/unit/test_cli_error_paths.py +271 -0
- fraiseql_confiture-0.1.0/tests/unit/test_config.py +169 -0
- fraiseql_confiture-0.1.0/tests/unit/test_connection.py +244 -0
- fraiseql_confiture-0.1.0/tests/unit/test_differ.py +346 -0
- fraiseql_confiture-0.1.0/tests/unit/test_init.py +122 -0
- fraiseql_confiture-0.1.0/tests/unit/test_migration.py +105 -0
- fraiseql_confiture-0.1.0/tests/unit/test_migration_edge_cases.py +58 -0
- fraiseql_confiture-0.1.0/tests/unit/test_migration_generator.py +367 -0
- fraiseql_confiture-0.1.0/tests/unit/test_migration_generator_edge_cases.py +178 -0
- fraiseql_confiture-0.1.0/tests/unit/test_migrator_discovery.py +190 -0
- fraiseql_confiture-0.1.0/tests/unit/test_migrator_edge_cases.py +191 -0
- fraiseql_confiture-0.1.0/tests/unit/test_schema_models.py +362 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
pull_request:
|
|
8
|
+
branches:
|
|
9
|
+
- main
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
test:
|
|
16
|
+
name: Test Python 3.11 on Linux
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
|
|
19
|
+
services:
|
|
20
|
+
postgres:
|
|
21
|
+
image: postgres:15
|
|
22
|
+
env:
|
|
23
|
+
POSTGRES_PASSWORD: postgres
|
|
24
|
+
POSTGRES_USER: postgres
|
|
25
|
+
POSTGRES_DB: confiture_test
|
|
26
|
+
options: >-
|
|
27
|
+
--health-cmd pg_isready
|
|
28
|
+
--health-interval 10s
|
|
29
|
+
--health-timeout 5s
|
|
30
|
+
--health-retries 5
|
|
31
|
+
ports:
|
|
32
|
+
- 5432:5432
|
|
33
|
+
|
|
34
|
+
steps:
|
|
35
|
+
- uses: actions/checkout@v4
|
|
36
|
+
|
|
37
|
+
- name: Set up Python
|
|
38
|
+
uses: actions/setup-python@v5
|
|
39
|
+
with:
|
|
40
|
+
python-version: '3.11'
|
|
41
|
+
|
|
42
|
+
- name: Install Rust toolchain
|
|
43
|
+
uses: dtolnay/rust-toolchain@stable
|
|
44
|
+
|
|
45
|
+
- name: Install uv
|
|
46
|
+
uses: astral-sh/setup-uv@v5
|
|
47
|
+
|
|
48
|
+
- name: Install dependencies
|
|
49
|
+
run: uv sync --all-extras
|
|
50
|
+
|
|
51
|
+
- name: Build Rust extension
|
|
52
|
+
run: uv run maturin develop
|
|
53
|
+
|
|
54
|
+
- name: Create test databases
|
|
55
|
+
run: |
|
|
56
|
+
PGPASSWORD=postgres psql -h localhost -U postgres -c "CREATE DATABASE confiture_test;"
|
|
57
|
+
PGPASSWORD=postgres psql -h localhost -U postgres -c "CREATE DATABASE confiture_source_test;"
|
|
58
|
+
PGPASSWORD=postgres psql -h localhost -U postgres -c "CREATE DATABASE confiture_target_test;"
|
|
59
|
+
|
|
60
|
+
- name: Run tests
|
|
61
|
+
env:
|
|
62
|
+
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/confiture_test
|
|
63
|
+
SOURCE_DB_URL: postgresql://postgres:postgres@localhost:5432/confiture_source_test
|
|
64
|
+
TARGET_DB_URL: postgresql://postgres:postgres@localhost:5432/confiture_target_test
|
|
65
|
+
POSTGRES_HOST: localhost
|
|
66
|
+
POSTGRES_PORT: 5432
|
|
67
|
+
POSTGRES_USER: postgres
|
|
68
|
+
POSTGRES_PASSWORD: postgres
|
|
69
|
+
POSTGRES_DB: confiture_test
|
|
70
|
+
run: uv run pytest tests/ -v --cov=confiture --cov-report=xml --cov-report=term
|
|
71
|
+
|
|
72
|
+
- name: Upload coverage to Codecov
|
|
73
|
+
uses: codecov/codecov-action@v5
|
|
74
|
+
with:
|
|
75
|
+
file: ./coverage.xml
|
|
76
|
+
flags: unittests
|
|
77
|
+
name: codecov-umbrella
|
|
78
|
+
continue-on-error: true
|
|
79
|
+
|
|
80
|
+
lint:
|
|
81
|
+
name: Lint and format
|
|
82
|
+
runs-on: ubuntu-latest
|
|
83
|
+
steps:
|
|
84
|
+
- uses: actions/checkout@v4
|
|
85
|
+
|
|
86
|
+
- name: Set up Python
|
|
87
|
+
uses: actions/setup-python@v5
|
|
88
|
+
with:
|
|
89
|
+
python-version: '3.11'
|
|
90
|
+
|
|
91
|
+
- name: Install uv
|
|
92
|
+
uses: astral-sh/setup-uv@v5
|
|
93
|
+
|
|
94
|
+
- name: Install dependencies
|
|
95
|
+
run: uv sync --all-extras
|
|
96
|
+
|
|
97
|
+
- name: Run ruff check
|
|
98
|
+
run: uv run ruff check .
|
|
99
|
+
|
|
100
|
+
- name: Run ruff format check
|
|
101
|
+
run: uv run ruff format --check .
|
|
102
|
+
|
|
103
|
+
- name: Run mypy
|
|
104
|
+
run: uv run mypy python/confiture/
|
|
105
|
+
|
|
106
|
+
test-pure-python:
|
|
107
|
+
name: Test pure Python fallback
|
|
108
|
+
runs-on: ubuntu-latest
|
|
109
|
+
steps:
|
|
110
|
+
- uses: actions/checkout@v4
|
|
111
|
+
|
|
112
|
+
- name: Set up Python
|
|
113
|
+
uses: actions/setup-python@v5
|
|
114
|
+
with:
|
|
115
|
+
python-version: '3.11'
|
|
116
|
+
|
|
117
|
+
- name: Install uv
|
|
118
|
+
uses: astral-sh/setup-uv@v5
|
|
119
|
+
|
|
120
|
+
- name: Install dependencies and package (Python only)
|
|
121
|
+
run: |
|
|
122
|
+
uv sync --all-extras
|
|
123
|
+
# Remove Rust extension if built
|
|
124
|
+
rm -f python/confiture/_core.*.so || true
|
|
125
|
+
|
|
126
|
+
- name: Run tests (Python fallback)
|
|
127
|
+
run: |
|
|
128
|
+
uv run python -c "from confiture.core.builder import HAS_RUST; assert not HAS_RUST, 'Rust extension should not be loaded'; print('✓ Testing pure Python fallback')"
|
|
129
|
+
uv run pytest tests/unit/ -v -k "not performance"
|
|
130
|
+
|
|
131
|
+
cargo-test:
|
|
132
|
+
name: Cargo test (Rust)
|
|
133
|
+
runs-on: ubuntu-latest
|
|
134
|
+
steps:
|
|
135
|
+
- uses: actions/checkout@v4
|
|
136
|
+
|
|
137
|
+
- name: Install Rust toolchain
|
|
138
|
+
uses: dtolnay/rust-toolchain@stable
|
|
139
|
+
|
|
140
|
+
- name: Run cargo clippy
|
|
141
|
+
run: cargo clippy -- -D warnings
|
|
142
|
+
|
|
143
|
+
- name: Run cargo fmt check
|
|
144
|
+
run: cargo fmt --check
|
|
145
|
+
|
|
146
|
+
# Note: cargo test is skipped because PyO3 tests require Python context
|
|
147
|
+
# Python integration tests are run in the main test job with maturin
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
name: Build Wheels
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
pull_request:
|
|
8
|
+
branches:
|
|
9
|
+
- main
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
build-wheels:
|
|
17
|
+
name: Build wheels on Linux
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
|
|
23
|
+
- name: Set up Python
|
|
24
|
+
uses: actions/setup-python@v5
|
|
25
|
+
with:
|
|
26
|
+
python-version: '3.11'
|
|
27
|
+
|
|
28
|
+
- name: Install Rust toolchain
|
|
29
|
+
uses: dtolnay/rust-toolchain@stable
|
|
30
|
+
|
|
31
|
+
- name: Install maturin
|
|
32
|
+
run: pip install maturin
|
|
33
|
+
|
|
34
|
+
- name: Build wheels
|
|
35
|
+
run: maturin build --release --out dist
|
|
36
|
+
|
|
37
|
+
- name: Upload wheels
|
|
38
|
+
uses: actions/upload-artifact@v4
|
|
39
|
+
with:
|
|
40
|
+
name: wheels-linux-py311
|
|
41
|
+
path: dist/*.whl
|
|
42
|
+
|
|
43
|
+
build-sdist:
|
|
44
|
+
name: Build source distribution
|
|
45
|
+
runs-on: ubuntu-latest
|
|
46
|
+
steps:
|
|
47
|
+
- uses: actions/checkout@v4
|
|
48
|
+
|
|
49
|
+
- name: Set up Python
|
|
50
|
+
uses: actions/setup-python@v5
|
|
51
|
+
with:
|
|
52
|
+
python-version: '3.11'
|
|
53
|
+
|
|
54
|
+
- name: Install maturin
|
|
55
|
+
run: pip install maturin
|
|
56
|
+
|
|
57
|
+
- name: Build sdist
|
|
58
|
+
run: maturin sdist --out dist
|
|
59
|
+
|
|
60
|
+
- name: Upload sdist
|
|
61
|
+
uses: actions/upload-artifact@v4
|
|
62
|
+
with:
|
|
63
|
+
name: sdist
|
|
64
|
+
path: dist/*.tar.gz
|
|
65
|
+
|
|
66
|
+
test-wheels:
|
|
67
|
+
name: Test wheels
|
|
68
|
+
needs: [build-wheels]
|
|
69
|
+
runs-on: ubuntu-latest
|
|
70
|
+
|
|
71
|
+
steps:
|
|
72
|
+
- uses: actions/checkout@v4
|
|
73
|
+
|
|
74
|
+
- name: Set up Python
|
|
75
|
+
uses: actions/setup-python@v5
|
|
76
|
+
with:
|
|
77
|
+
python-version: '3.11'
|
|
78
|
+
|
|
79
|
+
- name: Download wheels
|
|
80
|
+
uses: actions/download-artifact@v4
|
|
81
|
+
with:
|
|
82
|
+
name: wheels-linux-py311
|
|
83
|
+
path: dist
|
|
84
|
+
|
|
85
|
+
- name: Install wheel
|
|
86
|
+
run: pip install --find-links dist confiture
|
|
87
|
+
|
|
88
|
+
- name: Test import
|
|
89
|
+
run: python -c "from confiture import _core; print('✓ Rust extension available')"
|
|
90
|
+
|
|
91
|
+
- name: Test CLI
|
|
92
|
+
run: confiture --help
|
|
93
|
+
|
|
94
|
+
publish:
|
|
95
|
+
name: Publish to PyPI
|
|
96
|
+
needs: [build-wheels, build-sdist, test-wheels]
|
|
97
|
+
runs-on: ubuntu-latest
|
|
98
|
+
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
|
|
99
|
+
environment:
|
|
100
|
+
name: pypi
|
|
101
|
+
url: https://pypi.org/p/confiture
|
|
102
|
+
permissions:
|
|
103
|
+
id-token: write
|
|
104
|
+
|
|
105
|
+
steps:
|
|
106
|
+
- name: Download all artifacts
|
|
107
|
+
uses: actions/download-artifact@v4
|
|
108
|
+
with:
|
|
109
|
+
path: dist
|
|
110
|
+
merge-multiple: true
|
|
111
|
+
|
|
112
|
+
- name: Publish to PyPI
|
|
113
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
114
|
+
with:
|
|
115
|
+
packages-dir: dist/
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
build/
|
|
8
|
+
develop-eggs/
|
|
9
|
+
dist/
|
|
10
|
+
downloads/
|
|
11
|
+
eggs/
|
|
12
|
+
.eggs/
|
|
13
|
+
lib/
|
|
14
|
+
lib64/
|
|
15
|
+
parts/
|
|
16
|
+
sdist/
|
|
17
|
+
var/
|
|
18
|
+
wheels/
|
|
19
|
+
*.egg-info/
|
|
20
|
+
.installed.cfg
|
|
21
|
+
*.egg
|
|
22
|
+
|
|
23
|
+
# Virtual environments
|
|
24
|
+
venv/
|
|
25
|
+
ENV/
|
|
26
|
+
env/
|
|
27
|
+
.venv
|
|
28
|
+
|
|
29
|
+
# uv
|
|
30
|
+
.uv/
|
|
31
|
+
uv.lock
|
|
32
|
+
|
|
33
|
+
# Testing
|
|
34
|
+
.pytest_cache/
|
|
35
|
+
.coverage
|
|
36
|
+
coverage.json
|
|
37
|
+
htmlcov/
|
|
38
|
+
.tox/
|
|
39
|
+
.hypothesis/
|
|
40
|
+
|
|
41
|
+
# IDEs
|
|
42
|
+
.vscode/
|
|
43
|
+
.idea/
|
|
44
|
+
*.swp
|
|
45
|
+
*.swo
|
|
46
|
+
*~
|
|
47
|
+
|
|
48
|
+
# OS
|
|
49
|
+
.DS_Store
|
|
50
|
+
Thumbs.db
|
|
51
|
+
|
|
52
|
+
# Project specific
|
|
53
|
+
db/generated/
|
|
54
|
+
*.db
|
|
55
|
+
*.sqlite
|
|
56
|
+
*.sql.bak
|
|
57
|
+
|
|
58
|
+
# Rust (Phase 2)
|
|
59
|
+
target/
|
|
60
|
+
Cargo.lock
|
|
61
|
+
|
|
62
|
+
# Documentation
|
|
63
|
+
docs/_build/
|
|
64
|
+
site/
|
|
65
|
+
|
|
66
|
+
# Internal development notes (do not commit)
|
|
67
|
+
*ANALYSIS*.md
|
|
68
|
+
*_ANALYSIS.md
|
|
69
|
+
RUST_BINDINGS.md
|
|
70
|
+
SEED_DATA_ANALYSIS.md
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.11
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Confiture will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- GitHub Actions CI/CD for multi-platform wheel building
|
|
12
|
+
- Automated PyPI publishing via trusted publisher
|
|
13
|
+
- CI workflow for continuous testing across platforms
|
|
14
|
+
|
|
15
|
+
## [0.2.0-alpha] - 2025-10-11
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- **Rust performance layer** with PyO3 bindings (Phase 2)
|
|
19
|
+
- Fast schema builder using parallel file I/O (rayon)
|
|
20
|
+
- Fast SHA256 hashing (30-60x faster than Python)
|
|
21
|
+
- Graceful fallback to Python when Rust unavailable
|
|
22
|
+
- Performance benchmarks in `tests/performance/`
|
|
23
|
+
- Maturin build system for binary wheels
|
|
24
|
+
- Support for Python 3.11, 3.12, 3.13
|
|
25
|
+
- Comprehensive test coverage (212 tests, 91.76%)
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
- `SchemaBuilder.build()` now uses Rust for 10-50x speedup
|
|
29
|
+
- `SchemaBuilder.compute_hash()` now uses Rust for 30-60x speedup
|
|
30
|
+
- Build system migrated from hatchling to maturin
|
|
31
|
+
- Version bumped to 0.2.0-alpha
|
|
32
|
+
|
|
33
|
+
### Performance
|
|
34
|
+
- Schema building: 5-10x faster with Rust
|
|
35
|
+
- Hash computation: 30-60x faster with Rust
|
|
36
|
+
- Parallel file operations on multi-core systems
|
|
37
|
+
|
|
38
|
+
### Documentation
|
|
39
|
+
- Added PHASE2_SUMMARY.md (Rust layer documentation)
|
|
40
|
+
- Added performance benchmarking guide
|
|
41
|
+
- Updated README with Rust installation notes
|
|
42
|
+
|
|
43
|
+
## [0.1.0-alpha] - 2025-10-11
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
- **Core schema builder** (Medium 1: Build from DDL)
|
|
47
|
+
- Environment configuration system with YAML
|
|
48
|
+
- SQL file discovery and concatenation
|
|
49
|
+
- Deterministic file ordering (alphabetical)
|
|
50
|
+
- Schema hash computation (SHA256)
|
|
51
|
+
- File exclusion filtering
|
|
52
|
+
- Multiple include directories support
|
|
53
|
+
- Relative path calculation for nested structures
|
|
54
|
+
|
|
55
|
+
### Added - CLI Commands
|
|
56
|
+
- `confiture init` - Initialize project structure
|
|
57
|
+
- `confiture build` - Build schema from DDL files
|
|
58
|
+
- `--env` flag for environment selection
|
|
59
|
+
- `--output` flag for custom output path
|
|
60
|
+
- `--show-hash` flag for schema hash display
|
|
61
|
+
- `--schema-only` flag to exclude seed data
|
|
62
|
+
|
|
63
|
+
### Added - Migration System
|
|
64
|
+
- Migration base class with up/down methods
|
|
65
|
+
- Migration executor with transaction support
|
|
66
|
+
- Migration discovery and tracking
|
|
67
|
+
- Schema diff detection (basic)
|
|
68
|
+
- Migration generator from schema diffs
|
|
69
|
+
- Migration status command
|
|
70
|
+
- Version sequencing
|
|
71
|
+
|
|
72
|
+
### Added - Testing
|
|
73
|
+
- 212 unit tests with 91.76% coverage
|
|
74
|
+
- Integration test framework
|
|
75
|
+
- Test fixtures for schema files
|
|
76
|
+
- Comprehensive error path testing
|
|
77
|
+
- Edge case coverage
|
|
78
|
+
|
|
79
|
+
### Added - Configuration
|
|
80
|
+
- Environment config (db/environments/*.yaml)
|
|
81
|
+
- Include/exclude directory patterns
|
|
82
|
+
- Database URL configuration
|
|
83
|
+
- Project directory support
|
|
84
|
+
|
|
85
|
+
### Added - Documentation
|
|
86
|
+
- README with quick start guide
|
|
87
|
+
- PHASES.md with development roadmap
|
|
88
|
+
- CLAUDE.md with AI development guide
|
|
89
|
+
- PRD.md with product requirements
|
|
90
|
+
- Code examples in examples/
|
|
91
|
+
|
|
92
|
+
### Infrastructure
|
|
93
|
+
- Python 3.11+ support
|
|
94
|
+
- pytest test framework
|
|
95
|
+
- ruff linting and formatting
|
|
96
|
+
- mypy type checking
|
|
97
|
+
- pre-commit hooks
|
|
98
|
+
- uv package manager integration
|
|
99
|
+
|
|
100
|
+
## [0.0.1] - 2025-10-10
|
|
101
|
+
|
|
102
|
+
### Added
|
|
103
|
+
- Initial project structure
|
|
104
|
+
- Basic package scaffolding
|
|
105
|
+
- Development environment setup
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Version History Summary
|
|
110
|
+
|
|
111
|
+
| Version | Date | Key Features |
|
|
112
|
+
|---------|------|--------------|
|
|
113
|
+
| 0.2.0-alpha | 2025-10-11 | Rust performance layer, 10-50x speedup |
|
|
114
|
+
| 0.1.0-alpha | 2025-10-11 | Core schema builder, CLI, migrations |
|
|
115
|
+
| 0.0.1 | 2025-10-10 | Initial setup |
|
|
116
|
+
|
|
117
|
+
## Migration Guide
|
|
118
|
+
|
|
119
|
+
### From 0.1.0 to 0.2.0
|
|
120
|
+
|
|
121
|
+
No breaking changes! Upgrade is seamless:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
pip install --upgrade confiture
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**What's New:**
|
|
128
|
+
- Rust extension auto-detected and used for performance
|
|
129
|
+
- Falls back to Python if Rust unavailable
|
|
130
|
+
- All existing code continues to work unchanged
|
|
131
|
+
|
|
132
|
+
**To verify Rust extension:**
|
|
133
|
+
```python
|
|
134
|
+
from confiture.core.builder import HAS_RUST
|
|
135
|
+
print(f"Rust available: {HAS_RUST}")
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Performance improvements:**
|
|
139
|
+
- `SchemaBuilder.build()`: 5-10x faster
|
|
140
|
+
- `SchemaBuilder.compute_hash()`: 30-60x faster
|
|
141
|
+
|
|
142
|
+
## Deprecations
|
|
143
|
+
|
|
144
|
+
No deprecated features yet.
|
|
145
|
+
|
|
146
|
+
## Security
|
|
147
|
+
|
|
148
|
+
No security advisories yet.
|
|
149
|
+
|
|
150
|
+
To report security vulnerabilities, please email security@fraiseql.com or create a private security advisory on GitHub.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Links
|
|
155
|
+
|
|
156
|
+
- [GitHub Repository](https://github.com/fraiseql/confiture)
|
|
157
|
+
- [Issue Tracker](https://github.com/fraiseql/confiture/issues)
|
|
158
|
+
- [PyPI Package](https://pypi.org/project/confiture/)
|
|
159
|
+
- [Documentation](https://github.com/fraiseql/confiture)
|
|
160
|
+
- [FraiseQL](https://github.com/fraiseql/fraiseql)
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
*Making jam from strawberries, one version at a time.* 🍓
|