xdjango-postgres-extra 2.1.0__tar.gz → 2.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/PKG-INFO +11 -7
  2. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/README.md +3 -3
  3. xdjango_postgres_extra-2.1.1/psqlextra/_version.py +1 -0
  4. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/setup.py +7 -3
  5. xdjango_postgres_extra-2.1.1/tests/test_django_6_compatibility.py +33 -0
  6. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/xdjango_postgres_extra.egg-info/PKG-INFO +11 -7
  7. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/xdjango_postgres_extra.egg-info/SOURCES.txt +1 -6
  8. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/xdjango_postgres_extra.egg-info/requires.txt +3 -3
  9. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/xdjango_postgres_extra.egg-info/top_level.txt +0 -1
  10. xdjango_postgres_extra-2.1.0/psqlextra/_version.py +0 -1
  11. xdjango_postgres_extra-2.1.0/tests/benchmarks/__init__.py +0 -0
  12. xdjango_postgres_extra-2.1.0/tests/benchmarks/test_insert_nothing.py +0 -51
  13. xdjango_postgres_extra-2.1.0/tests/benchmarks/test_upsert.py +0 -51
  14. xdjango_postgres_extra-2.1.0/tests/benchmarks/test_upsert_bulk.py +0 -68
  15. xdjango_postgres_extra-2.1.0/tests/psqlextra_test_backend/__init__.py +0 -0
  16. xdjango_postgres_extra-2.1.0/tests/psqlextra_test_backend/base.py +0 -23
  17. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/LICENSE +0 -0
  18. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/__init__.py +0 -0
  19. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/apps.py +0 -0
  20. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/__init__.py +0 -0
  21. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/base.py +0 -0
  22. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/base_impl.py +0 -0
  23. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/introspection.py +0 -0
  24. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/__init__.py +0 -0
  25. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/__init__.py +0 -0
  26. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/add_default_partition.py +0 -0
  27. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/add_hash_partition.py +0 -0
  28. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/add_list_partition.py +0 -0
  29. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/add_range_partition.py +0 -0
  30. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/apply_state.py +0 -0
  31. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/create_materialized_view_model.py +0 -0
  32. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/create_partitioned_model.py +0 -0
  33. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/create_view_model.py +0 -0
  34. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/delete_default_partition.py +0 -0
  35. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/delete_hash_partition.py +0 -0
  36. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/delete_list_partition.py +0 -0
  37. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/delete_materialized_view_model.py +0 -0
  38. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/delete_partition.py +0 -0
  39. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/delete_partitioned_model.py +0 -0
  40. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/delete_range_partition.py +0 -0
  41. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/delete_view_model.py +0 -0
  42. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/operations/partition.py +0 -0
  43. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/patched_autodetector.py +0 -0
  44. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/patched_migrations.py +0 -0
  45. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/patched_project_state.py +0 -0
  46. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/state/__init__.py +0 -0
  47. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/state/materialized_view.py +0 -0
  48. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/state/model.py +0 -0
  49. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/state/partitioning.py +0 -0
  50. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/migrations/state/view.py +0 -0
  51. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/operations.py +0 -0
  52. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/schema.py +0 -0
  53. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/side_effects/__init__.py +0 -0
  54. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/side_effects/hstore_required.py +0 -0
  55. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/backend/side_effects/hstore_unique.py +0 -0
  56. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/compiler.py +0 -0
  57. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/contrib/__init__.py +0 -0
  58. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/contrib/expressions.py +0 -0
  59. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/contrib/model_data_migrator.py +0 -0
  60. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/contrib/static_row.py +0 -0
  61. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/contrib/transaction.py +0 -0
  62. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/error.py +0 -0
  63. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/expressions.py +0 -0
  64. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/fields/__init__.py +0 -0
  65. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/fields/hstore_field.py +0 -0
  66. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/indexes/__init__.py +0 -0
  67. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/indexes/case_insensitive_unique_index.py +0 -0
  68. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/indexes/conditional_unique_index.py +0 -0
  69. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/indexes/unique_index.py +0 -0
  70. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/introspect/__init__.py +0 -0
  71. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/introspect/fields.py +0 -0
  72. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/introspect/models.py +0 -0
  73. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/locking.py +0 -0
  74. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/lookups.py +0 -0
  75. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/management/__init__.py +0 -0
  76. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/management/commands/__init__.py +0 -0
  77. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/management/commands/pgmakemigrations.py +0 -0
  78. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/management/commands/pgpartition.py +0 -0
  79. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/management/commands/pgrefreshmv.py +0 -0
  80. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/manager/__init__.py +0 -0
  81. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/manager/manager.py +0 -0
  82. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/models/__init__.py +0 -0
  83. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/models/base.py +0 -0
  84. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/models/options.py +0 -0
  85. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/models/partitioned.py +0 -0
  86. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/models/view.py +0 -0
  87. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/__init__.py +0 -0
  88. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/config.py +0 -0
  89. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/constants.py +0 -0
  90. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/current_time_strategy.py +0 -0
  91. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/error.py +0 -0
  92. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/manager.py +0 -0
  93. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/partition.py +0 -0
  94. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/plan.py +0 -0
  95. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/range_partition.py +0 -0
  96. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/range_strategy.py +0 -0
  97. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/shorthands.py +0 -0
  98. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/strategy.py +0 -0
  99. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/time_partition.py +0 -0
  100. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/time_partition_size.py +0 -0
  101. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/partitioning/time_strategy.py +0 -0
  102. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/py.typed +0 -0
  103. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/query.py +0 -0
  104. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/schema.py +0 -0
  105. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/settings.py +0 -0
  106. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/sql.py +0 -0
  107. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/type_assertions.py +0 -0
  108. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/types.py +0 -0
  109. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/psqlextra/util.py +0 -0
  110. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/pyproject.toml +0 -0
  111. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/setup.cfg +0 -0
  112. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_append_caller_to_sql.py +0 -0
  113. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_case_insensitive_unique_index.py +0 -0
  114. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_conditional_unique_index.py +0 -0
  115. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_db_backend.py +0 -0
  116. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_hstore_autodetect.py +0 -0
  117. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_hstore_field.py +0 -0
  118. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_hstore_required.py +0 -0
  119. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_hstore_unique.py +0 -0
  120. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_insert.py +0 -0
  121. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_introspect.py +0 -0
  122. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_locking.py +0 -0
  123. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_lookups.py +0 -0
  124. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_make_migrations.py +0 -0
  125. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_management_command_partition.py +0 -0
  126. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_manager.py +0 -0
  127. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_manager_context.py +0 -0
  128. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_materialized_view_model.py +0 -0
  129. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_migration_operations.py +0 -0
  130. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_on_conflict.py +0 -0
  131. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_on_conflict_nothing.py +0 -0
  132. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_on_conflict_update.py +0 -0
  133. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_partitioned_model.py +0 -0
  134. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_partitioned_model_state.py +0 -0
  135. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_partitioning_manager.py +0 -0
  136. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_partitioning_time.py +0 -0
  137. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_query.py +0 -0
  138. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_query_values.py +0 -0
  139. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_schema.py +0 -0
  140. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_schema_editor_alter_schema.py +0 -0
  141. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_schema_editor_clone_model_to_schema.py +0 -0
  142. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_schema_editor_partitioning.py +0 -0
  143. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_schema_editor_storage_settings.py +0 -0
  144. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_schema_editor_vacuum.py +0 -0
  145. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_schema_editor_view.py +0 -0
  146. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_settings.py +0 -0
  147. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_unique_index.py +0 -0
  148. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_upsert.py +0 -0
  149. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/tests/test_view_models.py +0 -0
  150. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.1}/xdjango_postgres_extra.egg-info/dependency_links.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xdjango-postgres-extra
3
- Version: 2.1.0
3
+ Version: 2.1.1
4
4
  Summary: Bringing all of PostgreSQL's awesomeness to Django.
5
5
  Home-page: https://github.com/SectorLabs/django-postgres-extra
6
6
  Author: Sector Labs
@@ -9,6 +9,7 @@ License: MIT License
9
9
  Keywords: django,postgres,extra,hstore,upsert,partioning,materialized,view
10
10
  Classifier: Environment :: Web Environment
11
11
  Classifier: Framework :: Django
12
+ Classifier: Framework :: Django :: 6.0
12
13
  Classifier: Intended Audience :: Developers
13
14
  Classifier: License :: OSI Approved :: MIT License
14
15
  Classifier: Operating System :: OS Independent
@@ -19,12 +20,15 @@ Classifier: Programming Language :: Python :: 3.8
19
20
  Classifier: Programming Language :: Python :: 3.9
20
21
  Classifier: Programming Language :: Python :: 3.10
21
22
  Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
22
26
  Classifier: Topic :: Internet :: WWW/HTTP
23
27
  Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
24
28
  Requires-Python: >=3.6
25
29
  Description-Content-Type: text/markdown
26
30
  License-File: LICENSE
27
- Requires-Dist: Django<=6.0.4,>=2.0
31
+ Requires-Dist: Django<7.0,>=2.0
28
32
  Requires-Dist: python-dateutil<=3.0.0,>=2.8.0
29
33
  Requires-Dist: dataclasses; python_version <= "3.6"
30
34
  Provides-Extra: dev
@@ -75,8 +79,8 @@ Requires-Dist: sphinx-rtd-theme==3.0.2; extra == "docs"
75
79
  Requires-Dist: docutils==0.21.2; extra == "docs"
76
80
  Requires-Dist: Jinja2==3.1.6; extra == "docs"
77
81
  Provides-Extra: publish
78
- Requires-Dist: build==0.7.0; extra == "publish"
79
- Requires-Dist: twine==3.7.1; extra == "publish"
82
+ Requires-Dist: build<2.0.0,>=1.2.0; extra == "publish"
83
+ Requires-Dist: twine<7.0.0,>=6.0.0; extra == "publish"
80
84
  Dynamic: author
81
85
  Dynamic: author-email
82
86
  Dynamic: classifier
@@ -96,10 +100,10 @@ Dynamic: summary
96
100
  |--------------------|---------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
97
101
  | :white_check_mark: | **Tests** | [![CircleCI](https://circleci.com/gh/SectorLabs/django-postgres-extra/tree/master.svg?style=svg)](https://circleci.com/gh/SectorLabs/django-postgres-extra/tree/master) |
98
102
  | :memo: | **License** | [![License](https://img.shields.io/:license-mit-blue.svg)](http://doge.mit-license.org) |
99
- | :package: | **PyPi** | [![PyPi](https://badge.fury.io/py/django-postgres-extra.svg)](https://pypi.python.org/pypi/django-postgres-extra) |
103
+ | :package: | **PyPi** | [![PyPi](https://badge.fury.io/py/xdjango-postgres-extra.svg)](https://pypi.org/project/xdjango-postgres-extra/) |
100
104
  | :four_leaf_clover: | **Code coverage** | [![Coverage Status](https://coveralls.io/repos/github/SectorLabs/django-postgres-extra/badge.svg?branch=coveralls)](https://coveralls.io/github/SectorLabs/django-postgres-extra?branch=master) |
101
- | <img src="https://cdn.iconscout.com/icon/free/png-256/django-1-282754.png" width="22px" height="22px" align="center" /> | **Django Versions** | 2.0, 2.1, 2.2, 3.0, 3.1, 3.2, 4.0, 4.1, 4.2, 5.0, 5.1, 5.2, 6.0.4 |
102
- | <img src="https://cdn3.iconfinder.com/data/icons/logos-and-brands-adobe/512/267_Python-512.png" width="22px" height="22px" align="center" /> | **Python Versions** | 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13 |
105
+ | <img src="https://cdn.iconscout.com/icon/free/png-256/django-1-282754.png" width="22px" height="22px" align="center" /> | **Django Versions** | 2.0 through 6.x |
106
+ | <img src="https://cdn3.iconfinder.com/data/icons/logos-and-brands-adobe/512/267_Python-512.png" width="22px" height="22px" align="center" /> | **Python Versions** | 3.6 through 3.14 |
103
107
  | <img src="https://pbs.twimg.com/profile_images/1152122059/psycopg-100_400x400.png" width="22px" height="22px" align="center" /> | **Psycopg Versions** | 2, 3 |
104
108
  | :book: | **Documentation** | [Read The Docs](https://django-postgres-extra.readthedocs.io/en/master/) |
105
109
  | :warning: | **Upgrade** | [Upgrade from v1.x](https://django-postgres-extra.readthedocs.io/en/master/major_releases.html#new-features)
@@ -6,10 +6,10 @@
6
6
  |--------------------|---------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
7
7
  | :white_check_mark: | **Tests** | [![CircleCI](https://circleci.com/gh/SectorLabs/django-postgres-extra/tree/master.svg?style=svg)](https://circleci.com/gh/SectorLabs/django-postgres-extra/tree/master) |
8
8
  | :memo: | **License** | [![License](https://img.shields.io/:license-mit-blue.svg)](http://doge.mit-license.org) |
9
- | :package: | **PyPi** | [![PyPi](https://badge.fury.io/py/django-postgres-extra.svg)](https://pypi.python.org/pypi/django-postgres-extra) |
9
+ | :package: | **PyPi** | [![PyPi](https://badge.fury.io/py/xdjango-postgres-extra.svg)](https://pypi.org/project/xdjango-postgres-extra/) |
10
10
  | :four_leaf_clover: | **Code coverage** | [![Coverage Status](https://coveralls.io/repos/github/SectorLabs/django-postgres-extra/badge.svg?branch=coveralls)](https://coveralls.io/github/SectorLabs/django-postgres-extra?branch=master) |
11
- | <img src="https://cdn.iconscout.com/icon/free/png-256/django-1-282754.png" width="22px" height="22px" align="center" /> | **Django Versions** | 2.0, 2.1, 2.2, 3.0, 3.1, 3.2, 4.0, 4.1, 4.2, 5.0, 5.1, 5.2, 6.0.4 |
12
- | <img src="https://cdn3.iconfinder.com/data/icons/logos-and-brands-adobe/512/267_Python-512.png" width="22px" height="22px" align="center" /> | **Python Versions** | 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13 |
11
+ | <img src="https://cdn.iconscout.com/icon/free/png-256/django-1-282754.png" width="22px" height="22px" align="center" /> | **Django Versions** | 2.0 through 6.x |
12
+ | <img src="https://cdn3.iconfinder.com/data/icons/logos-and-brands-adobe/512/267_Python-512.png" width="22px" height="22px" align="center" /> | **Python Versions** | 3.6 through 3.14 |
13
13
  | <img src="https://pbs.twimg.com/profile_images/1152122059/psycopg-100_400x400.png" width="22px" height="22px" align="center" /> | **Psycopg Versions** | 2, 3 |
14
14
  | :book: | **Documentation** | [Read The Docs](https://django-postgres-extra.readthedocs.io/en/master/) |
15
15
  | :warning: | **Upgrade** | [Upgrade from v1.x](https://django-postgres-extra.readthedocs.io/en/master/major_releases.html#new-features)
@@ -0,0 +1 @@
1
+ __version__ = "2.1.1"
@@ -36,6 +36,7 @@ setup(
36
36
  classifiers=[
37
37
  "Environment :: Web Environment",
38
38
  "Framework :: Django",
39
+ "Framework :: Django :: 6.0",
39
40
  "Intended Audience :: Developers",
40
41
  "License :: OSI Approved :: MIT License",
41
42
  "Operating System :: OS Independent",
@@ -46,12 +47,15 @@ setup(
46
47
  "Programming Language :: Python :: 3.9",
47
48
  "Programming Language :: Python :: 3.10",
48
49
  "Programming Language :: Python :: 3.11",
50
+ "Programming Language :: Python :: 3.12",
51
+ "Programming Language :: Python :: 3.13",
52
+ "Programming Language :: Python :: 3.14",
49
53
  "Topic :: Internet :: WWW/HTTP",
50
54
  "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
51
55
  ],
52
56
  python_requires=">=3.6",
53
57
  install_requires=[
54
- "Django>=2.0,<=6.0.4",
58
+ "Django>=2.0,<7.0",
55
59
  "python-dateutil>=2.8.0,<=3.0.0",
56
60
  ],
57
61
  extras_require={
@@ -109,8 +113,8 @@ setup(
109
113
  "Jinja2==3.1.6",
110
114
  ],
111
115
  "publish": [
112
- "build==0.7.0",
113
- "twine==3.7.1",
116
+ "build>=1.2.0,<2.0.0",
117
+ "twine>=6.0.0,<7.0.0",
114
118
  ],
115
119
  },
116
120
  )
@@ -0,0 +1,33 @@
1
+ from psqlextra.expressions import HStoreValue
2
+ from psqlextra.lookups import InValuesLookupMixin
3
+
4
+
5
+ class CompilableValue:
6
+ def as_sql(self, compiler, connection):
7
+ return "UPPER(%s)", ("value",)
8
+
9
+
10
+ class InValuesLookup(InValuesLookupMixin):
11
+ def rhs_is_direct_value(self):
12
+ return True
13
+
14
+ def process_lhs(self, compiler, connection):
15
+ return '"field"', ("lhs",)
16
+
17
+ def process_rhs(self, compiler, connection):
18
+ return "%s, %s", ("one", "two")
19
+
20
+
21
+ def test_hstore_value_returns_tuple_params():
22
+ _, params = HStoreValue(
23
+ {"expression": CompilableValue(), "plain": "value", "null": None}
24
+ ).as_sql(None, None)
25
+
26
+ assert params == ("expression", "value", "plain", "value", "null")
27
+
28
+
29
+ def test_invalues_lookup_returns_tuple_params():
30
+ sql, params = InValuesLookup().as_sql(None, None)
31
+
32
+ assert sql == '"field" IN (VALUES (%s),(%s))'
33
+ assert params == ("lhs", "one", "two")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xdjango-postgres-extra
3
- Version: 2.1.0
3
+ Version: 2.1.1
4
4
  Summary: Bringing all of PostgreSQL's awesomeness to Django.
5
5
  Home-page: https://github.com/SectorLabs/django-postgres-extra
6
6
  Author: Sector Labs
@@ -9,6 +9,7 @@ License: MIT License
9
9
  Keywords: django,postgres,extra,hstore,upsert,partioning,materialized,view
10
10
  Classifier: Environment :: Web Environment
11
11
  Classifier: Framework :: Django
12
+ Classifier: Framework :: Django :: 6.0
12
13
  Classifier: Intended Audience :: Developers
13
14
  Classifier: License :: OSI Approved :: MIT License
14
15
  Classifier: Operating System :: OS Independent
@@ -19,12 +20,15 @@ Classifier: Programming Language :: Python :: 3.8
19
20
  Classifier: Programming Language :: Python :: 3.9
20
21
  Classifier: Programming Language :: Python :: 3.10
21
22
  Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
22
26
  Classifier: Topic :: Internet :: WWW/HTTP
23
27
  Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
24
28
  Requires-Python: >=3.6
25
29
  Description-Content-Type: text/markdown
26
30
  License-File: LICENSE
27
- Requires-Dist: Django<=6.0.4,>=2.0
31
+ Requires-Dist: Django<7.0,>=2.0
28
32
  Requires-Dist: python-dateutil<=3.0.0,>=2.8.0
29
33
  Requires-Dist: dataclasses; python_version <= "3.6"
30
34
  Provides-Extra: dev
@@ -75,8 +79,8 @@ Requires-Dist: sphinx-rtd-theme==3.0.2; extra == "docs"
75
79
  Requires-Dist: docutils==0.21.2; extra == "docs"
76
80
  Requires-Dist: Jinja2==3.1.6; extra == "docs"
77
81
  Provides-Extra: publish
78
- Requires-Dist: build==0.7.0; extra == "publish"
79
- Requires-Dist: twine==3.7.1; extra == "publish"
82
+ Requires-Dist: build<2.0.0,>=1.2.0; extra == "publish"
83
+ Requires-Dist: twine<7.0.0,>=6.0.0; extra == "publish"
80
84
  Dynamic: author
81
85
  Dynamic: author-email
82
86
  Dynamic: classifier
@@ -96,10 +100,10 @@ Dynamic: summary
96
100
  |--------------------|---------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
97
101
  | :white_check_mark: | **Tests** | [![CircleCI](https://circleci.com/gh/SectorLabs/django-postgres-extra/tree/master.svg?style=svg)](https://circleci.com/gh/SectorLabs/django-postgres-extra/tree/master) |
98
102
  | :memo: | **License** | [![License](https://img.shields.io/:license-mit-blue.svg)](http://doge.mit-license.org) |
99
- | :package: | **PyPi** | [![PyPi](https://badge.fury.io/py/django-postgres-extra.svg)](https://pypi.python.org/pypi/django-postgres-extra) |
103
+ | :package: | **PyPi** | [![PyPi](https://badge.fury.io/py/xdjango-postgres-extra.svg)](https://pypi.org/project/xdjango-postgres-extra/) |
100
104
  | :four_leaf_clover: | **Code coverage** | [![Coverage Status](https://coveralls.io/repos/github/SectorLabs/django-postgres-extra/badge.svg?branch=coveralls)](https://coveralls.io/github/SectorLabs/django-postgres-extra?branch=master) |
101
- | <img src="https://cdn.iconscout.com/icon/free/png-256/django-1-282754.png" width="22px" height="22px" align="center" /> | **Django Versions** | 2.0, 2.1, 2.2, 3.0, 3.1, 3.2, 4.0, 4.1, 4.2, 5.0, 5.1, 5.2, 6.0.4 |
102
- | <img src="https://cdn3.iconfinder.com/data/icons/logos-and-brands-adobe/512/267_Python-512.png" width="22px" height="22px" align="center" /> | **Python Versions** | 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13 |
105
+ | <img src="https://cdn.iconscout.com/icon/free/png-256/django-1-282754.png" width="22px" height="22px" align="center" /> | **Django Versions** | 2.0 through 6.x |
106
+ | <img src="https://cdn3.iconfinder.com/data/icons/logos-and-brands-adobe/512/267_Python-512.png" width="22px" height="22px" align="center" /> | **Python Versions** | 3.6 through 3.14 |
103
107
  | <img src="https://pbs.twimg.com/profile_images/1152122059/psycopg-100_400x400.png" width="22px" height="22px" align="center" /> | **Psycopg Versions** | 2, 3 |
104
108
  | :book: | **Documentation** | [Read The Docs](https://django-postgres-extra.readthedocs.io/en/master/) |
105
109
  | :warning: | **Upgrade** | [Upgrade from v1.x](https://django-postgres-extra.readthedocs.io/en/master/major_releases.html#new-features)
@@ -100,6 +100,7 @@ tests/test_append_caller_to_sql.py
100
100
  tests/test_case_insensitive_unique_index.py
101
101
  tests/test_conditional_unique_index.py
102
102
  tests/test_db_backend.py
103
+ tests/test_django_6_compatibility.py
103
104
  tests/test_hstore_autodetect.py
104
105
  tests/test_hstore_field.py
105
106
  tests/test_hstore_required.py
@@ -134,12 +135,6 @@ tests/test_settings.py
134
135
  tests/test_unique_index.py
135
136
  tests/test_upsert.py
136
137
  tests/test_view_models.py
137
- tests/benchmarks/__init__.py
138
- tests/benchmarks/test_insert_nothing.py
139
- tests/benchmarks/test_upsert.py
140
- tests/benchmarks/test_upsert_bulk.py
141
- tests/psqlextra_test_backend/__init__.py
142
- tests/psqlextra_test_backend/base.py
143
138
  xdjango_postgres_extra.egg-info/PKG-INFO
144
139
  xdjango_postgres_extra.egg-info/SOURCES.txt
145
140
  xdjango_postgres_extra.egg-info/dependency_links.txt
@@ -1,4 +1,4 @@
1
- Django<=6.0.4,>=2.0
1
+ Django<7.0,>=2.0
2
2
  python-dateutil<=3.0.0,>=2.8.0
3
3
 
4
4
  [:python_version <= "3.6"]
@@ -38,8 +38,8 @@ docutils==0.21.2
38
38
  Jinja2==3.1.6
39
39
 
40
40
  [publish]
41
- build==0.7.0
42
- twine==3.7.1
41
+ build<2.0.0,>=1.2.0
42
+ twine<7.0.0,>=6.0.0
43
43
 
44
44
  [test]
45
45
 
@@ -1 +0,0 @@
1
- __version__ = "2.1.0"
File without changes
@@ -1,51 +0,0 @@
1
- import uuid
2
-
3
- import pytest
4
-
5
- from django.db import models, transaction
6
- from django.db.utils import IntegrityError
7
-
8
- from psqlextra.query import ConflictAction
9
-
10
- from ..fake_model import get_fake_model
11
-
12
-
13
- @pytest.mark.benchmark()
14
- def test_insert_nothing_traditional(benchmark):
15
- model = get_fake_model(
16
- {"field": models.CharField(max_length=255, unique=True)}
17
- )
18
-
19
- random_value = str(uuid.uuid4())[:8]
20
- model.objects.create(field=random_value)
21
-
22
- def _traditional_insert(model, random_value):
23
- """Performs a concurrency safe insert the traditional way."""
24
-
25
- try:
26
- with transaction.atomic():
27
- return model.objects.create(field=random_value)
28
- except IntegrityError:
29
- return model.objects.filter(field=random_value).first()
30
-
31
- benchmark(_traditional_insert, model, random_value)
32
-
33
-
34
- @pytest.mark.benchmark()
35
- def test_insert_nothing_native(benchmark):
36
- model = get_fake_model(
37
- {"field": models.CharField(max_length=255, unique=True)}
38
- )
39
-
40
- random_value = str(uuid.uuid4())[:8]
41
- model.objects.create(field=random_value)
42
-
43
- def _native_insert(model, random_value):
44
- """Performs a concurrency safeinsert using the native PostgreSQL
45
- conflict resolution."""
46
-
47
- return model.objects.on_conflict(
48
- ["field"], ConflictAction.NOTHING
49
- ).insert_and_get(field=random_value)
50
-
51
- benchmark(_native_insert, model, random_value)
@@ -1,51 +0,0 @@
1
- import uuid
2
-
3
- import pytest
4
-
5
- from django.db import models, transaction
6
- from django.db.utils import IntegrityError
7
-
8
- from ..fake_model import get_fake_model
9
-
10
-
11
- @pytest.mark.benchmark()
12
- def test_upsert_traditional(benchmark):
13
- model = get_fake_model(
14
- {"field": models.CharField(max_length=255, unique=True)}
15
- )
16
-
17
- random_value = str(uuid.uuid4())[:8]
18
- model.objects.create(field=random_value)
19
-
20
- def _traditional_upsert(model, random_value):
21
- """Performs a concurrency safe upsert the traditional way."""
22
-
23
- try:
24
-
25
- with transaction.atomic():
26
- return model.objects.create(field=random_value)
27
- except IntegrityError:
28
- model.objects.update(field=random_value)
29
- return model.objects.get(field=random_value)
30
-
31
- benchmark(_traditional_upsert, model, random_value)
32
-
33
-
34
- @pytest.mark.benchmark()
35
- def test_upsert_native(benchmark):
36
- model = get_fake_model(
37
- {"field": models.CharField(max_length=255, unique=True)}
38
- )
39
-
40
- random_value = str(uuid.uuid4())[:8]
41
- model.objects.create(field=random_value)
42
-
43
- def _native_upsert(model, random_value):
44
- """Performs a concurrency safe upsert using the native PostgreSQL
45
- upsert."""
46
-
47
- return model.objects.upsert_and_get(
48
- conflict_target=["field"], fields=dict(field=random_value)
49
- )
50
-
51
- benchmark(_native_upsert, model, random_value)
@@ -1,68 +0,0 @@
1
- import uuid
2
-
3
- import pytest
4
-
5
- from django.db import models
6
-
7
- from psqlextra.query import ConflictAction
8
-
9
- from ..fake_model import get_fake_model
10
-
11
- ROW_COUNT = 10000
12
-
13
-
14
- @pytest.mark.benchmark()
15
- def test_upsert_bulk_naive(benchmark):
16
- model = get_fake_model(
17
- {"field": models.CharField(max_length=255, unique=True)}
18
- )
19
-
20
- rows = []
21
- random_values = []
22
- for i in range(0, ROW_COUNT):
23
- random_value = str(uuid.uuid4())
24
- random_values.append(random_value)
25
- rows.append(model(field=random_value))
26
-
27
- model.objects.bulk_create(rows)
28
-
29
- def _native_upsert(model, random_values):
30
- """Performs a concurrency safe upsert using the native PostgreSQL
31
- upsert."""
32
-
33
- rows = [dict(field=random_value) for random_value in random_values]
34
-
35
- for row in rows:
36
- model.objects.on_conflict(["field"], ConflictAction.UPDATE).insert(
37
- **row
38
- )
39
-
40
- benchmark(_native_upsert, model, random_values)
41
-
42
-
43
- @pytest.mark.benchmark()
44
- def test_upsert_bulk_native(benchmark):
45
- model = get_fake_model(
46
- {"field": models.CharField(max_length=255, unique=True)}
47
- )
48
-
49
- rows = []
50
- random_values = []
51
- for i in range(0, ROW_COUNT):
52
- random_value = str(uuid.uuid4())
53
- random_values.append(random_value)
54
- rows.append(model(field=random_value))
55
-
56
- model.objects.bulk_create(rows)
57
-
58
- def _native_upsert(model, random_values):
59
- """Performs a concurrency safe upsert using the native PostgreSQL
60
- upsert."""
61
-
62
- rows = [dict(field=random_value) for random_value in random_values]
63
-
64
- model.objects.on_conflict(["field"], ConflictAction.UPDATE).bulk_insert(
65
- rows
66
- )
67
-
68
- benchmark(_native_upsert, model, random_values)
@@ -1,23 +0,0 @@
1
- from datetime import timezone
2
-
3
- import django
4
-
5
- from django.conf import settings
6
-
7
- from psqlextra.backend.base import DatabaseWrapper as PSQLExtraDatabaseWrapper
8
-
9
-
10
- class DatabaseWrapper(PSQLExtraDatabaseWrapper):
11
- # Works around the compatibility issue of Django <3.0 and psycopg2.9
12
- # in combination with USE_TZ
13
- #
14
- # See: https://github.com/psycopg/psycopg2/issues/1293#issuecomment-862835147
15
- if django.VERSION < (3, 1):
16
-
17
- def create_cursor(self, name=None):
18
- cursor = super().create_cursor(name)
19
- cursor.tzinfo_factory = (
20
- lambda offset: timezone.utc if settings.USE_TZ else None
21
- )
22
-
23
- return cursor