plain.postgres 0.110.2__tar.gz → 0.111.1__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.110.2/plain/postgres/README.md → plain_postgres-0.111.1/PKG-INFO +29 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/CHANGELOG.md +24 -0
- plain_postgres-0.110.2/PKG-INFO → plain_postgres-0.111.1/plain/postgres/README.md +16 -13
- plain_postgres-0.111.1/plain/postgres/convergence/__init__.py +40 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/convergence/analysis.py +301 -191
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/convergence/fixes.py +6 -8
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/convergence/planning.py +46 -58
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/otel.py +4 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/query.py +48 -26
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/sql/compiler.py +1 -1
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/pyproject.toml +1 -1
- plain_postgres-0.111.1/tests/conftest.py +56 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_constraint_violation_error.py +3 -11
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_convergence.py +54 -40
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_convergence_constraints.py +28 -30
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_convergence_defaults.py +24 -22
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_convergence_fk.py +13 -12
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_convergence_indexes.py +13 -20
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_convergence_nullability.py +21 -14
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_convergence_storage_parameters.py +11 -4
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_deferred_loading.py +15 -25
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_delete_behaviors.py +4 -12
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_queryset_repr.py +6 -18
- plain_postgres-0.111.1/tests/public/test_queryset_slicing.py +144 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_related.py +30 -37
- plain_postgres-0.110.2/plain/postgres/convergence/__init__.py +0 -87
- plain_postgres-0.110.2/tests/conftest.py +0 -26
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/.gitignore +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/CLAUDE.md +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/LICENSE +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/README.md +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/__init__.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/adapters.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/agents/.claude/rules/plain-postgres.md +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/agents/.claude/skills/plain-postgres-doctor/SKILL.md +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/aggregates.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/base.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/cli/__init__.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/cli/converge.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/cli/core.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/cli/decorators.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/cli/diagnose.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/cli/migrations.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/cli/schema.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/cli/sync.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/config.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/connection.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/constants.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/constraints.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/database_url.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/db.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/ddl.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/default_settings.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/deletion.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/dialect.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/entrypoints.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/enums.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/exceptions.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/expressions.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/__init__.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/base.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/binary.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/boolean.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/duration.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/encrypted.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/json.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/mixins.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/network.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/numeric.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/primary_key.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/related.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/related_descriptors.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/related_lookups.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/related_managers.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/reverse_descriptors.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/reverse_related.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/temporal.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/text.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/timezones.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/fields/uuid.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/forms.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/functions/__init__.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/functions/comparison.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/functions/datetime.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/functions/math.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/functions/mixins.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/functions/random.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/functions/text.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/functions/uuid.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/functions/window.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/indexes.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/introspection/__init__.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/introspection/health/__init__.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/introspection/health/checks_cumulative.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/introspection/health/checks_snapshot.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/introspection/health/checks_structural.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/introspection/health/context.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/introspection/health/helpers.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/introspection/health/ownership.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/introspection/health/runner.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/introspection/health/types.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/introspection/schema.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/lookups.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/meta.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/middleware.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/__init__.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/autodetector.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/exceptions.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/executor.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/graph.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/loader.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/migration.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/operations/__init__.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/operations/base.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/operations/fields.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/operations/models.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/operations/special.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/optimizer.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/questioner.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/recorder.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/serializer.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/state.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/utils.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/migrations/writer.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/options.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/preflight/__init__.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/preflight/database.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/preflight/indexes.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/preflight/models.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/query_utils.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/registry.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/schema.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/sources.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/sql/__init__.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/sql/constants.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/sql/datastructures.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/sql/query.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/sql/where.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/test/__init__.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/test/database.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/test/pytest.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/transaction.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/types.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/types.pyi +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/plain/postgres/utils.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/forms.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0001_initial.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0002_test_field_removed.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0003_deleteparent_childsetnull_childsetdefault_and_more.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0004_defaultquerysetmodel_mixintestmodel_and_more.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0005_feature_carfeature_car_features.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0006_secretstore.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0007_treenode_unconstrainedchild.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0008_setsentinelparent_diamondparenta_midparent_and_more.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0009_circb_circa_circb_partner.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0010_hideableitem.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0011_defaultsexample.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0012_iterationexample.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0013_indexexample_constraintexample_nullabilityexample.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0014_widget_rename_feature_tag_remove_carfeature_car_and_more.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0015_dbdefaultsexample.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0016_formsexample.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0017_random_string_token.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/0018_storageparametersexample.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/migrations/__init__.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/__init__.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/constraints.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/defaults.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/delete.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/encrypted.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/forms.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/indexes.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/iteration.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/mixins.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/nullability.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/querysets.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/relationships.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/storage_parameters.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/trees.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/models/unregistered.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/urls.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/examples/views.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/settings.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/app/urls.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/conftest_convergence.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_autodetector_not_null_errors.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_autodetector_type_change.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_connection_isolation.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_connection_lifecycle.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_connection_pool.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_connection_self_heal.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_convergence_timeouts.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_db_expression_defaults.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_diagnose.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_executor_connection_hook.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_fk_characterization.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_health.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_introspection.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_literal_default_persistence.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_management_connection.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_migration_executor.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_no_callable_defaults.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_otel_metrics.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_preflight_duplicate_indexes.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_preflight_fk_composite_hint.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_preflight_fk_coverage.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_schema_normalize_type.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/internal/test_schema_timeouts.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_create_update.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_database_url.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_encrypted_fields.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_exceptions.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_field_defaults.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_functions_uuid.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_integrity_error_mapping.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_iterator.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_m2m.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_manager_assignment.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_manual_pk.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_mixins.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_modelform_roundtrip.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_random_string_field.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_raw_query.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/tests/public/test_read_only_transactions.py +0 -0
- {plain_postgres-0.110.2 → plain_postgres-0.111.1}/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.1
|
|
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,29 @@
|
|
|
1
1
|
# plain-postgres changelog
|
|
2
2
|
|
|
3
|
+
## [0.111.1](https://github.com/dropseed/plain/releases/plain-postgres@0.111.1) (2026-07-10)
|
|
4
|
+
|
|
5
|
+
### What's changed
|
|
6
|
+
|
|
7
|
+
- `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))
|
|
8
|
+
- 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))
|
|
9
|
+
- 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))
|
|
10
|
+
|
|
11
|
+
### Upgrade instructions
|
|
12
|
+
|
|
13
|
+
- No changes required.
|
|
14
|
+
|
|
15
|
+
## [0.111.0](https://github.com/dropseed/plain/releases/plain-postgres@0.111.0) (2026-06-30)
|
|
16
|
+
|
|
17
|
+
### What's changed
|
|
18
|
+
|
|
19
|
+
- Slicing a `QuerySet` now always returns a `QuerySet`, even when its results are already cached — previously, slicing an already-evaluated queryset returned a plain `list`. The returned queryset carries the sliced cache, so iterating it won't re-query, but re-chaining it (adding a `.filter()`, ordering, etc.) drops the cache and applies the slice as SQL `LIMIT`/`OFFSET` so the rows stay correct. ([d60e07d6ad](https://github.com/dropseed/plain/commit/d60e07d6ad))
|
|
20
|
+
- Step slicing (e.g. `qs[::2]`) now raises `ValueError` instead of silently evaluating the queryset and returning a stepped `list`. Negative indexing and negative slice bounds continue to raise, as before. `RawQuerySet` is unaffected — it is always fully materialized, so its slicing keeps plain `list` semantics, where step and negative slicing still work. ([d60e07d6ad](https://github.com/dropseed/plain/commit/d60e07d6ad), [a873a521d4](https://github.com/dropseed/plain/commit/a873a521d4))
|
|
21
|
+
|
|
22
|
+
### Upgrade instructions
|
|
23
|
+
|
|
24
|
+
- If you relied on `queryset[a:b]` returning a `list` — for example checking `isinstance(result, list)`, calling list methods like `.append()` on it, or re-slicing it with a step — wrap it in `list(queryset[a:b])` to materialize it explicitly.
|
|
25
|
+
- Replace any step slicing of a queryset (`queryset[::2]`) with a `list(...)` conversion first, since it now raises `ValueError`.
|
|
26
|
+
|
|
3
27
|
## [0.110.2](https://github.com/dropseed/plain/releases/plain-postgres@0.110.2) (2026-06-26)
|
|
4
28
|
|
|
5
29
|
### What's changed
|
|
@@ -1,16 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: plain.postgres
|
|
3
|
-
Version: 0.110.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
|
-
|
|
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
|
+
]
|