plain.postgres 0.113.0__tar.gz → 0.113.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.
Files changed (232) hide show
  1. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/PKG-INFO +1 -1
  2. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/CHANGELOG.md +24 -1
  3. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/meta.py +2 -2
  4. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/query.py +1 -1
  5. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/sql/compiler.py +1 -1
  6. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/sql/query.py +1 -1
  7. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/pyproject.toml +1 -1
  8. plain_postgres-0.113.2/tests/public/test_order_by_expressions.py +30 -0
  9. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/.gitignore +0 -0
  10. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/CLAUDE.md +0 -0
  11. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/LICENSE +0 -0
  12. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/README.md +0 -0
  13. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/README.md +0 -0
  14. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/__init__.py +0 -0
  15. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/adapters.py +0 -0
  16. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/agents/.claude/rules/plain-postgres.md +0 -0
  17. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/agents/.claude/skills/plain-postgres-doctor/SKILL.md +0 -0
  18. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/aggregates.py +0 -0
  19. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/base.py +0 -0
  20. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/cli/__init__.py +0 -0
  21. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/cli/converge.py +0 -0
  22. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/cli/core.py +0 -0
  23. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/cli/decorators.py +0 -0
  24. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/cli/diagnose.py +0 -0
  25. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/cli/migrations.py +0 -0
  26. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/cli/schema.py +0 -0
  27. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/cli/sync.py +0 -0
  28. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/config.py +0 -0
  29. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/connection.py +0 -0
  30. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/constants.py +0 -0
  31. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/constraints.py +0 -0
  32. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/convergence/__init__.py +0 -0
  33. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/convergence/analysis.py +0 -0
  34. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/convergence/corrections.py +0 -0
  35. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/convergence/planning.py +0 -0
  36. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/database_url.py +0 -0
  37. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/databases.py +0 -0
  38. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/db.py +0 -0
  39. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/ddl.py +0 -0
  40. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/default_settings.py +0 -0
  41. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/deletion.py +0 -0
  42. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/dialect.py +0 -0
  43. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/entrypoints.py +0 -0
  44. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/enums.py +0 -0
  45. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/exceptions.py +0 -0
  46. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/expressions.py +0 -0
  47. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/__init__.py +0 -0
  48. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/base.py +0 -0
  49. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/binary.py +0 -0
  50. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/boolean.py +0 -0
  51. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/duration.py +0 -0
  52. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/encrypted.py +0 -0
  53. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/json.py +0 -0
  54. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/mixins.py +0 -0
  55. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/network.py +0 -0
  56. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/numeric.py +0 -0
  57. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/primary_key.py +0 -0
  58. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/related.py +0 -0
  59. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/related_descriptors.py +0 -0
  60. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/related_lookups.py +0 -0
  61. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/related_managers.py +0 -0
  62. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/reverse_descriptors.py +0 -0
  63. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/reverse_related.py +0 -0
  64. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/temporal.py +0 -0
  65. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/text.py +0 -0
  66. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/timezones.py +0 -0
  67. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/fields/uuid.py +0 -0
  68. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/forms.py +0 -0
  69. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/functions/__init__.py +0 -0
  70. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/functions/comparison.py +0 -0
  71. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/functions/datetime.py +0 -0
  72. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/functions/math.py +0 -0
  73. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/functions/mixins.py +0 -0
  74. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/functions/random.py +0 -0
  75. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/functions/text.py +0 -0
  76. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/functions/uuid.py +0 -0
  77. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/functions/window.py +0 -0
  78. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/indexes.py +0 -0
  79. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/introspection/__init__.py +0 -0
  80. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/introspection/health/__init__.py +0 -0
  81. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/introspection/health/checks_cumulative.py +0 -0
  82. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/introspection/health/checks_snapshot.py +0 -0
  83. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/introspection/health/checks_structural.py +0 -0
  84. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/introspection/health/context.py +0 -0
  85. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/introspection/health/helpers.py +0 -0
  86. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/introspection/health/ownership.py +0 -0
  87. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/introspection/health/runner.py +0 -0
  88. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/introspection/health/types.py +0 -0
  89. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/introspection/schema.py +0 -0
  90. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/lookups.py +0 -0
  91. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/middleware.py +0 -0
  92. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/__init__.py +0 -0
  93. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/autodetector.py +0 -0
  94. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/exceptions.py +0 -0
  95. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/executor.py +0 -0
  96. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/graph.py +0 -0
  97. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/loader.py +0 -0
  98. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/migration.py +0 -0
  99. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/operations/__init__.py +0 -0
  100. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/operations/base.py +0 -0
  101. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/operations/fields.py +0 -0
  102. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/operations/models.py +0 -0
  103. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/operations/special.py +0 -0
  104. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/optimizer.py +0 -0
  105. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/questioner.py +0 -0
  106. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/recorder.py +0 -0
  107. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/serializer.py +0 -0
  108. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/state.py +0 -0
  109. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/utils.py +0 -0
  110. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/migrations/writer.py +0 -0
  111. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/options.py +0 -0
  112. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/otel.py +0 -0
  113. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/preflight/__init__.py +0 -0
  114. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/preflight/database.py +0 -0
  115. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/preflight/indexes.py +0 -0
  116. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/preflight/models.py +0 -0
  117. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/query_utils.py +0 -0
  118. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/registry.py +0 -0
  119. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/schema.py +0 -0
  120. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/schema_lock.py +0 -0
  121. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/sources.py +0 -0
  122. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/sql/__init__.py +0 -0
  123. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/sql/constants.py +0 -0
  124. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/sql/datastructures.py +0 -0
  125. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/sql/where.py +0 -0
  126. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/test/__init__.py +0 -0
  127. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/test/database.py +0 -0
  128. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/test/pytest.py +0 -0
  129. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/transaction.py +0 -0
  130. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/types.py +0 -0
  131. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/types.pyi +0 -0
  132. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/plain/postgres/utils.py +0 -0
  133. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/forms.py +0 -0
  134. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0001_initial.py +0 -0
  135. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0002_test_field_removed.py +0 -0
  136. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0003_deleteparent_childsetnull_childsetdefault_and_more.py +0 -0
  137. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0004_defaultquerysetmodel_mixintestmodel_and_more.py +0 -0
  138. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0005_feature_carfeature_car_features.py +0 -0
  139. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0006_secretstore.py +0 -0
  140. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0007_treenode_unconstrainedchild.py +0 -0
  141. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0008_setsentinelparent_diamondparenta_midparent_and_more.py +0 -0
  142. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0009_circb_circa_circb_partner.py +0 -0
  143. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0010_hideableitem.py +0 -0
  144. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0011_defaultsexample.py +0 -0
  145. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0012_iterationexample.py +0 -0
  146. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0013_indexexample_constraintexample_nullabilityexample.py +0 -0
  147. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0014_widget_rename_feature_tag_remove_carfeature_car_and_more.py +0 -0
  148. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0015_dbdefaultsexample.py +0 -0
  149. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0016_formsexample.py +0 -0
  150. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0017_random_string_token.py +0 -0
  151. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/0018_storageparametersexample.py +0 -0
  152. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/migrations/__init__.py +0 -0
  153. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/__init__.py +0 -0
  154. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/constraints.py +0 -0
  155. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/defaults.py +0 -0
  156. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/delete.py +0 -0
  157. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/encrypted.py +0 -0
  158. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/forms.py +0 -0
  159. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/indexes.py +0 -0
  160. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/iteration.py +0 -0
  161. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/mixins.py +0 -0
  162. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/nullability.py +0 -0
  163. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/querysets.py +0 -0
  164. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/relationships.py +0 -0
  165. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/storage_parameters.py +0 -0
  166. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/trees.py +0 -0
  167. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/models/unregistered.py +0 -0
  168. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/urls.py +0 -0
  169. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/examples/views.py +0 -0
  170. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/settings.py +0 -0
  171. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/app/urls.py +0 -0
  172. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/conftest.py +0 -0
  173. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/conftest_convergence.py +0 -0
  174. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_apply_replan.py +0 -0
  175. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_autodetector_not_null_errors.py +0 -0
  176. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_autodetector_type_change.py +0 -0
  177. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_connection_isolation.py +0 -0
  178. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_connection_lifecycle.py +0 -0
  179. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_connection_pool.py +0 -0
  180. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_connection_self_heal.py +0 -0
  181. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_constraint_violation_error.py +0 -0
  182. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_convergence.py +0 -0
  183. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_convergence_constraints.py +0 -0
  184. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_convergence_defaults.py +0 -0
  185. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_convergence_fk.py +0 -0
  186. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_convergence_indexes.py +0 -0
  187. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_convergence_nullability.py +0 -0
  188. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_convergence_storage_parameters.py +0 -0
  189. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_convergence_timeouts.py +0 -0
  190. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_databases_not_on_runtime_path.py +0 -0
  191. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_db_expression_defaults.py +0 -0
  192. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_diagnose.py +0 -0
  193. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_executor_connection_hook.py +0 -0
  194. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_fk_characterization.py +0 -0
  195. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_health.py +0 -0
  196. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_introspection.py +0 -0
  197. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_literal_default_persistence.py +0 -0
  198. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_management_connection.py +0 -0
  199. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_migration_executor.py +0 -0
  200. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_no_callable_defaults.py +0 -0
  201. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_otel_metrics.py +0 -0
  202. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_preflight_duplicate_indexes.py +0 -0
  203. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_preflight_fk_composite_hint.py +0 -0
  204. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_preflight_fk_coverage.py +0 -0
  205. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_rollback_exc_attribution.py +0 -0
  206. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_schema_lock.py +0 -0
  207. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_schema_normalize_type.py +0 -0
  208. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/internal/test_schema_timeouts.py +0 -0
  209. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_create_update.py +0 -0
  210. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_database_url.py +0 -0
  211. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_databases.py +0 -0
  212. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_deferred_loading.py +0 -0
  213. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_delete_behaviors.py +0 -0
  214. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_encrypted_fields.py +0 -0
  215. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_exceptions.py +0 -0
  216. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_field_defaults.py +0 -0
  217. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_functions_uuid.py +0 -0
  218. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_integrity_error_mapping.py +0 -0
  219. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_iterator.py +0 -0
  220. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_m2m.py +0 -0
  221. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_manager_assignment.py +0 -0
  222. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_manual_pk.py +0 -0
  223. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_mixins.py +0 -0
  224. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_modelform_roundtrip.py +0 -0
  225. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_only_empty_defaults.py +0 -0
  226. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_queryset_repr.py +0 -0
  227. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_queryset_slicing.py +0 -0
  228. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_random_string_field.py +0 -0
  229. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_raw_query.py +0 -0
  230. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_read_only_transactions.py +0 -0
  231. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_related.py +0 -0
  232. {plain_postgres-0.113.0 → plain_postgres-0.113.2}/tests/public/test_related_instance_filter.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain.postgres
3
- Version: 0.113.0
3
+ Version: 0.113.2
4
4
  Summary: Model your data and store it in a database.
5
5
  Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
6
6
  License-Expression: BSD-3-Clause
@@ -1,5 +1,26 @@
1
1
  # plain-postgres changelog
2
2
 
3
+ ## [0.113.2](https://github.com/dropseed/plain/releases/plain-postgres@0.113.2) (2026-08-10)
4
+
5
+ ### What's changed
6
+
7
+ - Fixed a `NameError` on any expression-based ordering — `Model.query.order_by(F("name"))`, `order_by(Lower("name"))`, or `Options(ordering=[Lower("name")])`. `SQLCompiler` cast ordering items to `BaseExpression`, which was imported only under `TYPE_CHECKING`; `cast()`'s first argument is an ordinary expression and is evaluated at runtime, so the branch raised instead of compiling. `BaseExpression` moves into the existing runtime import from `plain.postgres.expressions`. ([3429735be0](https://github.com/dropseed/plain/commit/3429735be0))
8
+ - `QuerySet.order_by()` and `Query.add_ordering()` now accept `str | ResolvableExpression` instead of `str` / `str | BaseExpression`. That's the protocol both layers actually test with `isinstance()`, and the one `F()` satisfies (`F` extends `Combinable`, not `BaseExpression`) — so no type-checked caller could reach the expression branch at all before. ([3429735be0](https://github.com/dropseed/plain/commit/3429735be0))
9
+
10
+ ### Upgrade instructions
11
+
12
+ - No changes required.
13
+
14
+ ## [0.113.1](https://github.com/dropseed/plain/releases/plain-postgres@0.113.1) (2026-08-07)
15
+
16
+ ### What's changed
17
+
18
+ - Internal: `Meta` field sorting tolerates a field whose `name` hasn't been set yet, keeping the sort key type-correct under ty 0.0.65. No behavior change. ([a798c13c92](https://github.com/dropseed/plain/commit/a798c13c92))
19
+
20
+ ### Upgrade instructions
21
+
22
+ - No changes required.
23
+
3
24
  ## [0.113.0](https://github.com/dropseed/plain/releases/plain-postgres@0.113.0) (2026-08-02)
4
25
 
5
26
  ### What's changed
@@ -18,7 +39,9 @@
18
39
  - Replace `QuerySet.extra()` calls: `extra(select=...)` becomes `annotate(name=RawSQL("...", []))`, `extra(where=...)` becomes `filter()` with expressions or `RawSQL`, and `extra(order_by=...)` becomes `order_by()` on an annotation.
19
40
  - Replace `FilteredRelation` annotations with filtered subqueries or `Q` conditions, and `QuerySet.alias()` with `annotate()`.
20
41
  - Replace `Q(a) ^ Q(b)` / `qs1 ^ qs2` with explicit AND/OR logic: `(Q(a) | Q(b)) & ~(Q(a) & Q(b))`.
21
- - If `plain migrations create` now refuses a field it previously accepted, follow the error's remedy: declare `required=False, default=""` (or `default=b""` / an appropriate literal) so existing rows get a value, or add it with `allow_null=True` plus a backfill data migration.(https://github.com/dropseed/plain/releases/plain-postgres@0.112.0) (2026-07-21)
42
+ - If `plain migrations create` now refuses a field it previously accepted, follow the error's remedy: declare `required=False, default=""` (or `default=b""` / an appropriate literal) so existing rows get a value, or add it with `allow_null=True` plus a backfill data migration.
43
+
44
+ ## [0.112.0](https://github.com/dropseed/plain/releases/plain-postgres@0.112.0) (2026-07-21)
22
45
 
23
46
  ### What's changed
24
47
 
@@ -130,8 +130,8 @@ class Meta:
130
130
  field.contribute_to_class(model, attr_name)
131
131
 
132
132
  # Sort fields: primary key first, then alphabetically by name
133
- instance.local_fields.sort(key=lambda f: (not f.primary_key, f.name))
134
- instance.local_many_to_many.sort(key=lambda f: f.name)
133
+ instance.local_fields.sort(key=lambda f: (not f.primary_key, f.name or ""))
134
+ instance.local_many_to_many.sort(key=lambda f: f.name or "")
135
135
 
136
136
  return instance
137
137
 
@@ -1262,7 +1262,7 @@ class QuerySet[T: "Model"]:
1262
1262
 
1263
1263
  return clone
1264
1264
 
1265
- def order_by(self, *field_names: str) -> Self:
1265
+ def order_by(self, *field_names: str | ResolvableExpression) -> Self:
1266
1266
  """Return a new QuerySet instance with the ordering changed."""
1267
1267
  if self.sql_query.is_sliced:
1268
1268
  raise TypeError("Cannot reorder a query once a slice has been taken.")
@@ -22,6 +22,7 @@ from plain.postgres.dialect import (
22
22
  )
23
23
  from plain.postgres.exceptions import EmptyResultSet, FieldError, FullResultSet
24
24
  from plain.postgres.expressions import (
25
+ BaseExpression,
25
26
  F,
26
27
  OrderBy,
27
28
  Ref,
@@ -49,7 +50,6 @@ from plain.utils.regex_helper import _lazy_re_compile
49
50
 
50
51
  if TYPE_CHECKING:
51
52
  from plain.postgres.connection import DatabaseConnection
52
- from plain.postgres.expressions import BaseExpression
53
53
  from plain.postgres.sql.query import AggregateQuery, InsertQuery
54
54
 
55
55
  # Type aliases for SQL compilation results
@@ -2035,7 +2035,7 @@ class Query(BaseExpression):
2035
2035
  )
2036
2036
  )
2037
2037
 
2038
- def add_ordering(self, *ordering: str | BaseExpression) -> None:
2038
+ def add_ordering(self, *ordering: str | ResolvableExpression) -> None:
2039
2039
  """
2040
2040
  Add items from the 'ordering' sequence to the query's "order by"
2041
2041
  clause. These items are either field names (not column names) --
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "plain.postgres"
3
- version = "0.113.0"
3
+ version = "0.113.2"
4
4
  description = "Model your data and store it in a database."
5
5
  authors = [{ name = "Dave Gaeddert", email = "dave.gaeddert@dropseed.dev" }]
6
6
  readme = "README.md"
@@ -0,0 +1,30 @@
1
+ from __future__ import annotations
2
+
3
+ from app.examples.models.iteration import IterationExample
4
+
5
+ from plain.postgres.expressions import F
6
+ from plain.postgres.functions import Lower
7
+
8
+
9
+ def test_order_by_f_expression(db):
10
+ """`order_by()` accepts expressions, not just field-name strings."""
11
+ IterationExample.query.create(name="beta", tag="b")
12
+ IterationExample.query.create(name="alpha", tag="a")
13
+
14
+ names = list(
15
+ IterationExample.query.order_by(F("name")).values_list("name", flat=True)
16
+ )
17
+
18
+ assert names == ["alpha", "beta"]
19
+
20
+
21
+ def test_order_by_function_expression(db):
22
+ """Database functions work as ordering expressions."""
23
+ IterationExample.query.create(name="Beta", tag="b")
24
+ IterationExample.query.create(name="alpha", tag="a")
25
+
26
+ names = list(
27
+ IterationExample.query.order_by(Lower("name")).values_list("name", flat=True)
28
+ )
29
+
30
+ assert names == ["alpha", "Beta"]