SQLAlchemy-Continuum 1.4.2__tar.gz → 1.5.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 (132) hide show
  1. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/CHANGES.rst +65 -5
  2. sqlalchemy_continuum-1.5.1/PKG-INFO +186 -0
  3. sqlalchemy_continuum-1.5.1/SQLAlchemy_Continuum.egg-info/PKG-INFO +186 -0
  4. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/SQLAlchemy_Continuum.egg-info/SOURCES.txt +2 -3
  5. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/SQLAlchemy_Continuum.egg-info/requires.txt +11 -6
  6. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/conf.py +86 -63
  7. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/index.rst +1 -0
  8. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/revert.rst +1 -1
  9. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/transactions.rst +0 -2
  10. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/version_objects.rst +0 -1
  11. sqlalchemy_continuum-1.5.1/pyproject.toml +114 -0
  12. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/__init__.py +43 -38
  13. sqlalchemy_continuum-1.5.1/sqlalchemy_continuum/_compat.py +607 -0
  14. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/builder.py +20 -23
  15. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/dialects/postgresql.py +78 -128
  16. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/expression_reflector.py +3 -4
  17. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/factory.py +1 -1
  18. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/fetcher.py +30 -52
  19. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/manager.py +35 -24
  20. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/model_builder.py +29 -57
  21. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/operation.py +7 -9
  22. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/plugins/activity.py +20 -28
  23. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/plugins/base.py +7 -10
  24. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/plugins/flask.py +7 -12
  25. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/plugins/null_delete.py +5 -5
  26. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/plugins/property_mod_tracker.py +12 -11
  27. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/plugins/transaction_changes.py +10 -16
  28. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/plugins/transaction_meta.py +10 -17
  29. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/relationship_builder.py +67 -65
  30. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/reverter.py +14 -21
  31. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/schema.py +40 -55
  32. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/table_builder.py +11 -25
  33. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/transaction.py +51 -37
  34. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/unit_of_work.py +32 -54
  35. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/utils.py +28 -50
  36. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/version.py +4 -2
  37. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/__init__.py +25 -45
  38. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/builders/test_relationship_builder.py +3 -7
  39. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/builders/test_table_builder.py +15 -10
  40. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/dialects/test_triggers.py +1 -7
  41. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/inheritance/test_common_base_class.py +3 -4
  42. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/inheritance/test_concrete_inheritance.py +16 -26
  43. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/inheritance/test_join_table_inheritance.py +55 -70
  44. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/inheritance/test_multi_level_inheritance.py +4 -7
  45. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/inheritance/test_single_table_inheritance.py +17 -20
  46. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/plugins/test_activity.py +21 -26
  47. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/plugins/test_flask.py +43 -66
  48. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/plugins/test_null_delete.py +3 -2
  49. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/plugins/test_plugin_collection.py +3 -2
  50. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/plugins/test_property_mod_tracker.py +28 -40
  51. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/plugins/test_transaction_changes.py +17 -22
  52. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/plugins/test_transaction_meta.py +8 -8
  53. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/relationships/test_association_table_relations.py +14 -14
  54. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/relationships/test_custom_condition_relations.py +13 -21
  55. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/relationships/test_dynamic_relationships.py +13 -22
  56. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/relationships/test_many_to_many_relations.py +80 -121
  57. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/relationships/test_non_versioned_classes.py +15 -22
  58. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/relationships/test_one_to_many_relations.py +72 -97
  59. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/relationships/test_one_to_one_relations.py +20 -20
  60. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/revert/test_deep_relationships.py +5 -5
  61. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/revert/test_many_to_many_relationships.py +15 -21
  62. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/revert/test_one_to_one_relationship.py +8 -10
  63. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/revert/test_one_to_one_with_secondary_table.py +10 -17
  64. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/schema/test_update_end_transaction_id.py +9 -8
  65. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/schema/test_update_property_mod_flags.py +10 -13
  66. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_accessors.py +64 -74
  67. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_changeset.py +29 -28
  68. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_column_aliases.py +12 -18
  69. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_column_inclusion_and_exclusion.py +15 -20
  70. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_compatibility.py +5 -5
  71. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_composite_primary_key.py +6 -13
  72. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_configuration.py +14 -16
  73. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_custom_schema.py +8 -15
  74. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_custom_version_base_class.py +2 -3
  75. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_delete.py +5 -4
  76. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_exotic_listener_chaining.py +5 -4
  77. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_exotic_operation_combos.py +12 -12
  78. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_insert.py +10 -12
  79. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_mapper_args.py +8 -21
  80. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_raw_sql.py +10 -13
  81. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_revert.py +38 -40
  82. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_savepoints.py +13 -15
  83. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_sessions.py +9 -10
  84. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_transaction.py +13 -26
  85. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_update.py +27 -28
  86. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_vacuum.py +7 -23
  87. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_validity_strategy.py +16 -21
  88. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_validity_strategy_multithreaded.py +28 -23
  89. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/test_versions.py +4 -4
  90. sqlalchemy_continuum-1.5.1/tests/utils/test_changeset.py +23 -0
  91. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/utils/test_count_versions.py +6 -6
  92. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/utils/test_is_modified.py +5 -6
  93. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/utils/test_transaction_class.py +2 -5
  94. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/utils/test_tx_column_name.py +6 -11
  95. sqlalchemy_continuum-1.4.2/PKG-INFO +0 -47
  96. sqlalchemy_continuum-1.4.2/SQLAlchemy_Continuum.egg-info/PKG-INFO +0 -47
  97. sqlalchemy_continuum-1.4.2/SQLAlchemy_Continuum.egg-info/not-zip-safe +0 -1
  98. sqlalchemy_continuum-1.4.2/setup.py +0 -82
  99. sqlalchemy_continuum-1.4.2/tests/test_i18n.py +0 -88
  100. sqlalchemy_continuum-1.4.2/tests/utils/test_changeset.py +0 -25
  101. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/LICENSE +0 -0
  102. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/MANIFEST.in +0 -0
  103. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/README.rst +0 -0
  104. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/SQLAlchemy_Continuum.egg-info/dependency_links.txt +0 -0
  105. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/SQLAlchemy_Continuum.egg-info/top_level.txt +0 -0
  106. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/Makefile +0 -0
  107. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/alembic.rst +0 -0
  108. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/api.rst +0 -0
  109. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/configuration.rst +0 -0
  110. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/intro.rst +0 -0
  111. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/license.rst +0 -0
  112. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/make.bat +0 -0
  113. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/native_versioning.rst +0 -0
  114. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/plugins.rst +0 -0
  115. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/queries.rst +0 -0
  116. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/schema.rst +0 -0
  117. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/docs/utilities.rst +0 -0
  118. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/setup.cfg +0 -0
  119. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/dialects/__init__.py +0 -0
  120. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/exc.py +0 -0
  121. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/sqlalchemy_continuum/plugins/__init__.py +0 -0
  122. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/builders/__init__.py +0 -0
  123. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/builders/test_model_builder.py +0 -0
  124. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/dialects/__init__.py +0 -0
  125. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/inheritance/__init__.py +0 -0
  126. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/plugins/__init__.py +0 -0
  127. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/relationships/__init__.py +0 -0
  128. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/revert/__init__.py +0 -0
  129. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/schema/__init__.py +0 -0
  130. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/utils/__init__.py +0 -0
  131. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/utils/test_parent_class.py +1 -1
  132. {sqlalchemy_continuum-1.4.2 → sqlalchemy_continuum-1.5.1}/tests/utils/test_version_class.py +1 -1
@@ -3,12 +3,72 @@ Changelog
3
3
 
4
4
  Here you can see the full list of changes between each SQLAlchemy-Continuum release.
5
5
 
6
+ Unreleased changes
7
+ ^^^^^^^^^^^^^^^^^^
8
+ - None currently
9
+
10
+ 1.5.1 (2025-10-01)
11
+ ^^^^^^^^^^^^^^^^^^
12
+ - Fix utc_now() to return a naive datetime (#373, thanks to dawhalen)
13
+
14
+ 1.5.0 (2025-08-30)
15
+ ^^^^^^^^^^^^^^^^^^
16
+
17
+ - Migrate to `ruff <https://docs.astral.sh/ruff/>`_ for code linting and formatting, replacing flake8 with a faster Rust-based tool. (#364)
18
+ - Add Python 3.13 support. (#364)
19
+ - Drop Python 3.8 support. (#364)
20
+ - Add comprehensive pre-commit hooks configuration with ruff, pyupgrade, and code quality checks
21
+ - Add `pyupgrade <https://github.com/asottile/pyupgrade>`_ integration to automatically modernize Python 3.9+ syntax
22
+ - Enhance tox configuration with matrix testing for multiple Python (3.9-3.13) and SQLAlchemy versions (1.4, 2.x)
23
+ - Add dedicated ruff testing environment in tox for consistent code quality checks
24
+ - Modernize codebase with Python 3.9+ idioms and formatting improvements
25
+ - Migrate to modern Python packaging with pyproject.toml
26
+ - Remove SQLAlchemy-i18n support
27
+ - Fix SQLAlchemy 2.0 deprecation warnings: replace Query.get() with Session.get() for improved compatibility
28
+ - Fix datetime.utcnow() deprecation warnings with cross-version compatibility function supporting Python 3.9-3.13+
29
+ - Eliminate cartesian product warnings in many-to-many relationship queries with non-versioned classes
30
+ - Improve code quality by modernizing mixed string formatting patterns to f-strings
31
+ - **MAJOR**: Remove SQLAlchemy-Utils dependency by porting required functions to internal _compat module (#352)
32
+
33
+ - Port core functions: ImproperlyConfigured, get_declarative_base, naturally_equivalent
34
+ - Port column utilities: get_columns, get_primary_keys, identity, get_column_key
35
+ - Port advanced functionality: has_changes, JSONType, generic_relationship with full SQLAlchemy 2.x compatibility
36
+ - Maintain full backward compatibility while eliminating external dependency
37
+ - Reduce installation footprint and potential version conflicts
38
+
39
+ 1.4.2 (2024-03-26)
40
+ ^^^^^^^^^^^^^^^^^^
41
+
42
+ - Remove SQLAlchemy pin and require latest SQLAlchemy-Utils
43
+
44
+
45
+ 1.4.1 (2024-03-14)
46
+ ^^^^^^^^^^^^^^^^^^
47
+
48
+ - Pin SQLAlchemy due to SQLAlchemy-Utils breakage
49
+ - Fix docs (#335, thanks to gnu-lorien)
50
+ - Remove use of deprecated `_app_ctx_stack` and `_request_ctx_stack` (#307, thanks to rubencho)
51
+
52
+
6
53
  1.4.0 (2023-07-12)
7
- - Add support for SQLAlchemy 2.0 and remove for < 1.4
8
- - Using before_execute for association tracking might break stuff
9
- - create_trigger's signature has changed to accept session
10
- - change to validity logic to avoid deadlock
11
- - removed Operation.iteritems
54
+ ^^^^^^^^^^^^^^^^^^
55
+
56
+ - Add support for SQLAlchemy 2.0
57
+ - Remove compatibility code for SQLAlchemy < 1.4 and Python 2
58
+ - Fix deadlock issues in MySQL on concurrent inserts (#172, thanks to mfulgo)
59
+ - Allow overriding of DATABASE_URL for docker compose
60
+ - Switch to before_execute for association tracking
61
+ - Use ORM instead of deadlock-prone validity update query
62
+ - create_trigger and sync_trigger now take a session, not a connection
63
+ - Removed Operation.iteritems
64
+
65
+
66
+ 1.3.15 (2023-06-07)
67
+ ^^^^^^^^^^^^^^^^^^^
68
+
69
+ - Fix docs (#329, thanks to kelvinscuesta)
70
+ - Declare six as a dependency (#327, thanks to zupo)
71
+
12
72
 
13
73
  1.3.14 (2023-01-04)
14
74
  ^^^^^^^^^^^^^^^^^^^
@@ -0,0 +1,186 @@
1
+ Metadata-Version: 2.4
2
+ Name: SQLAlchemy-Continuum
3
+ Version: 1.5.1
4
+ Summary: Versioning and auditing extension for SQLAlchemy.
5
+ Author: Mark Steward, Jose Soto
6
+ Author-email: Konsta Vesterinen <konsta@fastmonkeys.com>
7
+ License-Expression: BSD-3-Clause
8
+ Project-URL: Homepage, https://github.com/kvesteri/sqlalchemy-continuum
9
+ Classifier: Environment :: Web Environment
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
20
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
+ Requires-Python: >=3.9
22
+ Description-Content-Type: text/x-rst
23
+ License-File: LICENSE
24
+ Requires-Dist: SQLAlchemy<2.1,>=1.4.53
25
+ Provides-Extra: test
26
+ Requires-Dist: pytest>=2.3.5; extra == "test"
27
+ Requires-Dist: psycopg2>=2.4.6; extra == "test"
28
+ Requires-Dist: PyMySQL>=0.8.0; extra == "test"
29
+ Requires-Dist: Flask>=0.9; extra == "test"
30
+ Requires-Dist: Flask-Login>=0.2.9; extra == "test"
31
+ Requires-Dist: Flask-SQLAlchemy>=1.0; extra == "test"
32
+ Requires-Dist: packaging; extra == "test"
33
+ Provides-Extra: flask
34
+ Requires-Dist: Flask>=0.9; extra == "flask"
35
+ Provides-Extra: flask-login
36
+ Requires-Dist: Flask-Login>=0.2.9; extra == "flask-login"
37
+ Provides-Extra: flask-sqlalchemy
38
+ Requires-Dist: Flask-SQLAlchemy>=1.0; extra == "flask-sqlalchemy"
39
+ Provides-Extra: dev
40
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
41
+ Requires-Dist: tox>=4.0.0; extra == "dev"
42
+ Requires-Dist: pre-commit>=3.0.0; extra == "dev"
43
+ Provides-Extra: docs
44
+ Requires-Dist: sphinx>=4.0.0; extra == "docs"
45
+ Requires-Dist: furo>=2021.11.0; extra == "docs"
46
+ Dynamic: license-file
47
+
48
+ SQLAlchemy-Continuum
49
+ ====================
50
+
51
+ |Build Status| |Version Status| |Downloads|
52
+
53
+ Versioning and auditing extension for SQLAlchemy.
54
+
55
+
56
+ Features
57
+ --------
58
+
59
+ - Creates versions for inserts, deletes and updates
60
+ - Does not store updates which don't change anything
61
+ - Supports alembic migrations
62
+ - Can revert objects data as well as all object relations at given transaction even if the object was deleted
63
+ - Transactions can be queried afterwards using SQLAlchemy query syntax
64
+ - Query for changed records at given transaction
65
+ - Temporal relationship reflection. Version object's relationship show the parent objects relationships as they where in that point in time.
66
+ - Supports native versioning for PostgreSQL database (trigger based versioning)
67
+
68
+
69
+ QuickStart
70
+ ----------
71
+
72
+ ::
73
+
74
+
75
+ pip install SQLAlchemy-Continuum
76
+
77
+
78
+
79
+ In order to make your models versioned you need two things:
80
+
81
+ 1. Call make_versioned() before your models are defined.
82
+ 2. Add __versioned__ to all models you wish to add versioning to
83
+
84
+
85
+ .. code-block:: python
86
+
87
+
88
+ from sqlalchemy_continuum import make_versioned
89
+
90
+
91
+ make_versioned(user_cls=None)
92
+
93
+
94
+ class Article(Base):
95
+ __versioned__ = {}
96
+ __tablename__ = 'article'
97
+
98
+ id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
99
+ name = sa.Column(sa.Unicode(255))
100
+ content = sa.Column(sa.UnicodeText)
101
+
102
+
103
+ article = Article(name='Some article', content='Some content')
104
+ session.add(article)
105
+ session.commit()
106
+
107
+ # article has now one version stored in database
108
+ article.versions[0].name
109
+ # 'Some article'
110
+
111
+ article.name = 'Updated name'
112
+ session.commit()
113
+
114
+ article.versions[1].name
115
+ # 'Updated name'
116
+
117
+
118
+ # lets revert back to first version
119
+ article.versions[0].revert()
120
+
121
+ article.name
122
+ # 'Some article'
123
+
124
+ For completeness, below is a working example.
125
+
126
+ .. code-block:: python
127
+
128
+ from sqlalchemy_continuum import make_versioned
129
+ from sqlalchemy import Column, Integer, Unicode, UnicodeText, create_engine
130
+ from sqlalchemy.orm import create_session, configure_mappers, declarative_base
131
+
132
+ make_versioned(user_cls=None)
133
+
134
+ Base = declarative_base()
135
+ class Article(Base):
136
+ __versioned__ = {}
137
+ __tablename__ = 'article'
138
+ id = Column(Integer, primary_key=True, autoincrement=True)
139
+ name = Column(Unicode(255))
140
+ content = Column(UnicodeText)
141
+
142
+ configure_mappers()
143
+ engine = create_engine('sqlite://')
144
+ Base.metadata.create_all(engine)
145
+ session = create_session(bind=engine, autocommit=False)
146
+
147
+ article = Article(name=u'Some article', content=u'Some content')
148
+ session.add(article)
149
+ session.commit()
150
+ article.versions[0].name
151
+ article.name = u'Updated name'
152
+ session.commit()
153
+ article.versions[1].name
154
+ article.versions[0].revert()
155
+ article.name
156
+
157
+ Resources
158
+ ---------
159
+
160
+ - `Documentation <https://sqlalchemy-continuum.readthedocs.io/>`_
161
+ - `Issue Tracker <http://github.com/kvesteri/sqlalchemy-continuum/issues>`_
162
+ - `Code <http://github.com/kvesteri/sqlalchemy-continuum/>`_
163
+
164
+
165
+ .. image:: http://i.imgur.com/UFaRx.gif
166
+
167
+
168
+ .. |Build Status| image:: https://github.com/kvesteri/sqlalchemy-continuum/workflows/Test/badge.svg
169
+ :target: https://github.com/kvesteri/sqlalchemy-continuum/actions?query=workflow%3ATest
170
+ .. |Version Status| image:: https://img.shields.io/pypi/v/SQLAlchemy-Continuum.png
171
+ :target: https://pypi.python.org/pypi/SQLAlchemy-Continuum/
172
+ .. |Downloads| image:: https://img.shields.io/pypi/dm/SQLAlchemy-Continuum.png
173
+ :target: https://pypi.python.org/pypi/SQLAlchemy-Continuum/
174
+
175
+
176
+ More information
177
+ ----------------
178
+
179
+ - http://en.wikipedia.org/wiki/Slowly_changing_dimension
180
+ - http://en.wikipedia.org/wiki/Change_data_capture
181
+ - http://en.wikipedia.org/wiki/Anchor_Modeling
182
+ - http://en.wikipedia.org/wiki/Shadow_table
183
+ - https://wiki.postgresql.org/wiki/Audit_trigger
184
+ - https://wiki.postgresql.org/wiki/Audit_trigger_91plus
185
+ - http://kosalads.blogspot.fi/2014/06/implement-audit-functionality-in.html
186
+ - https://github.com/2ndQuadrant/pgaudit
@@ -0,0 +1,186 @@
1
+ Metadata-Version: 2.4
2
+ Name: SQLAlchemy-Continuum
3
+ Version: 1.5.1
4
+ Summary: Versioning and auditing extension for SQLAlchemy.
5
+ Author: Mark Steward, Jose Soto
6
+ Author-email: Konsta Vesterinen <konsta@fastmonkeys.com>
7
+ License-Expression: BSD-3-Clause
8
+ Project-URL: Homepage, https://github.com/kvesteri/sqlalchemy-continuum
9
+ Classifier: Environment :: Web Environment
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
20
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
+ Requires-Python: >=3.9
22
+ Description-Content-Type: text/x-rst
23
+ License-File: LICENSE
24
+ Requires-Dist: SQLAlchemy<2.1,>=1.4.53
25
+ Provides-Extra: test
26
+ Requires-Dist: pytest>=2.3.5; extra == "test"
27
+ Requires-Dist: psycopg2>=2.4.6; extra == "test"
28
+ Requires-Dist: PyMySQL>=0.8.0; extra == "test"
29
+ Requires-Dist: Flask>=0.9; extra == "test"
30
+ Requires-Dist: Flask-Login>=0.2.9; extra == "test"
31
+ Requires-Dist: Flask-SQLAlchemy>=1.0; extra == "test"
32
+ Requires-Dist: packaging; extra == "test"
33
+ Provides-Extra: flask
34
+ Requires-Dist: Flask>=0.9; extra == "flask"
35
+ Provides-Extra: flask-login
36
+ Requires-Dist: Flask-Login>=0.2.9; extra == "flask-login"
37
+ Provides-Extra: flask-sqlalchemy
38
+ Requires-Dist: Flask-SQLAlchemy>=1.0; extra == "flask-sqlalchemy"
39
+ Provides-Extra: dev
40
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
41
+ Requires-Dist: tox>=4.0.0; extra == "dev"
42
+ Requires-Dist: pre-commit>=3.0.0; extra == "dev"
43
+ Provides-Extra: docs
44
+ Requires-Dist: sphinx>=4.0.0; extra == "docs"
45
+ Requires-Dist: furo>=2021.11.0; extra == "docs"
46
+ Dynamic: license-file
47
+
48
+ SQLAlchemy-Continuum
49
+ ====================
50
+
51
+ |Build Status| |Version Status| |Downloads|
52
+
53
+ Versioning and auditing extension for SQLAlchemy.
54
+
55
+
56
+ Features
57
+ --------
58
+
59
+ - Creates versions for inserts, deletes and updates
60
+ - Does not store updates which don't change anything
61
+ - Supports alembic migrations
62
+ - Can revert objects data as well as all object relations at given transaction even if the object was deleted
63
+ - Transactions can be queried afterwards using SQLAlchemy query syntax
64
+ - Query for changed records at given transaction
65
+ - Temporal relationship reflection. Version object's relationship show the parent objects relationships as they where in that point in time.
66
+ - Supports native versioning for PostgreSQL database (trigger based versioning)
67
+
68
+
69
+ QuickStart
70
+ ----------
71
+
72
+ ::
73
+
74
+
75
+ pip install SQLAlchemy-Continuum
76
+
77
+
78
+
79
+ In order to make your models versioned you need two things:
80
+
81
+ 1. Call make_versioned() before your models are defined.
82
+ 2. Add __versioned__ to all models you wish to add versioning to
83
+
84
+
85
+ .. code-block:: python
86
+
87
+
88
+ from sqlalchemy_continuum import make_versioned
89
+
90
+
91
+ make_versioned(user_cls=None)
92
+
93
+
94
+ class Article(Base):
95
+ __versioned__ = {}
96
+ __tablename__ = 'article'
97
+
98
+ id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
99
+ name = sa.Column(sa.Unicode(255))
100
+ content = sa.Column(sa.UnicodeText)
101
+
102
+
103
+ article = Article(name='Some article', content='Some content')
104
+ session.add(article)
105
+ session.commit()
106
+
107
+ # article has now one version stored in database
108
+ article.versions[0].name
109
+ # 'Some article'
110
+
111
+ article.name = 'Updated name'
112
+ session.commit()
113
+
114
+ article.versions[1].name
115
+ # 'Updated name'
116
+
117
+
118
+ # lets revert back to first version
119
+ article.versions[0].revert()
120
+
121
+ article.name
122
+ # 'Some article'
123
+
124
+ For completeness, below is a working example.
125
+
126
+ .. code-block:: python
127
+
128
+ from sqlalchemy_continuum import make_versioned
129
+ from sqlalchemy import Column, Integer, Unicode, UnicodeText, create_engine
130
+ from sqlalchemy.orm import create_session, configure_mappers, declarative_base
131
+
132
+ make_versioned(user_cls=None)
133
+
134
+ Base = declarative_base()
135
+ class Article(Base):
136
+ __versioned__ = {}
137
+ __tablename__ = 'article'
138
+ id = Column(Integer, primary_key=True, autoincrement=True)
139
+ name = Column(Unicode(255))
140
+ content = Column(UnicodeText)
141
+
142
+ configure_mappers()
143
+ engine = create_engine('sqlite://')
144
+ Base.metadata.create_all(engine)
145
+ session = create_session(bind=engine, autocommit=False)
146
+
147
+ article = Article(name=u'Some article', content=u'Some content')
148
+ session.add(article)
149
+ session.commit()
150
+ article.versions[0].name
151
+ article.name = u'Updated name'
152
+ session.commit()
153
+ article.versions[1].name
154
+ article.versions[0].revert()
155
+ article.name
156
+
157
+ Resources
158
+ ---------
159
+
160
+ - `Documentation <https://sqlalchemy-continuum.readthedocs.io/>`_
161
+ - `Issue Tracker <http://github.com/kvesteri/sqlalchemy-continuum/issues>`_
162
+ - `Code <http://github.com/kvesteri/sqlalchemy-continuum/>`_
163
+
164
+
165
+ .. image:: http://i.imgur.com/UFaRx.gif
166
+
167
+
168
+ .. |Build Status| image:: https://github.com/kvesteri/sqlalchemy-continuum/workflows/Test/badge.svg
169
+ :target: https://github.com/kvesteri/sqlalchemy-continuum/actions?query=workflow%3ATest
170
+ .. |Version Status| image:: https://img.shields.io/pypi/v/SQLAlchemy-Continuum.png
171
+ :target: https://pypi.python.org/pypi/SQLAlchemy-Continuum/
172
+ .. |Downloads| image:: https://img.shields.io/pypi/dm/SQLAlchemy-Continuum.png
173
+ :target: https://pypi.python.org/pypi/SQLAlchemy-Continuum/
174
+
175
+
176
+ More information
177
+ ----------------
178
+
179
+ - http://en.wikipedia.org/wiki/Slowly_changing_dimension
180
+ - http://en.wikipedia.org/wiki/Change_data_capture
181
+ - http://en.wikipedia.org/wiki/Anchor_Modeling
182
+ - http://en.wikipedia.org/wiki/Shadow_table
183
+ - https://wiki.postgresql.org/wiki/Audit_trigger
184
+ - https://wiki.postgresql.org/wiki/Audit_trigger_91plus
185
+ - http://kosalads.blogspot.fi/2014/06/implement-audit-functionality-in.html
186
+ - https://github.com/2ndQuadrant/pgaudit
@@ -2,11 +2,10 @@ CHANGES.rst
2
2
  LICENSE
3
3
  MANIFEST.in
4
4
  README.rst
5
- setup.py
5
+ pyproject.toml
6
6
  SQLAlchemy_Continuum.egg-info/PKG-INFO
7
7
  SQLAlchemy_Continuum.egg-info/SOURCES.txt
8
8
  SQLAlchemy_Continuum.egg-info/dependency_links.txt
9
- SQLAlchemy_Continuum.egg-info/not-zip-safe
10
9
  SQLAlchemy_Continuum.egg-info/requires.txt
11
10
  SQLAlchemy_Continuum.egg-info/top_level.txt
12
11
  docs/Makefile
@@ -27,6 +26,7 @@ docs/transactions.rst
27
26
  docs/utilities.rst
28
27
  docs/version_objects.rst
29
28
  sqlalchemy_continuum/__init__.py
29
+ sqlalchemy_continuum/_compat.py
30
30
  sqlalchemy_continuum/builder.py
31
31
  sqlalchemy_continuum/exc.py
32
32
  sqlalchemy_continuum/expression_reflector.py
@@ -66,7 +66,6 @@ tests/test_custom_version_base_class.py
66
66
  tests/test_delete.py
67
67
  tests/test_exotic_listener_chaining.py
68
68
  tests/test_exotic_operation_combos.py
69
- tests/test_i18n.py
70
69
  tests/test_insert.py
71
70
  tests/test_mapper_args.py
72
71
  tests/test_raw_sql.py
@@ -1,5 +1,13 @@
1
- SQLAlchemy>=1.4.0
2
- SQLAlchemy-Utils>=0.41.2
1
+ SQLAlchemy<2.1,>=1.4.53
2
+
3
+ [dev]
4
+ ruff>=0.1.0
5
+ tox>=4.0.0
6
+ pre-commit>=3.0.0
7
+
8
+ [docs]
9
+ sphinx>=4.0.0
10
+ furo>=2021.11.0
3
11
 
4
12
  [flask]
5
13
  Flask>=0.9
@@ -10,9 +18,6 @@ Flask-Login>=0.2.9
10
18
  [flask-sqlalchemy]
11
19
  Flask-SQLAlchemy>=1.0
12
20
 
13
- [i18n]
14
- SQLAlchemy-i18n!=1.1.0,>=0.8.4
15
-
16
21
  [test]
17
22
  pytest>=2.3.5
18
23
  psycopg2>=2.4.6
@@ -20,4 +25,4 @@ PyMySQL>=0.8.0
20
25
  Flask>=0.9
21
26
  Flask-Login>=0.2.9
22
27
  Flask-SQLAlchemy>=1.0
23
- SQLAlchemy-i18n!=1.1.0,>=0.8.4
28
+ packaging