SQLAlchemy-Continuum 1.4.1__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.
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/CHANGES.rst +54 -5
- sqlalchemy_continuum-1.5.0/PKG-INFO +184 -0
- sqlalchemy_continuum-1.5.0/SQLAlchemy_Continuum.egg-info/PKG-INFO +184 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/SQLAlchemy_Continuum.egg-info/SOURCES.txt +1 -3
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/SQLAlchemy_Continuum.egg-info/requires.txt +8 -6
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/conf.py +83 -60
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/revert.rst +1 -1
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/transactions.rst +0 -2
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/version_objects.rst +0 -1
- sqlalchemy_continuum-1.5.0/pyproject.toml +111 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/__init__.py +43 -38
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/builder.py +20 -23
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/dialects/postgresql.py +78 -128
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/expression_reflector.py +3 -4
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/factory.py +1 -1
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/fetcher.py +29 -51
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/manager.py +34 -23
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/model_builder.py +28 -56
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/operation.py +6 -8
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/plugins/activity.py +19 -27
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/plugins/base.py +7 -10
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/plugins/flask.py +6 -11
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/plugins/null_delete.py +5 -5
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/plugins/property_mod_tracker.py +11 -10
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/plugins/transaction_changes.py +10 -16
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/plugins/transaction_meta.py +10 -17
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/relationship_builder.py +67 -65
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/reverter.py +14 -21
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/schema.py +40 -55
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/table_builder.py +11 -25
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/transaction.py +49 -37
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/unit_of_work.py +31 -53
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/utils.py +27 -49
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/version.py +4 -2
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/__init__.py +25 -45
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/builders/test_relationship_builder.py +3 -7
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/builders/test_table_builder.py +15 -10
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/dialects/test_triggers.py +1 -7
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/inheritance/test_common_base_class.py +3 -4
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/inheritance/test_concrete_inheritance.py +16 -26
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/inheritance/test_join_table_inheritance.py +55 -70
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/inheritance/test_multi_level_inheritance.py +4 -7
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/inheritance/test_single_table_inheritance.py +17 -20
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/plugins/test_activity.py +21 -26
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/plugins/test_flask.py +43 -66
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/plugins/test_null_delete.py +3 -2
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/plugins/test_plugin_collection.py +3 -2
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/plugins/test_property_mod_tracker.py +28 -40
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/plugins/test_transaction_changes.py +17 -22
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/plugins/test_transaction_meta.py +8 -8
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/relationships/test_association_table_relations.py +14 -14
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/relationships/test_custom_condition_relations.py +13 -21
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/relationships/test_dynamic_relationships.py +13 -22
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/relationships/test_many_to_many_relations.py +80 -121
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/relationships/test_non_versioned_classes.py +15 -22
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/relationships/test_one_to_many_relations.py +72 -97
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/relationships/test_one_to_one_relations.py +20 -20
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/revert/test_deep_relationships.py +5 -5
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/revert/test_many_to_many_relationships.py +15 -21
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/revert/test_one_to_one_relationship.py +8 -10
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/revert/test_one_to_one_with_secondary_table.py +10 -17
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/schema/test_update_end_transaction_id.py +9 -8
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/schema/test_update_property_mod_flags.py +10 -13
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_accessors.py +64 -74
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_changeset.py +29 -28
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_column_aliases.py +12 -18
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_column_inclusion_and_exclusion.py +15 -20
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_compatibility.py +5 -5
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_composite_primary_key.py +6 -13
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_configuration.py +14 -16
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_custom_schema.py +8 -15
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_custom_version_base_class.py +2 -3
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_delete.py +5 -4
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_exotic_listener_chaining.py +5 -4
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_exotic_operation_combos.py +12 -12
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_insert.py +10 -12
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_mapper_args.py +8 -21
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_raw_sql.py +10 -13
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_revert.py +38 -40
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_savepoints.py +13 -15
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_sessions.py +9 -10
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_transaction.py +13 -26
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_update.py +27 -28
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_vacuum.py +7 -23
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_validity_strategy.py +16 -21
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_validity_strategy_multithreaded.py +28 -23
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/test_versions.py +4 -4
- sqlalchemy_continuum-1.5.0/tests/utils/test_changeset.py +23 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/utils/test_count_versions.py +6 -6
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/utils/test_is_modified.py +5 -6
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/utils/test_transaction_class.py +2 -5
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/utils/test_tx_column_name.py +6 -11
- SQLAlchemy-Continuum-1.4.1/PKG-INFO +0 -47
- SQLAlchemy-Continuum-1.4.1/SQLAlchemy_Continuum.egg-info/PKG-INFO +0 -47
- SQLAlchemy-Continuum-1.4.1/SQLAlchemy_Continuum.egg-info/not-zip-safe +0 -1
- SQLAlchemy-Continuum-1.4.1/setup.py +0 -82
- SQLAlchemy-Continuum-1.4.1/tests/test_i18n.py +0 -88
- SQLAlchemy-Continuum-1.4.1/tests/utils/test_changeset.py +0 -25
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/LICENSE +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/MANIFEST.in +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/README.rst +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/SQLAlchemy_Continuum.egg-info/dependency_links.txt +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/SQLAlchemy_Continuum.egg-info/top_level.txt +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/Makefile +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/alembic.rst +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/api.rst +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/configuration.rst +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/index.rst +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/intro.rst +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/license.rst +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/make.bat +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/native_versioning.rst +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/plugins.rst +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/queries.rst +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/schema.rst +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/docs/utilities.rst +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/setup.cfg +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/dialects/__init__.py +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/exc.py +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/sqlalchemy_continuum/plugins/__init__.py +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/builders/__init__.py +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/builders/test_model_builder.py +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/dialects/__init__.py +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/inheritance/__init__.py +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/plugins/__init__.py +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/relationships/__init__.py +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/revert/__init__.py +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/schema/__init__.py +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/utils/__init__.py +0 -0
- {SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/tests/utils/test_parent_class.py +1 -1
- {SQLAlchemy-Continuum-1.4.1 → 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
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
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
|
{SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/SQLAlchemy_Continuum.egg-info/SOURCES.txt
RENAMED
|
@@ -2,11 +2,10 @@ CHANGES.rst
|
|
|
2
2
|
LICENSE
|
|
3
3
|
MANIFEST.in
|
|
4
4
|
README.rst
|
|
5
|
-
|
|
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
|
{SQLAlchemy-Continuum-1.4.1 → sqlalchemy_continuum-1.5.0}/SQLAlchemy_Continuum.egg-info/requires.txt
RENAMED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
SQLAlchemy
|
|
2
|
-
SQLAlchemy-Utils>=0.
|
|
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
|
-
|
|
25
|
+
packaging
|