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