plain.postgres 0.110.1__tar.gz → 0.110.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.110.1 → plain_postgres-0.110.2}/PKG-INFO +1 -1
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/CHANGELOG.md +10 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/agents/.claude/rules/plain-postgres.md +1 -10
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/enums.py +1 -1
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/expressions.py +13 -9
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/sql/compiler.py +1 -1
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/test/pytest.py +3 -3
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/pyproject.toml +1 -1
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_exceptions.py +2 -2
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_related.py +1 -1
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/.gitignore +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/CLAUDE.md +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/LICENSE +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/README.md +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/README.md +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/adapters.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/agents/.claude/skills/plain-postgres-doctor/SKILL.md +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/aggregates.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/base.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/cli/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/cli/converge.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/cli/core.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/cli/decorators.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/cli/diagnose.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/cli/migrations.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/cli/schema.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/cli/sync.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/config.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/connection.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/constants.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/constraints.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/convergence/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/convergence/analysis.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/convergence/fixes.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/convergence/planning.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/database_url.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/db.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/ddl.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/default_settings.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/deletion.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/dialect.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/entrypoints.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/exceptions.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/base.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/binary.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/boolean.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/duration.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/encrypted.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/json.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/mixins.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/network.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/numeric.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/primary_key.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/related.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/related_descriptors.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/related_lookups.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/related_managers.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/reverse_descriptors.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/reverse_related.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/temporal.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/text.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/timezones.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/uuid.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/forms.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/functions/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/functions/comparison.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/functions/datetime.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/functions/math.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/functions/mixins.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/functions/random.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/functions/text.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/functions/uuid.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/functions/window.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/indexes.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/checks_cumulative.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/checks_snapshot.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/checks_structural.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/context.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/helpers.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/ownership.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/runner.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/types.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/schema.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/lookups.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/meta.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/middleware.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/autodetector.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/exceptions.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/executor.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/graph.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/loader.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/migration.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/base.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/fields.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/models.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/special.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/optimizer.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/questioner.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/recorder.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/serializer.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/state.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/utils.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/writer.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/options.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/otel.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/preflight/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/preflight/database.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/preflight/indexes.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/preflight/models.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/query.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/query_utils.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/registry.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/schema.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/sources.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/sql/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/sql/constants.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/sql/datastructures.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/sql/query.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/sql/where.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/test/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/test/database.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/transaction.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/types.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/types.pyi +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/utils.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/forms.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0001_initial.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0002_test_field_removed.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0003_deleteparent_childsetnull_childsetdefault_and_more.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0004_defaultquerysetmodel_mixintestmodel_and_more.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0005_feature_carfeature_car_features.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0006_secretstore.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0007_treenode_unconstrainedchild.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0008_setsentinelparent_diamondparenta_midparent_and_more.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0009_circb_circa_circb_partner.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0010_hideableitem.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0011_defaultsexample.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0012_iterationexample.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0013_indexexample_constraintexample_nullabilityexample.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0014_widget_rename_feature_tag_remove_carfeature_car_and_more.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0015_dbdefaultsexample.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0016_formsexample.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0017_random_string_token.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0018_storageparametersexample.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/__init__.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/constraints.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/defaults.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/delete.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/encrypted.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/forms.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/indexes.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/iteration.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/mixins.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/nullability.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/querysets.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/relationships.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/storage_parameters.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/trees.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/unregistered.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/urls.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/views.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/settings.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/urls.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/conftest.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/conftest_convergence.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_autodetector_not_null_errors.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_autodetector_type_change.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_connection_isolation.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_connection_lifecycle.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_connection_pool.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_connection_self_heal.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_constraint_violation_error.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_convergence.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_convergence_constraints.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_convergence_defaults.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_convergence_fk.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_convergence_indexes.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_convergence_nullability.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_convergence_storage_parameters.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_convergence_timeouts.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_db_expression_defaults.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_diagnose.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_executor_connection_hook.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_fk_characterization.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_health.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_introspection.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_literal_default_persistence.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_management_connection.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_migration_executor.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_no_callable_defaults.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_otel_metrics.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_preflight_duplicate_indexes.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_preflight_fk_composite_hint.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_preflight_fk_coverage.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_schema_normalize_type.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_schema_timeouts.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_create_update.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_database_url.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_deferred_loading.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_delete_behaviors.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_encrypted_fields.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_field_defaults.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_functions_uuid.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_integrity_error_mapping.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_iterator.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_m2m.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_manager_assignment.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_manual_pk.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_mixins.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_modelform_roundtrip.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_queryset_repr.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_random_string_field.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_raw_query.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_read_only_transactions.py +0 -0
- {plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_related_instance_filter.py +0 -0
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# plain-postgres changelog
|
|
2
2
|
|
|
3
|
+
## [0.110.2](https://github.com/dropseed/plain/releases/plain-postgres@0.110.2) (2026-06-26)
|
|
4
|
+
|
|
5
|
+
### What's changed
|
|
6
|
+
|
|
7
|
+
- Internal type-annotation cleanups (`Func` expression attributes, enum choices) and a dev-dependency bump (pytest 9.1.1) to clear a security advisory. No public API changes. ([288bbf0bb1](https://github.com/dropseed/plain/commit/288bbf0bb1))
|
|
8
|
+
|
|
9
|
+
### Upgrade instructions
|
|
10
|
+
|
|
11
|
+
- No changes required.
|
|
12
|
+
|
|
3
13
|
## [0.110.1](https://github.com/dropseed/plain/releases/plain-postgres@0.110.1) (2026-06-22)
|
|
4
14
|
|
|
5
15
|
### What's changed
|
|
@@ -39,16 +39,7 @@ Do NOT import field classes directly from `plain.postgres` or `plain.postgres.fi
|
|
|
39
39
|
|
|
40
40
|
## Schema Changes
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
In your plan, present:
|
|
45
|
-
|
|
46
|
-
- Proposed schema as a table (model, field, type, constraints)
|
|
47
|
-
- Relationship cardinality (1:1, 1:N, M:N)
|
|
48
|
-
- Key decisions: nullable vs default, indexing, cascade behavior
|
|
49
|
-
- Whether the data could live on an existing model instead of a new one
|
|
50
|
-
|
|
51
|
-
Get approval before writing any model code or generating migrations.
|
|
42
|
+
Migrations are annoying to revise after the fact; convergence is cheap. So before making a batch of migration-generating changes — new models, new columns, or column-type changes — think the design through first. Nullability, defaults, indexes, constraints, `on_delete`, and `choices` aren't migrations; they're convergence (edit the model and re-sync), so they stay cheap to revise. For a large set of migration-dependent changes, surfacing the design first (plan mode fits) is worth it.
|
|
52
43
|
|
|
53
44
|
## Migrations vs Convergence
|
|
54
45
|
|
|
@@ -58,7 +58,7 @@ class ChoicesMeta(enum.EnumMeta):
|
|
|
58
58
|
@property
|
|
59
59
|
def choices(cls) -> list[tuple[Any, str]]:
|
|
60
60
|
empty = [(None, cls.__empty__)] if hasattr(cls, "__empty__") else []
|
|
61
|
-
return empty + [(member.value, member.label) for member in cls] # ty: ignore[unresolved-attribute
|
|
61
|
+
return empty + [(member.value, member.label) for member in cls] # ty: ignore[unresolved-attribute]
|
|
62
62
|
|
|
63
63
|
@property
|
|
64
64
|
def labels(cls) -> list[str]:
|
|
@@ -8,7 +8,7 @@ from collections import defaultdict
|
|
|
8
8
|
from decimal import Decimal
|
|
9
9
|
from functools import cached_property
|
|
10
10
|
from types import NoneType
|
|
11
|
-
from typing import TYPE_CHECKING, Any, Protocol, Self, runtime_checkable
|
|
11
|
+
from typing import TYPE_CHECKING, Any, Protocol, Self, cast, runtime_checkable
|
|
12
12
|
from uuid import UUID
|
|
13
13
|
|
|
14
14
|
import psycopg
|
|
@@ -911,10 +911,10 @@ class OuterRef(F):
|
|
|
911
911
|
class Func(Expression):
|
|
912
912
|
"""An SQL function call."""
|
|
913
913
|
|
|
914
|
-
function = None
|
|
915
|
-
template = "%(function)s(%(expressions)s)"
|
|
916
|
-
arg_joiner = ", "
|
|
917
|
-
arity = None # The number of arguments the function accepts.
|
|
914
|
+
function: str | None = None
|
|
915
|
+
template: str = "%(function)s(%(expressions)s)"
|
|
916
|
+
arg_joiner: str = ", "
|
|
917
|
+
arity: int | None = None # The number of arguments the function accepts.
|
|
918
918
|
|
|
919
919
|
def __init__(
|
|
920
920
|
self, *expressions: Any, output_field: Field | None = None, **extra: Any
|
|
@@ -1001,10 +1001,14 @@ class Func(Expression):
|
|
|
1001
1001
|
data["function"] = function
|
|
1002
1002
|
else:
|
|
1003
1003
|
data.setdefault("function", self.function)
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1004
|
+
# `data` is typed dict[str, Any], so the override values come back as
|
|
1005
|
+
# Any; they are always strings, so cast to keep the `or` fallback typed.
|
|
1006
|
+
resolved_template = template or cast(str, data.get("template", self.template))
|
|
1007
|
+
resolved_joiner = arg_joiner or cast(
|
|
1008
|
+
str, data.get("arg_joiner", self.arg_joiner)
|
|
1009
|
+
)
|
|
1010
|
+
data["expressions"] = data["field"] = resolved_joiner.join(sql_parts)
|
|
1011
|
+
return resolved_template % data, params
|
|
1008
1012
|
|
|
1009
1013
|
def copy(self) -> Self:
|
|
1010
1014
|
clone = super().copy()
|
|
@@ -344,7 +344,7 @@ class SQLCompiler:
|
|
|
344
344
|
if self.query.select_related:
|
|
345
345
|
related_klass_infos = self.get_related_selections(select, select_mask)
|
|
346
346
|
if klass_info is not None:
|
|
347
|
-
klass_info["related_klass_infos"] = related_klass_infos
|
|
347
|
+
klass_info["related_klass_infos"] = related_klass_infos
|
|
348
348
|
|
|
349
349
|
ret = []
|
|
350
350
|
col_idx = 1
|
|
@@ -24,7 +24,7 @@ def _db_disabled() -> Generator[None]:
|
|
|
24
24
|
"""
|
|
25
25
|
|
|
26
26
|
def cursor_disabled(self: Any) -> None:
|
|
27
|
-
pytest.fail("Database access not allowed without the `db` fixture")
|
|
27
|
+
pytest.fail("Database access not allowed without the `db` fixture")
|
|
28
28
|
|
|
29
29
|
# Save original cursor method and replace with disabled version
|
|
30
30
|
setattr(DatabaseConnection, "_enabled_cursor", DatabaseConnection.cursor)
|
|
@@ -63,7 +63,7 @@ def setup_db(request: Any) -> Generator[None]:
|
|
|
63
63
|
@pytest.fixture
|
|
64
64
|
def db(setup_db: Any, request: Any) -> Generator[None]:
|
|
65
65
|
if "isolated_db" in request.fixturenames:
|
|
66
|
-
pytest.fail("The 'db' and 'isolated_db' fixtures cannot be used together")
|
|
66
|
+
pytest.fail("The 'db' and 'isolated_db' fixtures cannot be used together")
|
|
67
67
|
|
|
68
68
|
# Set .cursor() back to the original implementation to unblock it
|
|
69
69
|
DatabaseConnection.cursor = getattr(DatabaseConnection, "_enabled_cursor")
|
|
@@ -101,7 +101,7 @@ def isolated_db(request: Any) -> Generator[None]:
|
|
|
101
101
|
test database.
|
|
102
102
|
"""
|
|
103
103
|
if "db" in request.fixturenames:
|
|
104
|
-
pytest.fail("The 'db' and 'isolated_db' fixtures cannot be used together")
|
|
104
|
+
pytest.fail("The 'db' and 'isolated_db' fixtures cannot be used together")
|
|
105
105
|
# Set .cursor() back to the original implementation to unblock it
|
|
106
106
|
DatabaseConnection.cursor = getattr(DatabaseConnection, "_enabled_cursor")
|
|
107
107
|
|
|
@@ -62,11 +62,11 @@ def test_base_exceptions_from_plain_exceptions():
|
|
|
62
62
|
except ObjectDoesNotExist:
|
|
63
63
|
pass # Should work due to inheritance
|
|
64
64
|
except Exception:
|
|
65
|
-
pytest.fail("Should have caught with base ObjectDoesNotExist")
|
|
65
|
+
pytest.fail("Should have caught with base ObjectDoesNotExist")
|
|
66
66
|
|
|
67
67
|
try:
|
|
68
68
|
raise IterationExample.MultipleObjectsReturned("model-specific exception")
|
|
69
69
|
except MultipleObjectsReturned:
|
|
70
70
|
pass # Should work due to inheritance
|
|
71
71
|
except Exception:
|
|
72
|
-
pytest.fail("Should have caught with base MultipleObjectsReturned")
|
|
72
|
+
pytest.fail("Should have caught with base MultipleObjectsReturned")
|
|
@@ -55,7 +55,7 @@ class TestForwardForeignKeyDescriptor:
|
|
|
55
55
|
except Exception as e:
|
|
56
56
|
# For now, accept that nullable FK behavior might need adjustment
|
|
57
57
|
# The core relationship functionality works
|
|
58
|
-
pytest.skip(f"Nullable FK handling needs refinement: {e}")
|
|
58
|
+
pytest.skip(f"Nullable FK handling needs refinement: {e}")
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
class TestReverseForeignKey:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/related_descriptors.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/fields/reverse_descriptors.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/context.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/helpers.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/ownership.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/runner.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/introspection/health/types.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/__init__.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/base.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/fields.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/models.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/special.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0001_initial.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0006_secretstore.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0010_hideableitem.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/migrations/0016_formsexample.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/relationships.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/app/examples/models/storage_parameters.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_autodetector_type_change.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_connection_isolation.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_connection_lifecycle.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_connection_self_heal.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_constraint_violation_error.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_convergence_constraints.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_convergence_defaults.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_convergence_indexes.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_convergence_nullability.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_convergence_timeouts.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_db_expression_defaults.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_executor_connection_hook.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_fk_characterization.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_literal_default_persistence.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_management_connection.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_no_callable_defaults.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_preflight_duplicate_indexes.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_preflight_fk_composite_hint.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_preflight_fk_coverage.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/internal/test_schema_normalize_type.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_integrity_error_mapping.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_read_only_transactions.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.1 → plain_postgres-0.110.2}/tests/public/test_related_instance_filter.py
RENAMED
|
File without changes
|