plain.postgres 0.111.0__tar.gz → 0.111.2__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.
- plain_postgres-0.111.0/plain/postgres/README.md → plain_postgres-0.111.2/PKG-INFO +29 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/CHANGELOG.md +23 -0
- plain_postgres-0.111.0/PKG-INFO → plain_postgres-0.111.2/plain/postgres/README.md +16 -13
- plain_postgres-0.111.2/plain/postgres/convergence/__init__.py +40 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/convergence/analysis.py +301 -191
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/convergence/fixes.py +6 -8
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/convergence/planning.py +46 -58
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/otel.py +4 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/sql/compiler.py +1 -1
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/test/pytest.py +9 -1
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/pyproject.toml +1 -1
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_convergence.py +54 -40
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_convergence_constraints.py +21 -22
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_convergence_defaults.py +24 -22
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_convergence_fk.py +13 -12
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_convergence_indexes.py +13 -20
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_convergence_nullability.py +21 -14
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_convergence_storage_parameters.py +11 -4
- plain_postgres-0.111.0/plain/postgres/convergence/__init__.py +0 -87
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/.gitignore +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/CLAUDE.md +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/LICENSE +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/README.md +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/__init__.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/adapters.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/agents/.claude/rules/plain-postgres.md +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/agents/.claude/skills/plain-postgres-doctor/SKILL.md +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/aggregates.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/base.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/cli/__init__.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/cli/converge.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/cli/core.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/cli/decorators.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/cli/diagnose.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/cli/migrations.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/cli/schema.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/cli/sync.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/config.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/connection.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/constants.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/constraints.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/database_url.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/db.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/ddl.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/default_settings.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/deletion.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/dialect.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/entrypoints.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/enums.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/exceptions.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/expressions.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/__init__.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/base.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/binary.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/boolean.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/duration.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/encrypted.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/json.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/mixins.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/network.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/numeric.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/primary_key.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/related.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/related_descriptors.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/related_lookups.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/related_managers.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/reverse_descriptors.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/reverse_related.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/temporal.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/text.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/timezones.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/fields/uuid.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/forms.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/functions/__init__.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/functions/comparison.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/functions/datetime.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/functions/math.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/functions/mixins.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/functions/random.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/functions/text.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/functions/uuid.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/functions/window.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/indexes.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/introspection/__init__.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/introspection/health/__init__.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/introspection/health/checks_cumulative.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/introspection/health/checks_snapshot.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/introspection/health/checks_structural.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/introspection/health/context.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/introspection/health/helpers.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/introspection/health/ownership.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/introspection/health/runner.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/introspection/health/types.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/introspection/schema.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/lookups.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/meta.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/middleware.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/__init__.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/autodetector.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/exceptions.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/executor.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/graph.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/loader.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/migration.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/operations/__init__.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/operations/base.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/operations/fields.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/operations/models.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/operations/special.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/optimizer.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/questioner.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/recorder.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/serializer.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/state.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/utils.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/migrations/writer.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/options.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/preflight/__init__.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/preflight/database.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/preflight/indexes.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/preflight/models.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/query.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/query_utils.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/registry.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/schema.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/sources.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/sql/__init__.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/sql/constants.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/sql/datastructures.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/sql/query.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/sql/where.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/test/__init__.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/test/database.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/transaction.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/types.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/types.pyi +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/plain/postgres/utils.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/forms.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0001_initial.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0002_test_field_removed.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0003_deleteparent_childsetnull_childsetdefault_and_more.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0004_defaultquerysetmodel_mixintestmodel_and_more.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0005_feature_carfeature_car_features.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0006_secretstore.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0007_treenode_unconstrainedchild.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0008_setsentinelparent_diamondparenta_midparent_and_more.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0009_circb_circa_circb_partner.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0010_hideableitem.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0011_defaultsexample.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0012_iterationexample.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0013_indexexample_constraintexample_nullabilityexample.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0014_widget_rename_feature_tag_remove_carfeature_car_and_more.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0015_dbdefaultsexample.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0016_formsexample.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0017_random_string_token.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/0018_storageparametersexample.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/migrations/__init__.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/__init__.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/constraints.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/defaults.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/delete.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/encrypted.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/forms.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/indexes.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/iteration.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/mixins.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/nullability.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/querysets.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/relationships.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/storage_parameters.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/trees.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/models/unregistered.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/urls.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/examples/views.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/settings.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/app/urls.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/conftest.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/conftest_convergence.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_autodetector_not_null_errors.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_autodetector_type_change.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_connection_isolation.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_connection_lifecycle.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_connection_pool.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_connection_self_heal.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_constraint_violation_error.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_convergence_timeouts.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_db_expression_defaults.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_diagnose.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_executor_connection_hook.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_fk_characterization.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_health.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_introspection.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_literal_default_persistence.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_management_connection.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_migration_executor.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_no_callable_defaults.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_otel_metrics.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_preflight_duplicate_indexes.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_preflight_fk_composite_hint.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_preflight_fk_coverage.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_schema_normalize_type.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/internal/test_schema_timeouts.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_create_update.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_database_url.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_deferred_loading.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_delete_behaviors.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_encrypted_fields.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_exceptions.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_field_defaults.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_functions_uuid.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_integrity_error_mapping.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_iterator.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_m2m.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_manager_assignment.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_manual_pk.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_mixins.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_modelform_roundtrip.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_queryset_repr.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_queryset_slicing.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_random_string_field.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_raw_query.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_read_only_transactions.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_related.py +0 -0
- {plain_postgres-0.111.0 → plain_postgres-0.111.2}/tests/public/test_related_instance_filter.py +0 -0
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: plain.postgres
|
|
3
|
+
Version: 0.111.2
|
|
4
|
+
Summary: Model your data and store it in a database.
|
|
5
|
+
Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
|
|
6
|
+
License-Expression: BSD-3-Clause
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Python: >=3.13
|
|
9
|
+
Requires-Dist: plain<1.0.0,>=0.134.0
|
|
10
|
+
Requires-Dist: psycopg-pool>=3.2
|
|
11
|
+
Requires-Dist: psycopg>=3.2
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
|
|
1
14
|
# plain.postgres
|
|
2
15
|
|
|
3
16
|
**Model your data and store it in a database.**
|
|
@@ -18,6 +31,7 @@
|
|
|
18
31
|
- [Forms](#forms)
|
|
19
32
|
- [Architecture](#architecture)
|
|
20
33
|
- [Diagnostics](#diagnostics)
|
|
34
|
+
- [Tracing](#tracing)
|
|
21
35
|
- [Settings](#settings)
|
|
22
36
|
- [FAQs](#faqs)
|
|
23
37
|
- [Installation](#installation)
|
|
@@ -1418,6 +1432,21 @@ These are static, code-level checks that catch issues before you deploy. The `di
|
|
|
1418
1432
|
- **Historical trending** — `diagnose` is stateless; it reports on the current state of cumulative stats. Continuous monitoring is out of scope.
|
|
1419
1433
|
- **Niche server checks** (WAL bloat, replication slot age, etc.) — better covered by your Postgres provider's monitoring or a dedicated tool; users on self-hosted setups that need them typically have their own tooling.
|
|
1420
1434
|
|
|
1435
|
+
## Tracing
|
|
1436
|
+
|
|
1437
|
+
Every query runs inside an OpenTelemetry `CLIENT` span with standard `db.*` attributes, so queries show up as children of whatever request, job, or chore triggered them. You don't configure anything for this — it's on by default and only exports if your app exports traces (e.g. with [plain.connect](../../../plain-connect/plain/connect/README.md)).
|
|
1438
|
+
|
|
1439
|
+
If code runs a query with _no_ active span — a background thread, a polling loop — that query's span becomes its own single-span trace. For framework-internal housekeeping queries where that's pure noise, you can suppress query tracing entirely:
|
|
1440
|
+
|
|
1441
|
+
```python
|
|
1442
|
+
from plain.postgres.otel import suppress_db_tracing
|
|
1443
|
+
|
|
1444
|
+
with suppress_db_tracing():
|
|
1445
|
+
MyModel.query.count() # No span, no query metrics
|
|
1446
|
+
```
|
|
1447
|
+
|
|
1448
|
+
This is meant for infrastructure code (pollers, metric gauge callbacks, test fixtures) — not for hiding application queries, which you almost always want visible in traces.
|
|
1449
|
+
|
|
1421
1450
|
## Settings
|
|
1422
1451
|
|
|
1423
1452
|
The connection is configured with a single URL (`POSTGRES_URL`). `DATABASE_URL` is read as a platform-compat fallback. Set the URL to `none` to explicitly disable the database (e.g. during Docker image builds).
|
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# plain-postgres changelog
|
|
2
2
|
|
|
3
|
+
## [0.111.2](https://github.com/dropseed/plain/releases/plain-postgres@0.111.2) (2026-07-15)
|
|
4
|
+
|
|
5
|
+
### What's changed
|
|
6
|
+
|
|
7
|
+
- The `setup_db` pytest fixture is now pytest-xdist aware: each worker gets its own test database (`gw0_<db>`, `gw1_<db>`, …), so `plain test -n <N>` runs in parallel without workers colliding while creating, migrating, and dropping the same database. Off-xdist the database name is unchanged (`test_<db>`). ([a8880771d2](https://github.com/dropseed/plain/commit/a8880771d2))
|
|
8
|
+
- Removed an unnecessary `type: ignore` comment in the SQL compiler. ([2a1bf46f13](https://github.com/dropseed/plain/commit/2a1bf46f13))
|
|
9
|
+
|
|
10
|
+
### Upgrade instructions
|
|
11
|
+
|
|
12
|
+
- No changes required.
|
|
13
|
+
|
|
14
|
+
## [0.111.1](https://github.com/dropseed/plain/releases/plain-postgres@0.111.1) (2026-07-10)
|
|
15
|
+
|
|
16
|
+
### What's changed
|
|
17
|
+
|
|
18
|
+
- `suppress_db_tracing` is now documented public API (`plain.postgres.otel.suppress_db_tracing`), with a new [Tracing](https://github.com/dropseed/plain/blob/master/plain-postgres/plain/postgres/README.md#tracing) section in the README. Use it around framework-style housekeeping queries (pollers, gauge callbacks) that run outside any entry span, where each query would otherwise export as its own single-span root trace. ([0560eb69b8](https://github.com/dropseed/plain/commit/0560eb69b8))
|
|
19
|
+
- Hardened the schema-convergence invariants behind `plain postgres sync` / `converge` / `schema`: a malformed drift now fails loudly at plan time instead of constructing a fix with missing fields, and column/foreign-key comparison asserts it never silently drops a detected drift. ([cb9aa7087c](https://github.com/dropseed/plain/commit/cb9aa7087c))
|
|
20
|
+
- Internal restructuring of the convergence subsystem: the per-kind drift classes were decomposed into shape dataclasses, and `plain.postgres.convergence` no longer re-exports the drift, fix, and status types — it is an internal subsystem driven through the CLI commands, and its `__init__` now only exposes what the CLI uses. No CLI behavior changes. ([75216e16c9](https://github.com/dropseed/plain/commit/75216e16c9), [2b2e57f876](https://github.com/dropseed/plain/commit/2b2e57f876))
|
|
21
|
+
|
|
22
|
+
### Upgrade instructions
|
|
23
|
+
|
|
24
|
+
- No changes required.
|
|
25
|
+
|
|
3
26
|
## [0.111.0](https://github.com/dropseed/plain/releases/plain-postgres@0.111.0) (2026-06-30)
|
|
4
27
|
|
|
5
28
|
### What's changed
|
|
@@ -1,16 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: plain.postgres
|
|
3
|
-
Version: 0.111.0
|
|
4
|
-
Summary: Model your data and store it in a database.
|
|
5
|
-
Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
|
|
6
|
-
License-Expression: BSD-3-Clause
|
|
7
|
-
License-File: LICENSE
|
|
8
|
-
Requires-Python: >=3.13
|
|
9
|
-
Requires-Dist: plain<1.0.0,>=0.134.0
|
|
10
|
-
Requires-Dist: psycopg-pool>=3.2
|
|
11
|
-
Requires-Dist: psycopg>=3.2
|
|
12
|
-
Description-Content-Type: text/markdown
|
|
13
|
-
|
|
14
1
|
# plain.postgres
|
|
15
2
|
|
|
16
3
|
**Model your data and store it in a database.**
|
|
@@ -31,6 +18,7 @@ Description-Content-Type: text/markdown
|
|
|
31
18
|
- [Forms](#forms)
|
|
32
19
|
- [Architecture](#architecture)
|
|
33
20
|
- [Diagnostics](#diagnostics)
|
|
21
|
+
- [Tracing](#tracing)
|
|
34
22
|
- [Settings](#settings)
|
|
35
23
|
- [FAQs](#faqs)
|
|
36
24
|
- [Installation](#installation)
|
|
@@ -1431,6 +1419,21 @@ These are static, code-level checks that catch issues before you deploy. The `di
|
|
|
1431
1419
|
- **Historical trending** — `diagnose` is stateless; it reports on the current state of cumulative stats. Continuous monitoring is out of scope.
|
|
1432
1420
|
- **Niche server checks** (WAL bloat, replication slot age, etc.) — better covered by your Postgres provider's monitoring or a dedicated tool; users on self-hosted setups that need them typically have their own tooling.
|
|
1433
1421
|
|
|
1422
|
+
## Tracing
|
|
1423
|
+
|
|
1424
|
+
Every query runs inside an OpenTelemetry `CLIENT` span with standard `db.*` attributes, so queries show up as children of whatever request, job, or chore triggered them. You don't configure anything for this — it's on by default and only exports if your app exports traces (e.g. with [plain.connect](../../../plain-connect/plain/connect/README.md)).
|
|
1425
|
+
|
|
1426
|
+
If code runs a query with _no_ active span — a background thread, a polling loop — that query's span becomes its own single-span trace. For framework-internal housekeeping queries where that's pure noise, you can suppress query tracing entirely:
|
|
1427
|
+
|
|
1428
|
+
```python
|
|
1429
|
+
from plain.postgres.otel import suppress_db_tracing
|
|
1430
|
+
|
|
1431
|
+
with suppress_db_tracing():
|
|
1432
|
+
MyModel.query.count() # No span, no query metrics
|
|
1433
|
+
```
|
|
1434
|
+
|
|
1435
|
+
This is meant for infrastructure code (pollers, metric gauge callbacks, test fixtures) — not for hiding application queries, which you almost always want visible in traces.
|
|
1436
|
+
|
|
1434
1437
|
## Settings
|
|
1435
1438
|
|
|
1436
1439
|
The connection is configured with a single URL (`POSTGRES_URL`). `DATABASE_URL` is read as a platform-compat fallback. Set the URL to `none` to explicitly disable the database (e.g. during Docker image builds).
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Internal subsystem powering the ``plain postgres sync`` / ``converge`` /
|
|
2
|
+
``schema`` commands.
|
|
3
|
+
|
|
4
|
+
This is not a public import API. End users drive convergence through those CLI
|
|
5
|
+
commands, not by importing from here, and it is intentionally absent from the
|
|
6
|
+
top-level ``plain.postgres`` surface. The names re-exported below exist for the
|
|
7
|
+
rest of ``plain.postgres`` (the CLI) to use; the drift types, ``DriftKind``,
|
|
8
|
+
the ``Fix`` classes, and the ``Status`` records are convergence-internal and
|
|
9
|
+
live in the ``.analysis`` / ``.fixes`` / ``.planning`` submodules.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from .analysis import (
|
|
13
|
+
ModelAnalysis,
|
|
14
|
+
ReadOnlyConnectionError,
|
|
15
|
+
analyze_model,
|
|
16
|
+
)
|
|
17
|
+
from .planning import (
|
|
18
|
+
ConvergencePlan,
|
|
19
|
+
ConvergenceResult,
|
|
20
|
+
FixResult,
|
|
21
|
+
PlanItem,
|
|
22
|
+
can_auto_fix,
|
|
23
|
+
execute_plan,
|
|
24
|
+
plan_convergence,
|
|
25
|
+
plan_model_convergence,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
__all__ = [
|
|
29
|
+
"ConvergencePlan",
|
|
30
|
+
"ConvergenceResult",
|
|
31
|
+
"FixResult",
|
|
32
|
+
"ModelAnalysis",
|
|
33
|
+
"PlanItem",
|
|
34
|
+
"ReadOnlyConnectionError",
|
|
35
|
+
"analyze_model",
|
|
36
|
+
"can_auto_fix",
|
|
37
|
+
"execute_plan",
|
|
38
|
+
"plan_convergence",
|
|
39
|
+
"plan_model_convergence",
|
|
40
|
+
]
|