plain.postgres 0.110.0__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.0 → plain_postgres-0.110.2}/PKG-INFO +1 -1
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/CHANGELOG.md +20 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/agents/.claude/rules/plain-postgres.md +1 -10
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/enums.py +1 -1
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/expressions.py +13 -9
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/sql/compiler.py +8 -3
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/test/pytest.py +3 -3
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/pyproject.toml +1 -1
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_exceptions.py +2 -2
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_related.py +1 -1
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/.gitignore +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/CLAUDE.md +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/LICENSE +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/README.md +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/README.md +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/adapters.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/agents/.claude/skills/plain-postgres-doctor/SKILL.md +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/aggregates.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/base.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/cli/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/cli/converge.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/cli/core.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/cli/decorators.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/cli/diagnose.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/cli/migrations.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/cli/schema.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/cli/sync.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/config.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/connection.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/constants.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/constraints.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/convergence/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/convergence/analysis.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/convergence/fixes.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/convergence/planning.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/database_url.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/db.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/ddl.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/default_settings.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/deletion.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/dialect.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/entrypoints.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/exceptions.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/base.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/binary.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/boolean.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/duration.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/encrypted.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/json.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/mixins.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/network.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/numeric.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/primary_key.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/related.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/related_descriptors.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/related_lookups.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/related_managers.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/reverse_descriptors.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/reverse_related.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/temporal.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/text.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/timezones.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/fields/uuid.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/forms.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/functions/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/functions/comparison.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/functions/datetime.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/functions/math.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/functions/mixins.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/functions/random.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/functions/text.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/functions/uuid.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/functions/window.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/indexes.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/health/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/health/checks_cumulative.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/health/checks_snapshot.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/health/checks_structural.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/health/context.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/health/helpers.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/health/ownership.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/health/runner.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/health/types.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/schema.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/lookups.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/meta.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/middleware.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/autodetector.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/exceptions.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/executor.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/graph.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/loader.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/migration.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/base.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/fields.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/models.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/special.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/optimizer.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/questioner.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/recorder.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/serializer.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/state.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/utils.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/writer.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/options.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/otel.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/preflight/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/preflight/database.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/preflight/indexes.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/preflight/models.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/query.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/query_utils.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/registry.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/schema.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/sources.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/sql/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/sql/constants.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/sql/datastructures.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/sql/query.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/sql/where.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/test/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/test/database.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/transaction.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/types.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/types.pyi +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/utils.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/forms.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0001_initial.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0002_test_field_removed.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0003_deleteparent_childsetnull_childsetdefault_and_more.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0004_defaultquerysetmodel_mixintestmodel_and_more.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0005_feature_carfeature_car_features.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0006_secretstore.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0007_treenode_unconstrainedchild.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0008_setsentinelparent_diamondparenta_midparent_and_more.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0009_circb_circa_circb_partner.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0010_hideableitem.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0011_defaultsexample.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0012_iterationexample.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0013_indexexample_constraintexample_nullabilityexample.py +0 -0
- {plain_postgres-0.110.0 → 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.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0015_dbdefaultsexample.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0016_formsexample.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0017_random_string_token.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/0018_storageparametersexample.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/migrations/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/__init__.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/constraints.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/defaults.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/delete.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/encrypted.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/forms.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/indexes.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/iteration.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/mixins.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/nullability.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/querysets.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/relationships.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/storage_parameters.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/trees.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/models/unregistered.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/urls.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/examples/views.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/settings.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/app/urls.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/conftest.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/conftest_convergence.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_autodetector_not_null_errors.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_autodetector_type_change.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_connection_isolation.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_connection_lifecycle.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_connection_pool.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_connection_self_heal.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_constraint_violation_error.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_convergence.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_convergence_constraints.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_convergence_defaults.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_convergence_fk.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_convergence_indexes.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_convergence_nullability.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_convergence_storage_parameters.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_convergence_timeouts.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_db_expression_defaults.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_diagnose.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_executor_connection_hook.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_fk_characterization.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_health.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_introspection.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_literal_default_persistence.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_management_connection.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_migration_executor.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_no_callable_defaults.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_otel_metrics.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_preflight_duplicate_indexes.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_preflight_fk_composite_hint.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_preflight_fk_coverage.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_schema_normalize_type.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_schema_timeouts.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_create_update.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_database_url.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_deferred_loading.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_delete_behaviors.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_encrypted_fields.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_field_defaults.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_functions_uuid.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_integrity_error_mapping.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_iterator.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_m2m.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_manager_assignment.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_manual_pk.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_mixins.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_modelform_roundtrip.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_queryset_repr.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_random_string_field.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_raw_query.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_read_only_transactions.py +0 -0
- {plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_related_instance_filter.py +0 -0
|
@@ -1,5 +1,25 @@
|
|
|
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
|
+
|
|
13
|
+
## [0.110.1](https://github.com/dropseed/plain/releases/plain-postgres@0.110.1) (2026-06-22)
|
|
14
|
+
|
|
15
|
+
### What's changed
|
|
16
|
+
|
|
17
|
+
- Internal: the ordering infinite-loop guard builds its join signature with `isinstance(alias, Join)` instead of `getattr(alias, "join_col", None)`, keeping `.join_col` greppable and type-checked. No behavior change. ([c813405f](https://github.com/dropseed/plain/commit/c813405f))
|
|
18
|
+
|
|
19
|
+
### Upgrade instructions
|
|
20
|
+
|
|
21
|
+
- No changes required.
|
|
22
|
+
|
|
3
23
|
## [0.110.0](https://github.com/dropseed/plain/releases/plain-postgres@0.110.0) (2026-06-17)
|
|
4
24
|
|
|
5
25
|
### 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()
|
|
@@ -42,6 +42,7 @@ from plain.postgres.sql.constants import (
|
|
|
42
42
|
ORDER_DIR,
|
|
43
43
|
SINGLE,
|
|
44
44
|
)
|
|
45
|
+
from plain.postgres.sql.datastructures import Join
|
|
45
46
|
from plain.postgres.sql.query import Query, get_order_dir
|
|
46
47
|
from plain.postgres.transaction import TransactionManagementError
|
|
47
48
|
from plain.utils.hashable import make_hashable
|
|
@@ -343,7 +344,7 @@ class SQLCompiler:
|
|
|
343
344
|
if self.query.select_related:
|
|
344
345
|
related_klass_infos = self.get_related_selections(select, select_mask)
|
|
345
346
|
if klass_info is not None:
|
|
346
|
-
klass_info["related_klass_infos"] = related_klass_infos
|
|
347
|
+
klass_info["related_klass_infos"] = related_klass_infos
|
|
347
348
|
|
|
348
349
|
ret = []
|
|
349
350
|
col_idx = 1
|
|
@@ -903,10 +904,14 @@ class SQLCompiler:
|
|
|
903
904
|
and field.name != pieces[-1]
|
|
904
905
|
and not getattr(transform_function, "has_transforms", False)
|
|
905
906
|
):
|
|
906
|
-
# Firstly, avoid infinite loops.
|
|
907
|
+
# Firstly, avoid infinite loops. Each join contributes its column
|
|
908
|
+
# pair to the signature; the base table (no join_col) contributes
|
|
909
|
+
# None. isinstance keeps `.join_col` greppable and type-checked.
|
|
907
910
|
already_seen = already_seen or set()
|
|
911
|
+
alias_map = self.query.alias_map
|
|
908
912
|
join_tuple = tuple(
|
|
909
|
-
|
|
913
|
+
alias_map[j].join_col if isinstance(alias_map[j], Join) else None
|
|
914
|
+
for j in joins
|
|
910
915
|
)
|
|
911
916
|
if join_tuple in already_seen:
|
|
912
917
|
raise FieldError("Infinite loop caused by ordering.")
|
|
@@ -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.0 → 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.0 → 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.0 → 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.0 → plain_postgres-0.110.2}/plain/postgres/introspection/health/context.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/health/helpers.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/health/ownership.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/introspection/health/runner.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → 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.0 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/__init__.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/base.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/fields.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/plain/postgres/migrations/operations/models.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → 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.0 → 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.0 → 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.0 → 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.0 → 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.0 → plain_postgres-0.110.2}/tests/app/examples/models/relationships.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → 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.0 → plain_postgres-0.110.2}/tests/internal/test_autodetector_type_change.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_connection_isolation.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_connection_lifecycle.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_connection_self_heal.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_constraint_violation_error.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_convergence_constraints.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_convergence_defaults.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_convergence_indexes.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_convergence_nullability.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_convergence_timeouts.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_db_expression_defaults.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_executor_connection_hook.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → 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.0 → plain_postgres-0.110.2}/tests/internal/test_literal_default_persistence.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_management_connection.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_no_callable_defaults.py
RENAMED
|
File without changes
|
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_preflight_duplicate_indexes.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_preflight_fk_composite_hint.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/internal/test_preflight_fk_coverage.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → 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.0 → 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.0 → plain_postgres-0.110.2}/tests/public/test_read_only_transactions.py
RENAMED
|
File without changes
|
{plain_postgres-0.110.0 → plain_postgres-0.110.2}/tests/public/test_related_instance_filter.py
RENAMED
|
File without changes
|