SQLAlchemy-Continuum 1.5.2__tar.gz → 1.7.0__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 (141) hide show
  1. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/CHANGES.rst +28 -8
  2. {sqlalchemy_continuum-1.5.2/SQLAlchemy_Continuum.egg-info → sqlalchemy_continuum-1.7.0}/PKG-INFO +18 -31
  3. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/README.rst +10 -9
  4. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0/SQLAlchemy_Continuum.egg-info}/PKG-INFO +18 -31
  5. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/SQLAlchemy_Continuum.egg-info/SOURCES.txt +17 -17
  6. sqlalchemy_continuum-1.7.0/SQLAlchemy_Continuum.egg-info/requires.txt +10 -0
  7. sqlalchemy_continuum-1.5.2/docs/alembic.rst → sqlalchemy_continuum-1.7.0/docs/alembic.md +2 -4
  8. sqlalchemy_continuum-1.7.0/docs/api.md +27 -0
  9. sqlalchemy_continuum-1.7.0/docs/changelog.md +583 -0
  10. sqlalchemy_continuum-1.5.2/docs/configuration.rst → sqlalchemy_continuum-1.7.0/docs/configuration.md +73 -103
  11. sqlalchemy_continuum-1.7.0/docs/index.md +27 -0
  12. sqlalchemy_continuum-1.7.0/docs/intro.md +92 -0
  13. sqlalchemy_continuum-1.7.0/docs/license.md +30 -0
  14. sqlalchemy_continuum-1.5.2/docs/native_versioning.rst → sqlalchemy_continuum-1.7.0/docs/native_versioning.md +14 -19
  15. sqlalchemy_continuum-1.7.0/docs/plugins.md +61 -0
  16. sqlalchemy_continuum-1.7.0/docs/queries.md +238 -0
  17. sqlalchemy_continuum-1.7.0/docs/revert.md +91 -0
  18. sqlalchemy_continuum-1.5.2/docs/schema.rst → sqlalchemy_continuum-1.7.0/docs/schema.md +10 -20
  19. sqlalchemy_continuum-1.5.2/docs/transactions.rst → sqlalchemy_continuum-1.7.0/docs/transactions.md +29 -45
  20. sqlalchemy_continuum-1.7.0/docs/utilities.md +49 -0
  21. sqlalchemy_continuum-1.7.0/docs/version_objects.md +203 -0
  22. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/pyproject.toml +50 -31
  23. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/__init__.py +1 -1
  24. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/_compat.py +8 -15
  25. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/dialects/postgresql.py +5 -9
  26. sqlalchemy_continuum-1.7.0/sqlalchemy_continuum/fetcher.py +353 -0
  27. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/manager.py +3 -2
  28. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/model_builder.py +3 -5
  29. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/operation.py +4 -8
  30. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/plugins/activity.py +95 -125
  31. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/plugins/base.py +2 -4
  32. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/plugins/flask.py +15 -15
  33. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/plugins/transaction_changes.py +5 -20
  34. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/plugins/transaction_meta.py +27 -27
  35. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/relationship_builder.py +8 -10
  36. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/table_builder.py +60 -1
  37. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/transaction.py +8 -34
  38. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/unit_of_work.py +6 -6
  39. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/utils.py +48 -61
  40. sqlalchemy_continuum-1.7.0/sqlalchemy_continuum/version.py +178 -0
  41. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/__init__.py +1 -1
  42. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_compatibility.py +3 -1
  43. sqlalchemy_continuum-1.7.0/tests/test_efficient_queries.py +207 -0
  44. sqlalchemy_continuum-1.7.0/tests/test_user_guide_examples.py +236 -0
  45. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_validity_strategy.py +0 -1
  46. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/utils/test_changeset.py +1 -1
  47. sqlalchemy_continuum-1.5.2/SQLAlchemy_Continuum.egg-info/requires.txt +0 -28
  48. sqlalchemy_continuum-1.5.2/docs/Makefile +0 -177
  49. sqlalchemy_continuum-1.5.2/docs/api.rst +0 -50
  50. sqlalchemy_continuum-1.5.2/docs/conf.py +0 -275
  51. sqlalchemy_continuum-1.5.2/docs/index.rst +0 -22
  52. sqlalchemy_continuum-1.5.2/docs/intro.rst +0 -115
  53. sqlalchemy_continuum-1.5.2/docs/license.rst +0 -4
  54. sqlalchemy_continuum-1.5.2/docs/make.bat +0 -242
  55. sqlalchemy_continuum-1.5.2/docs/plugins.rst +0 -52
  56. sqlalchemy_continuum-1.5.2/docs/queries.rst +0 -73
  57. sqlalchemy_continuum-1.5.2/docs/revert.rst +0 -112
  58. sqlalchemy_continuum-1.5.2/docs/utilities.rst +0 -77
  59. sqlalchemy_continuum-1.5.2/docs/version_objects.rst +0 -232
  60. sqlalchemy_continuum-1.5.2/sqlalchemy_continuum/fetcher.py +0 -176
  61. sqlalchemy_continuum-1.5.2/sqlalchemy_continuum/version.py +0 -73
  62. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/LICENSE +0 -0
  63. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/MANIFEST.in +0 -0
  64. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/SQLAlchemy_Continuum.egg-info/dependency_links.txt +0 -0
  65. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/SQLAlchemy_Continuum.egg-info/top_level.txt +0 -0
  66. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/setup.cfg +0 -0
  67. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/builder.py +1 -1
  68. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/dialects/__init__.py +0 -0
  69. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/exc.py +0 -0
  70. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/expression_reflector.py +0 -0
  71. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/factory.py +0 -0
  72. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/plugins/__init__.py +0 -0
  73. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/plugins/null_delete.py +0 -0
  74. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/plugins/property_mod_tracker.py +1 -1
  75. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/reverter.py +0 -0
  76. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/sqlalchemy_continuum/schema.py +0 -0
  77. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/builders/__init__.py +0 -0
  78. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/builders/test_model_builder.py +0 -0
  79. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/builders/test_relationship_builder.py +0 -0
  80. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/builders/test_table_builder.py +0 -0
  81. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/dialects/__init__.py +0 -0
  82. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/dialects/test_triggers.py +0 -0
  83. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/inheritance/__init__.py +0 -0
  84. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/inheritance/test_common_base_class.py +0 -0
  85. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/inheritance/test_concrete_inheritance.py +0 -0
  86. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/inheritance/test_join_table_inheritance.py +0 -0
  87. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/inheritance/test_multi_level_inheritance.py +0 -0
  88. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/inheritance/test_single_table_inheritance.py +0 -0
  89. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/plugins/__init__.py +0 -0
  90. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/plugins/test_activity.py +0 -0
  91. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/plugins/test_flask.py +0 -0
  92. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/plugins/test_null_delete.py +0 -0
  93. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/plugins/test_plugin_collection.py +0 -0
  94. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/plugins/test_property_mod_tracker.py +0 -0
  95. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/plugins/test_transaction_changes.py +0 -0
  96. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/plugins/test_transaction_meta.py +0 -0
  97. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/relationships/__init__.py +0 -0
  98. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/relationships/test_association_table_relations.py +0 -0
  99. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/relationships/test_custom_condition_relations.py +0 -0
  100. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/relationships/test_dynamic_relationships.py +0 -0
  101. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/relationships/test_many_to_many_relations.py +0 -0
  102. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/relationships/test_non_versioned_classes.py +0 -0
  103. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/relationships/test_one_to_many_relations.py +0 -0
  104. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/relationships/test_one_to_one_relations.py +0 -0
  105. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/revert/__init__.py +0 -0
  106. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/revert/test_deep_relationships.py +0 -0
  107. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/revert/test_many_to_many_relationships.py +0 -0
  108. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/revert/test_one_to_one_relationship.py +0 -0
  109. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/revert/test_one_to_one_with_secondary_table.py +0 -0
  110. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/schema/__init__.py +0 -0
  111. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/schema/test_update_end_transaction_id.py +0 -0
  112. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/schema/test_update_property_mod_flags.py +0 -0
  113. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_accessors.py +0 -0
  114. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_changeset.py +0 -0
  115. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_column_aliases.py +0 -0
  116. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_column_inclusion_and_exclusion.py +0 -0
  117. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_composite_primary_key.py +0 -0
  118. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_configuration.py +0 -0
  119. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_custom_schema.py +0 -0
  120. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_custom_version_base_class.py +0 -0
  121. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_delete.py +0 -0
  122. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_exotic_listener_chaining.py +0 -0
  123. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_exotic_operation_combos.py +0 -0
  124. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_insert.py +0 -0
  125. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_mapper_args.py +0 -0
  126. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_raw_sql.py +0 -0
  127. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_revert.py +0 -0
  128. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_savepoints.py +0 -0
  129. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_sessions.py +0 -0
  130. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_transaction.py +0 -0
  131. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_update.py +0 -0
  132. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_vacuum.py +0 -0
  133. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_validity_strategy_multithreaded.py +0 -0
  134. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/test_versions.py +0 -0
  135. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/utils/__init__.py +0 -0
  136. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/utils/test_count_versions.py +0 -0
  137. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/utils/test_is_modified.py +0 -0
  138. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/utils/test_parent_class.py +0 -0
  139. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/utils/test_transaction_class.py +0 -0
  140. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/utils/test_tx_column_name.py +0 -0
  141. {sqlalchemy_continuum-1.5.2 → sqlalchemy_continuum-1.7.0}/tests/utils/test_version_class.py +0 -0
@@ -5,7 +5,27 @@ Here you can see the full list of changes between each SQLAlchemy-Continuum rele
5
5
 
6
6
  Unreleased changes
7
7
  ^^^^^^^^^^^^^^^^^^
8
- - None currently
8
+ - TODO
9
+
10
+ 1.7.0 (2026-07-02)
11
+ ^^^^^^^^^^^^^^^^^^
12
+ - Drop Python 3.9 support (EOL October 2025); the minimum supported Python is now 3.10
13
+ - Modernize codebase to Python 3.10+ syntax (PEP 604 unions, built-in generics, plain dicts instead of ``OrderedDict``)
14
+ - Migrate documentation from Sphinx/reStructuredText to `Zensical <https://zensical.org>`_ (Markdown + mkdocstrings)
15
+ - Fix broken user guide examples (``session.commit(article)``, ``sync_trigger(conn, ...)``, ``Transaction.query``, ``create_session`` removed in SQLAlchemy 2.0) and add ``tests/test_user_guide_examples.py`` to keep documented examples working
16
+ - Remove a leftover ``breakpoint()`` call in ``TransactionChangesPlugin``
17
+ - Fix latent ``AttributeError`` in ``VersioningManager.append_association_operation``
18
+ - Expand ruff lint rules (E/W/F/I/B/C4/UP) and drop the separate pyupgrade pre-commit hook
19
+ - Move test/dev/docs dependencies to PEP 735 ``[dependency-groups]``; package extras are now user-facing only (``flask``, ``flask-login``, ``flask-sqlalchemy``)
20
+ - Publish to PyPI via GitHub Actions trusted publishing on GitHub releases
21
+ - Add Dependabot (GitHub Actions, uv lockfile, pre-commit hooks), issue/PR templates, CONTRIBUTING.md and SECURITY.md
22
+
23
+ 1.6.0 (2026-01-22)
24
+ ^^^^^^^^^^^^^^^^^^
25
+ - Add ``version_at()`` class method on version objects for efficient retrieval of the version active at a specific transaction (#376)
26
+ - Add ``all_versions()`` class method with ``link`` option to batch fetch all versions for an entity in a single query, avoiding N+1 queries by pre-populating previous/next navigation caches (#376)
27
+ - Add automatic composite indexes on version tables for optimized version lookups: ``(pk_columns, transaction_id DESC)`` index and ``(pk_columns, transaction_id, end_transaction_id)`` for validity strategy temporal queries (#376)
28
+ - Add ``create_composite_index`` configuration option to control composite index creation (#376)
9
29
 
10
30
  1.5.2 (2025-10-10)
11
31
  ^^^^^^^^^^^^^^^^^^
@@ -14,6 +34,13 @@ Unreleased changes
14
34
  1.5.1 (2025-10-01)
15
35
  ^^^^^^^^^^^^^^^^^^
16
36
  - Fix utc_now() to return a naive datetime (#373, thanks to dawhalen)
37
+ - Remove SQLAlchemy-Utils dependency by porting required functions to internal _compat module (#352)
38
+ Note: if you use SQLAlchemy-Utils directly, you may need to add it as a dependency.
39
+ - Port core functions: ImproperlyConfigured, get_declarative_base, naturally_equivalent
40
+ - Port column utilities: get_columns, get_primary_keys, identity, get_column_key
41
+ - Port advanced functionality: has_changes, JSONType, generic_relationship with full SQLAlchemy 2.x compatibility
42
+ - Maintain full backward compatibility while eliminating external dependency
43
+ - Reduce installation footprint and potential version conflicts
17
44
 
18
45
  1.5.0 (2025-08-30)
19
46
  ^^^^^^^^^^^^^^^^^^
@@ -32,13 +59,6 @@ Unreleased changes
32
59
  - Fix datetime.utcnow() deprecation warnings with cross-version compatibility function supporting Python 3.9-3.13+
33
60
  - Eliminate cartesian product warnings in many-to-many relationship queries with non-versioned classes
34
61
  - Improve code quality by modernizing mixed string formatting patterns to f-strings
35
- - **MAJOR**: Remove SQLAlchemy-Utils dependency by porting required functions to internal _compat module (#352)
36
-
37
- - Port core functions: ImproperlyConfigured, get_declarative_base, naturally_equivalent
38
- - Port column utilities: get_columns, get_primary_keys, identity, get_column_key
39
- - Port advanced functionality: has_changes, JSONType, generic_relationship with full SQLAlchemy 2.x compatibility
40
- - Maintain full backward compatibility while eliminating external dependency
41
- - Reduce installation footprint and potential version conflicts
42
62
 
43
63
  1.4.2 (2024-03-26)
44
64
  ^^^^^^^^^^^^^^^^^^
@@ -1,17 +1,18 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SQLAlchemy-Continuum
3
- Version: 1.5.2
3
+ Version: 1.7.0
4
4
  Summary: Versioning and auditing extension for SQLAlchemy.
5
5
  Author: Mark Steward, Jose Soto
6
6
  Author-email: Konsta Vesterinen <konsta@fastmonkeys.com>
7
7
  License-Expression: BSD-3-Clause
8
- Project-URL: Homepage, https://github.com/kvesteri/sqlalchemy-continuum
8
+ Project-URL: Homepage, https://github.com/sqlalchemy-continuum/sqlalchemy-continuum
9
+ Project-URL: Documentation, https://sqlalchemy-continuum.github.io/
10
+ Project-URL: Changelog, https://github.com/sqlalchemy-continuum/sqlalchemy-continuum/blob/main/CHANGES.rst
9
11
  Classifier: Environment :: Web Environment
10
12
  Classifier: Intended Audience :: Developers
11
13
  Classifier: Operating System :: OS Independent
12
14
  Classifier: Programming Language :: Python
13
15
  Classifier: Programming Language :: Python :: 3
14
- Classifier: Programming Language :: Python :: 3.9
15
16
  Classifier: Programming Language :: Python :: 3.10
16
17
  Classifier: Programming Language :: Python :: 3.11
17
18
  Classifier: Programming Language :: Python :: 3.12
@@ -19,31 +20,16 @@ Classifier: Programming Language :: Python :: 3.13
19
20
  Classifier: Programming Language :: Python :: 3.14
20
21
  Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
21
22
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
- Requires-Python: >=3.9
23
+ Requires-Python: >=3.10
23
24
  Description-Content-Type: text/x-rst
24
25
  License-File: LICENSE
25
26
  Requires-Dist: SQLAlchemy<2.1,>=1.4.53
26
- Provides-Extra: test
27
- Requires-Dist: pytest>=2.3.5; extra == "test"
28
- Requires-Dist: psycopg2>=2.4.6; extra == "test"
29
- Requires-Dist: PyMySQL>=0.8.0; extra == "test"
30
- Requires-Dist: Flask>=0.9; extra == "test"
31
- Requires-Dist: Flask-Login>=0.2.9; extra == "test"
32
- Requires-Dist: Flask-SQLAlchemy>=1.0; extra == "test"
33
- Requires-Dist: packaging; extra == "test"
34
27
  Provides-Extra: flask
35
- Requires-Dist: Flask>=0.9; extra == "flask"
28
+ Requires-Dist: Flask>=2.0; extra == "flask"
36
29
  Provides-Extra: flask-login
37
- Requires-Dist: Flask-Login>=0.2.9; extra == "flask-login"
30
+ Requires-Dist: Flask-Login>=0.6; extra == "flask-login"
38
31
  Provides-Extra: flask-sqlalchemy
39
- Requires-Dist: Flask-SQLAlchemy>=1.0; extra == "flask-sqlalchemy"
40
- Provides-Extra: dev
41
- Requires-Dist: ruff>=0.1.0; extra == "dev"
42
- Requires-Dist: tox>=4.0.0; extra == "dev"
43
- Requires-Dist: pre-commit>=3.0.0; extra == "dev"
44
- Provides-Extra: docs
45
- Requires-Dist: sphinx>=4.0.0; extra == "docs"
46
- Requires-Dist: furo>=2021.11.0; extra == "docs"
32
+ Requires-Dist: Flask-SQLAlchemy>=3.0; extra == "flask-sqlalchemy"
47
33
  Dynamic: license-file
48
34
 
49
35
  SQLAlchemy-Continuum
@@ -86,6 +72,7 @@ In order to make your models versioned you need two things:
86
72
  .. code-block:: python
87
73
 
88
74
 
75
+ import sqlalchemy as sa
89
76
  from sqlalchemy_continuum import make_versioned
90
77
 
91
78
 
@@ -128,7 +115,7 @@ For completeness, below is a working example.
128
115
 
129
116
  from sqlalchemy_continuum import make_versioned
130
117
  from sqlalchemy import Column, Integer, Unicode, UnicodeText, create_engine
131
- from sqlalchemy.orm import create_session, configure_mappers, declarative_base
118
+ from sqlalchemy.orm import Session, configure_mappers, declarative_base
132
119
 
133
120
  make_versioned(user_cls=None)
134
121
 
@@ -143,13 +130,13 @@ For completeness, below is a working example.
143
130
  configure_mappers()
144
131
  engine = create_engine('sqlite://')
145
132
  Base.metadata.create_all(engine)
146
- session = create_session(bind=engine, autocommit=False)
133
+ session = Session(engine)
147
134
 
148
- article = Article(name=u'Some article', content=u'Some content')
135
+ article = Article(name='Some article', content='Some content')
149
136
  session.add(article)
150
137
  session.commit()
151
138
  article.versions[0].name
152
- article.name = u'Updated name'
139
+ article.name = 'Updated name'
153
140
  session.commit()
154
141
  article.versions[1].name
155
142
  article.versions[0].revert()
@@ -158,16 +145,16 @@ For completeness, below is a working example.
158
145
  Resources
159
146
  ---------
160
147
 
161
- - `Documentation <https://sqlalchemy-continuum.readthedocs.io/>`_
162
- - `Issue Tracker <http://github.com/kvesteri/sqlalchemy-continuum/issues>`_
163
- - `Code <http://github.com/kvesteri/sqlalchemy-continuum/>`_
148
+ - `Documentation <https://sqlalchemy-continuum.github.io/>`_
149
+ - `Issue Tracker <https://github.com/sqlalchemy-continuum/sqlalchemy-continuum/issues>`_
150
+ - `Code <https://github.com/sqlalchemy-continuum/sqlalchemy-continuum>`_
164
151
 
165
152
 
166
153
  .. image:: http://i.imgur.com/UFaRx.gif
167
154
 
168
155
 
169
- .. |Build Status| image:: https://github.com/kvesteri/sqlalchemy-continuum/workflows/Test/badge.svg
170
- :target: https://github.com/kvesteri/sqlalchemy-continuum/actions?query=workflow%3ATest
156
+ .. |Build Status| image:: https://github.com/sqlalchemy-continuum/sqlalchemy-continuum/workflows/Test/badge.svg
157
+ :target: https://github.com/sqlalchemy-continuum/sqlalchemy-continuum/actions?query=workflow%3ATest
171
158
  .. |Version Status| image:: https://img.shields.io/pypi/v/SQLAlchemy-Continuum.png
172
159
  :target: https://pypi.python.org/pypi/SQLAlchemy-Continuum/
173
160
  .. |Downloads| image:: https://img.shields.io/pypi/dm/SQLAlchemy-Continuum.png
@@ -38,6 +38,7 @@ In order to make your models versioned you need two things:
38
38
  .. code-block:: python
39
39
 
40
40
 
41
+ import sqlalchemy as sa
41
42
  from sqlalchemy_continuum import make_versioned
42
43
 
43
44
 
@@ -80,7 +81,7 @@ For completeness, below is a working example.
80
81
 
81
82
  from sqlalchemy_continuum import make_versioned
82
83
  from sqlalchemy import Column, Integer, Unicode, UnicodeText, create_engine
83
- from sqlalchemy.orm import create_session, configure_mappers, declarative_base
84
+ from sqlalchemy.orm import Session, configure_mappers, declarative_base
84
85
 
85
86
  make_versioned(user_cls=None)
86
87
 
@@ -95,13 +96,13 @@ For completeness, below is a working example.
95
96
  configure_mappers()
96
97
  engine = create_engine('sqlite://')
97
98
  Base.metadata.create_all(engine)
98
- session = create_session(bind=engine, autocommit=False)
99
+ session = Session(engine)
99
100
 
100
- article = Article(name=u'Some article', content=u'Some content')
101
+ article = Article(name='Some article', content='Some content')
101
102
  session.add(article)
102
103
  session.commit()
103
104
  article.versions[0].name
104
- article.name = u'Updated name'
105
+ article.name = 'Updated name'
105
106
  session.commit()
106
107
  article.versions[1].name
107
108
  article.versions[0].revert()
@@ -110,16 +111,16 @@ For completeness, below is a working example.
110
111
  Resources
111
112
  ---------
112
113
 
113
- - `Documentation <https://sqlalchemy-continuum.readthedocs.io/>`_
114
- - `Issue Tracker <http://github.com/kvesteri/sqlalchemy-continuum/issues>`_
115
- - `Code <http://github.com/kvesteri/sqlalchemy-continuum/>`_
114
+ - `Documentation <https://sqlalchemy-continuum.github.io/>`_
115
+ - `Issue Tracker <https://github.com/sqlalchemy-continuum/sqlalchemy-continuum/issues>`_
116
+ - `Code <https://github.com/sqlalchemy-continuum/sqlalchemy-continuum>`_
116
117
 
117
118
 
118
119
  .. image:: http://i.imgur.com/UFaRx.gif
119
120
 
120
121
 
121
- .. |Build Status| image:: https://github.com/kvesteri/sqlalchemy-continuum/workflows/Test/badge.svg
122
- :target: https://github.com/kvesteri/sqlalchemy-continuum/actions?query=workflow%3ATest
122
+ .. |Build Status| image:: https://github.com/sqlalchemy-continuum/sqlalchemy-continuum/workflows/Test/badge.svg
123
+ :target: https://github.com/sqlalchemy-continuum/sqlalchemy-continuum/actions?query=workflow%3ATest
123
124
  .. |Version Status| image:: https://img.shields.io/pypi/v/SQLAlchemy-Continuum.png
124
125
  :target: https://pypi.python.org/pypi/SQLAlchemy-Continuum/
125
126
  .. |Downloads| image:: https://img.shields.io/pypi/dm/SQLAlchemy-Continuum.png
@@ -1,17 +1,18 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SQLAlchemy-Continuum
3
- Version: 1.5.2
3
+ Version: 1.7.0
4
4
  Summary: Versioning and auditing extension for SQLAlchemy.
5
5
  Author: Mark Steward, Jose Soto
6
6
  Author-email: Konsta Vesterinen <konsta@fastmonkeys.com>
7
7
  License-Expression: BSD-3-Clause
8
- Project-URL: Homepage, https://github.com/kvesteri/sqlalchemy-continuum
8
+ Project-URL: Homepage, https://github.com/sqlalchemy-continuum/sqlalchemy-continuum
9
+ Project-URL: Documentation, https://sqlalchemy-continuum.github.io/
10
+ Project-URL: Changelog, https://github.com/sqlalchemy-continuum/sqlalchemy-continuum/blob/main/CHANGES.rst
9
11
  Classifier: Environment :: Web Environment
10
12
  Classifier: Intended Audience :: Developers
11
13
  Classifier: Operating System :: OS Independent
12
14
  Classifier: Programming Language :: Python
13
15
  Classifier: Programming Language :: Python :: 3
14
- Classifier: Programming Language :: Python :: 3.9
15
16
  Classifier: Programming Language :: Python :: 3.10
16
17
  Classifier: Programming Language :: Python :: 3.11
17
18
  Classifier: Programming Language :: Python :: 3.12
@@ -19,31 +20,16 @@ Classifier: Programming Language :: Python :: 3.13
19
20
  Classifier: Programming Language :: Python :: 3.14
20
21
  Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
21
22
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
- Requires-Python: >=3.9
23
+ Requires-Python: >=3.10
23
24
  Description-Content-Type: text/x-rst
24
25
  License-File: LICENSE
25
26
  Requires-Dist: SQLAlchemy<2.1,>=1.4.53
26
- Provides-Extra: test
27
- Requires-Dist: pytest>=2.3.5; extra == "test"
28
- Requires-Dist: psycopg2>=2.4.6; extra == "test"
29
- Requires-Dist: PyMySQL>=0.8.0; extra == "test"
30
- Requires-Dist: Flask>=0.9; extra == "test"
31
- Requires-Dist: Flask-Login>=0.2.9; extra == "test"
32
- Requires-Dist: Flask-SQLAlchemy>=1.0; extra == "test"
33
- Requires-Dist: packaging; extra == "test"
34
27
  Provides-Extra: flask
35
- Requires-Dist: Flask>=0.9; extra == "flask"
28
+ Requires-Dist: Flask>=2.0; extra == "flask"
36
29
  Provides-Extra: flask-login
37
- Requires-Dist: Flask-Login>=0.2.9; extra == "flask-login"
30
+ Requires-Dist: Flask-Login>=0.6; extra == "flask-login"
38
31
  Provides-Extra: flask-sqlalchemy
39
- Requires-Dist: Flask-SQLAlchemy>=1.0; extra == "flask-sqlalchemy"
40
- Provides-Extra: dev
41
- Requires-Dist: ruff>=0.1.0; extra == "dev"
42
- Requires-Dist: tox>=4.0.0; extra == "dev"
43
- Requires-Dist: pre-commit>=3.0.0; extra == "dev"
44
- Provides-Extra: docs
45
- Requires-Dist: sphinx>=4.0.0; extra == "docs"
46
- Requires-Dist: furo>=2021.11.0; extra == "docs"
32
+ Requires-Dist: Flask-SQLAlchemy>=3.0; extra == "flask-sqlalchemy"
47
33
  Dynamic: license-file
48
34
 
49
35
  SQLAlchemy-Continuum
@@ -86,6 +72,7 @@ In order to make your models versioned you need two things:
86
72
  .. code-block:: python
87
73
 
88
74
 
75
+ import sqlalchemy as sa
89
76
  from sqlalchemy_continuum import make_versioned
90
77
 
91
78
 
@@ -128,7 +115,7 @@ For completeness, below is a working example.
128
115
 
129
116
  from sqlalchemy_continuum import make_versioned
130
117
  from sqlalchemy import Column, Integer, Unicode, UnicodeText, create_engine
131
- from sqlalchemy.orm import create_session, configure_mappers, declarative_base
118
+ from sqlalchemy.orm import Session, configure_mappers, declarative_base
132
119
 
133
120
  make_versioned(user_cls=None)
134
121
 
@@ -143,13 +130,13 @@ For completeness, below is a working example.
143
130
  configure_mappers()
144
131
  engine = create_engine('sqlite://')
145
132
  Base.metadata.create_all(engine)
146
- session = create_session(bind=engine, autocommit=False)
133
+ session = Session(engine)
147
134
 
148
- article = Article(name=u'Some article', content=u'Some content')
135
+ article = Article(name='Some article', content='Some content')
149
136
  session.add(article)
150
137
  session.commit()
151
138
  article.versions[0].name
152
- article.name = u'Updated name'
139
+ article.name = 'Updated name'
153
140
  session.commit()
154
141
  article.versions[1].name
155
142
  article.versions[0].revert()
@@ -158,16 +145,16 @@ For completeness, below is a working example.
158
145
  Resources
159
146
  ---------
160
147
 
161
- - `Documentation <https://sqlalchemy-continuum.readthedocs.io/>`_
162
- - `Issue Tracker <http://github.com/kvesteri/sqlalchemy-continuum/issues>`_
163
- - `Code <http://github.com/kvesteri/sqlalchemy-continuum/>`_
148
+ - `Documentation <https://sqlalchemy-continuum.github.io/>`_
149
+ - `Issue Tracker <https://github.com/sqlalchemy-continuum/sqlalchemy-continuum/issues>`_
150
+ - `Code <https://github.com/sqlalchemy-continuum/sqlalchemy-continuum>`_
164
151
 
165
152
 
166
153
  .. image:: http://i.imgur.com/UFaRx.gif
167
154
 
168
155
 
169
- .. |Build Status| image:: https://github.com/kvesteri/sqlalchemy-continuum/workflows/Test/badge.svg
170
- :target: https://github.com/kvesteri/sqlalchemy-continuum/actions?query=workflow%3ATest
156
+ .. |Build Status| image:: https://github.com/sqlalchemy-continuum/sqlalchemy-continuum/workflows/Test/badge.svg
157
+ :target: https://github.com/sqlalchemy-continuum/sqlalchemy-continuum/actions?query=workflow%3ATest
171
158
  .. |Version Status| image:: https://img.shields.io/pypi/v/SQLAlchemy-Continuum.png
172
159
  :target: https://pypi.python.org/pypi/SQLAlchemy-Continuum/
173
160
  .. |Downloads| image:: https://img.shields.io/pypi/dm/SQLAlchemy-Continuum.png
@@ -8,23 +8,21 @@ SQLAlchemy_Continuum.egg-info/SOURCES.txt
8
8
  SQLAlchemy_Continuum.egg-info/dependency_links.txt
9
9
  SQLAlchemy_Continuum.egg-info/requires.txt
10
10
  SQLAlchemy_Continuum.egg-info/top_level.txt
11
- docs/Makefile
12
- docs/alembic.rst
13
- docs/api.rst
14
- docs/conf.py
15
- docs/configuration.rst
16
- docs/index.rst
17
- docs/intro.rst
18
- docs/license.rst
19
- docs/make.bat
20
- docs/native_versioning.rst
21
- docs/plugins.rst
22
- docs/queries.rst
23
- docs/revert.rst
24
- docs/schema.rst
25
- docs/transactions.rst
26
- docs/utilities.rst
27
- docs/version_objects.rst
11
+ docs/alembic.md
12
+ docs/api.md
13
+ docs/changelog.md
14
+ docs/configuration.md
15
+ docs/index.md
16
+ docs/intro.md
17
+ docs/license.md
18
+ docs/native_versioning.md
19
+ docs/plugins.md
20
+ docs/queries.md
21
+ docs/revert.md
22
+ docs/schema.md
23
+ docs/transactions.md
24
+ docs/utilities.md
25
+ docs/version_objects.md
28
26
  sqlalchemy_continuum/__init__.py
29
27
  sqlalchemy_continuum/_compat.py
30
28
  sqlalchemy_continuum/builder.py
@@ -64,6 +62,7 @@ tests/test_configuration.py
64
62
  tests/test_custom_schema.py
65
63
  tests/test_custom_version_base_class.py
66
64
  tests/test_delete.py
65
+ tests/test_efficient_queries.py
67
66
  tests/test_exotic_listener_chaining.py
68
67
  tests/test_exotic_operation_combos.py
69
68
  tests/test_insert.py
@@ -74,6 +73,7 @@ tests/test_savepoints.py
74
73
  tests/test_sessions.py
75
74
  tests/test_transaction.py
76
75
  tests/test_update.py
76
+ tests/test_user_guide_examples.py
77
77
  tests/test_vacuum.py
78
78
  tests/test_validity_strategy.py
79
79
  tests/test_validity_strategy_multithreaded.py
@@ -0,0 +1,10 @@
1
+ SQLAlchemy<2.1,>=1.4.53
2
+
3
+ [flask]
4
+ Flask>=2.0
5
+
6
+ [flask-login]
7
+ Flask-Login>=0.6
8
+
9
+ [flask-sqlalchemy]
10
+ Flask-SQLAlchemy>=3.0
@@ -1,11 +1,9 @@
1
- Alembic migrations
2
- ==================
1
+ # Alembic migrations
3
2
 
4
3
  Each time you make changes to database structure you should also change the associated history tables. When you make changes to your models SQLAlchemy-Continuum automatically alters the history model definitions, hence you can use `alembic revision --autogenerate` just like before. You just need to make sure `make_versioned` function gets called before alembic gathers all your models and `configure_mappers` is called afterwards.
5
4
 
6
5
  Pay close attention when dropping or moving data from parent tables and reflecting these changes to history tables.
7
6
 
8
- Troubleshooting
9
- ###############
7
+ ## Troubleshooting
10
8
 
11
9
  If alembic didn't detect any changes or generates reversed migration (tries to remove `*_version` tables from database instead of creating), make sure that `configure_mappers` was called by alembic command.
@@ -0,0 +1,27 @@
1
+ # API reference
2
+
3
+ ::: sqlalchemy_continuum.make_versioned
4
+
5
+ ## Versioning Manager
6
+
7
+ ::: sqlalchemy_continuum.manager.VersioningManager
8
+
9
+ ## Builders
10
+
11
+ ::: sqlalchemy_continuum.table_builder.TableBuilder
12
+
13
+ ::: sqlalchemy_continuum.model_builder.ModelBuilder
14
+
15
+ ::: sqlalchemy_continuum.relationship_builder.RelationshipBuilder
16
+
17
+ ## UnitOfWork
18
+
19
+ ::: sqlalchemy_continuum.unit_of_work.UnitOfWork
20
+
21
+ ## History class
22
+
23
+ ::: sqlalchemy_continuum.version.VersionClassBase
24
+
25
+ ## Changelog
26
+
27
+ See the [changelog](changelog.md) for a full list of changes in each release.