From 679f7849e881c78a9b7a6d00e44cde1e4d9a46b7 Mon Sep 17 00:00:00 2001 From: zhao vistart Date: Wed, 11 Nov 2026 21:41:32 +0800 Subject: [PATCH 1/3] feat!: declare models by overriding accessors, not by dunder Breaking, following rhosocial-activerecord: model fixtures and examples now override table_name(), primary_key(), pk_auto_generated(), read_only() and the locator methods instead of assigning __table_name__ and friends. The framework stopped reading those dunders, so a model still declaring them would fail with NotImplementedError at the first read. Produced by the core repository's declaration sweep (scripts/ d5_migrate_declarations.py), so every repository in the family carries the same shape. No new lint findings: the totals drop where the removed assignments took their imports with them. CI for this branch installs the family from the matching feature/declaration-surface ref, so a run exercises one revision across core, testsuite and the backend under test rather than a mixture of two. Includes the two forms the class-body sweep could not see: consumers that read the removed dunders now call the accessor, and runtime assignments that used to declare a table name or schema dynamically now install the classmethod an override would declare. --- .github/workflows/test.yml | 8 ++-- tests/providers/basic_connection.py | 11 +++-- tests/providers/query_connection.py | 11 +++-- .../backend/ddl/test_ddl_source_collection.py | 19 +++++++-- .../ddl/test_derived_ddl_inline_index.py | 6 ++- .../feature/backend/test_async_concurrency.py | 41 ++++++++++++++----- .../backend/test_mariadb_ddl_improvements.py | 18 +++++--- 7 files changed, 82 insertions(+), 32 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 66f9c570..fe3b8829 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -66,8 +66,8 @@ jobs: - name: Install activerecord and testsuite run: | - pip install "rhosocial-activerecord @ git+https://github.com/rhosocial/python-activerecord.git@feature/error-taxonomy" # NOSONAR - pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@feature/error-taxonomy" # NOSONAR + pip install "rhosocial-activerecord @ git+https://github.com/rhosocial/python-activerecord.git@feature/declaration-surface" # NOSONAR + pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@feature/declaration-surface" # NOSONAR - name: Install dependencies run: | @@ -153,8 +153,8 @@ jobs: - name: Install activerecord and testsuite run: | - pip install "rhosocial-activerecord @ git+https://github.com/rhosocial/python-activerecord.git@feature/error-taxonomy" # NOSONAR - pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@feature/error-taxonomy" # NOSONAR + pip install "rhosocial-activerecord @ git+https://github.com/rhosocial/python-activerecord.git@feature/declaration-surface" # NOSONAR + pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@feature/declaration-surface" # NOSONAR - name: Install dependencies run: | diff --git a/tests/providers/basic_connection.py b/tests/providers/basic_connection.py index 0fdc1be2..516d33a3 100644 --- a/tests/providers/basic_connection.py +++ b/tests/providers/basic_connection.py @@ -9,7 +9,6 @@ from rhosocial.activerecord.model import ActiveRecord, AsyncActiveRecord from rhosocial.activerecord.backend.impl.mariadb.backend import MariaDBBackend -from rhosocial.activerecord.backend.impl.mariadb.config import MariaDBConnectionConfig from rhosocial.activerecord.connection.pool import BackendPool, AsyncBackendPool, PoolConfig from rhosocial.activerecord.backend.options import ExecutionOptions from rhosocial.activerecord.backend.schema import StatementType @@ -20,7 +19,10 @@ class SyncTestUser(ActiveRecord): """Sync test user model for connection pool tests.""" - __table_name__ = "test_users" + @classmethod + def table_name(cls): + return "test_users" + id: Optional[int] = None name: str email: str @@ -28,7 +30,10 @@ class SyncTestUser(ActiveRecord): class AsyncTestUser(AsyncActiveRecord): """Async test user model for connection pool tests.""" - __table_name__ = "test_users" + @classmethod + def table_name(cls): + return "test_users" + id: Optional[int] = None name: str email: str diff --git a/tests/providers/query_connection.py b/tests/providers/query_connection.py index e16763a8..c99cbaa7 100644 --- a/tests/providers/query_connection.py +++ b/tests/providers/query_connection.py @@ -9,7 +9,6 @@ from rhosocial.activerecord.model import ActiveRecord, AsyncActiveRecord from rhosocial.activerecord.backend.impl.mariadb.backend import MariaDBBackend -from rhosocial.activerecord.backend.impl.mariadb.config import MariaDBConnectionConfig from rhosocial.activerecord.connection.pool import BackendPool, AsyncBackendPool, PoolConfig from rhosocial.activerecord.backend.options import ExecutionOptions from rhosocial.activerecord.backend.schema import StatementType @@ -20,7 +19,10 @@ class SyncQueryTestUser(ActiveRecord): """Sync test user model for query connection pool tests.""" - __table_name__ = "test_users" + @classmethod + def table_name(cls): + return "test_users" + id: Optional[int] = None name: str email: str @@ -28,7 +30,10 @@ class SyncQueryTestUser(ActiveRecord): class AsyncQueryTestUser(AsyncActiveRecord): """Async test user model for query connection pool tests.""" - __table_name__ = "test_users" + @classmethod + def table_name(cls): + return "test_users" + id: Optional[int] = None name: str email: str diff --git a/tests/rhosocial/activerecord_mariadb_test/feature/backend/ddl/test_ddl_source_collection.py b/tests/rhosocial/activerecord_mariadb_test/feature/backend/ddl/test_ddl_source_collection.py index fa277dab..5b5ecddd 100644 --- a/tests/rhosocial/activerecord_mariadb_test/feature/backend/ddl/test_ddl_source_collection.py +++ b/tests/rhosocial/activerecord_mariadb_test/feature/backend/ddl/test_ddl_source_collection.py @@ -168,8 +168,14 @@ def apply(cls, new_class, field_name, annotation, metadata): class DDLDeclarations: - __table_name__ = "ddl_source_orders" - __primary_key__ = ("tenant_key", "order_key") + @classmethod + def table_name(cls): + return "ddl_source_orders" + + @classmethod + def primary_key(cls): + return ("tenant_key", "order_key") + __table_constraints__ = TABLE_CONSTRAINTS __table_indexes__ = TABLE_INDEXES _feature_handlers = [BackendColumnOptionsHandler] @@ -235,8 +241,13 @@ class AsyncDDLSource(DDLDeclarations, AsyncActiveRecord): class SingleKeyDeclarations: - __table_name__ = "ddl_source_single_key" - __primary_key__ = "record_pk" + @classmethod + def table_name(cls): + return "ddl_source_single_key" + + @classmethod + def primary_key(cls): + return "record_pk" record_id: Annotated[ int, diff --git a/tests/rhosocial/activerecord_mariadb_test/feature/backend/ddl/test_derived_ddl_inline_index.py b/tests/rhosocial/activerecord_mariadb_test/feature/backend/ddl/test_derived_ddl_inline_index.py index f649f856..4ca9c1c0 100644 --- a/tests/rhosocial/activerecord_mariadb_test/feature/backend/ddl/test_derived_ddl_inline_index.py +++ b/tests/rhosocial/activerecord_mariadb_test/feature/backend/ddl/test_derived_ddl_inline_index.py @@ -22,7 +22,9 @@ class Indexed(ActiveRecord): - __table_name__ = "indexed" + @classmethod + def table_name(cls): + return "indexed" id: int email: Annotated[str, UseIndex("idx_indexed_email", unique=True)] @@ -36,7 +38,7 @@ def _create_indexed_table(): dialect = mariadb_dialect() return CreateTableStatement( dialect, - Table(dialect, Indexed.__table_name__), + Table(dialect, Indexed.table_name()), columns=[ ColumnDefinition(dialect, "id", IntegerType(dialect)), ColumnDefinition(dialect, "email", VarCharType(dialect, 255)), diff --git a/tests/rhosocial/activerecord_mariadb_test/feature/backend/test_async_concurrency.py b/tests/rhosocial/activerecord_mariadb_test/feature/backend/test_async_concurrency.py index 1fe80d91..62f796f7 100644 --- a/tests/rhosocial/activerecord_mariadb_test/feature/backend/test_async_concurrency.py +++ b/tests/rhosocial/activerecord_mariadb_test/feature/backend/test_async_concurrency.py @@ -41,7 +41,10 @@ class ConcurrentUser(AsyncActiveRecord): """User model for concurrency testing.""" - __table_name__ = "concurrent_users" + @classmethod + def table_name(cls): + return "concurrent_users" + c: ClassVar[FieldProxy] = FieldProxy() id: Optional[int] = None @@ -53,7 +56,10 @@ class ConcurrentUser(AsyncActiveRecord): class ConcurrentTask(AsyncActiveRecord): """Task model for concurrency testing with status tracking.""" - __table_name__ = "concurrent_tasks" + @classmethod + def table_name(cls): + return "concurrent_tasks" + c: ClassVar[FieldProxy] = FieldProxy() id: Optional[int] = None @@ -276,7 +282,10 @@ async def isolated_worker_task(task_id: int): # Configure a task-specific model class class WorkerUser(AsyncActiveRecord): - __table_name__ = "concurrent_users" + @classmethod + def table_name(cls): + return "concurrent_users" + c: ClassVar[FieldProxy] = FieldProxy() id: Optional[int] = None username: str @@ -336,7 +345,7 @@ class WorkerUser(AsyncActiveRecord): await backend.execute("DROP TABLE IF EXISTS concurrent_users") await backend.disconnect() - print(f"\nSUCCESS: All 10 concurrent tasks with independent backends completed") + print("\nSUCCESS: All 10 concurrent tasks with independent backends completed") # --- Test 4: Transaction Isolation with Independent Backends --- @@ -369,7 +378,10 @@ async def transaction_task(task_id: int, should_commit: bool): await backend.connect() class TxUser(AsyncActiveRecord): - __table_name__ = "concurrent_users" + @classmethod + def table_name(cls): + return "concurrent_users" + c: ClassVar[FieldProxy] = FieldProxy() id: Optional[int] = None username: str @@ -445,7 +457,7 @@ class TxUser(AsyncActiveRecord): await backend.execute("DROP TABLE IF EXISTS concurrent_users") await backend.disconnect() - print(f"\nConfirmed: Transaction isolation works with independent backends") + print("\nConfirmed: Transaction isolation works with independent backends") print(f" Committed: {results['committed']}") print(f" Rolled back: {results['rolled_back']}") @@ -478,7 +490,10 @@ async def test_sequential_vs_concurrent_comparison(mysql_config): await shared_backend.connect() class SharedUser(AsyncActiveRecord): - __table_name__ = "concurrent_users" + @classmethod + def table_name(cls): + return "concurrent_users" + c: ClassVar[FieldProxy] = FieldProxy() id: Optional[int] = None username: str @@ -507,7 +522,10 @@ async def concurrent_insert(task_id: int): await backend.connect() try: class ConcurrentUser(AsyncActiveRecord): - __table_name__ = "concurrent_users" + @classmethod + def table_name(cls): + return "concurrent_users" + c: ClassVar[FieldProxy] = FieldProxy() id: Optional[int] = None username: str @@ -543,7 +561,7 @@ class ConcurrentUser(AsyncActiveRecord): assert len(users) == 20 - print(f"\nPerformance Comparison:") + print("\nPerformance Comparison:") print(f" Sequential (shared backend): {sequential_time:.3f}s") print(f" Concurrent (independent backends): {concurrent_time:.3f}s") @@ -592,7 +610,10 @@ async def safe_concurrent_task(task_id: int): await backend.connect() try: class SafeUser(AsyncActiveRecord): - __table_name__ = "concurrent_users" + @classmethod + def table_name(cls): + return "concurrent_users" + c: ClassVar[FieldProxy] = FieldProxy() id: Optional[int] = None username: str diff --git a/tests/rhosocial/activerecord_mariadb_test/feature/backend/test_mariadb_ddl_improvements.py b/tests/rhosocial/activerecord_mariadb_test/feature/backend/test_mariadb_ddl_improvements.py index 7eb211dd..767b3f8c 100644 --- a/tests/rhosocial/activerecord_mariadb_test/feature/backend/test_mariadb_ddl_improvements.py +++ b/tests/rhosocial/activerecord_mariadb_test/feature/backend/test_mariadb_ddl_improvements.py @@ -85,7 +85,9 @@ def test_stored_function_supported(self): class InheritedTable(ActiveRecord): - __table_name__ = "inherited" + @classmethod + def table_name(cls): + return "inherited" id: int @@ -95,7 +97,9 @@ def table_inherits(cls): class TablespacedTable(ActiveRecord): - __table_name__ = "tablespaced" + @classmethod + def table_name(cls): + return "tablespaced" id: int @@ -107,14 +111,16 @@ def table_tablespace(cls): class TestMariaDBTableDeclarationGating: def test_table_declaration_defaults_are_absent(self): class Plain(ActiveRecord): - __table_name__ = "plain_table_defaults" + @classmethod + def table_name(cls): + return "plain_table_defaults" id: int dialect = MariaDBDialect() expression = CreateTableStatement( dialect, - Table(dialect, Plain.__table_name__), + Table(dialect, Plain.table_name()), columns=[ColumnDefinition(dialect, "id", IntegerType(dialect))], inherits=Plain.table_inherits(), tablespace=Plain.table_tablespace(), @@ -127,7 +133,7 @@ def test_table_inherits_is_propagated_and_rejected(self): assert dialect.supports_table_inheritance() is False expression = CreateTableStatement( dialect, - Table(dialect, InheritedTable.__table_name__), + Table(dialect, InheritedTable.table_name()), columns=[ColumnDefinition(dialect, "id", IntegerType(dialect))], inherits=InheritedTable.table_inherits(), tablespace=InheritedTable.table_tablespace(), @@ -141,7 +147,7 @@ def test_table_tablespace_is_propagated_and_rejected(self): assert dialect.supports_table_tablespace() is False expression = CreateTableStatement( dialect, - Table(dialect, TablespacedTable.__table_name__), + Table(dialect, TablespacedTable.table_name()), columns=[ColumnDefinition(dialect, "id", IntegerType(dialect))], inherits=TablespacedTable.table_inherits(), tablespace=TablespacedTable.table_tablespace(), From a01af19cb5109c976735c91d5369dad1d03566f1 Mon Sep 17 00:00:00 2001 From: zhao vistart Date: Thu, 12 Nov 2026 14:29:44 +0800 Subject: [PATCH 2/3] ci: track the released core instead of the feature branch Workflow 'test.yml' installs this backend's dependencies from the other repositories in the family. Core's PR #140 is merged into release/v1.0.0.dev30, so the core ref now names that branch: a run of this repository tests the released core rather than a feature branch that no longer exists. The testsuite ref is unchanged and still names feature/declaration-surface: its migration has no merge yet, and pointing it at release/v1.0.0.dev17 would install fixtures that still declare the removed dunders. --- .check_expression_baseline.json | 180 ++++++++++++++++++++++++++++++++ .github/workflows/test.yml | 4 +- 2 files changed, 182 insertions(+), 2 deletions(-) create mode 100644 .check_expression_baseline.json diff --git a/.check_expression_baseline.json b/.check_expression_baseline.json new file mode 100644 index 00000000..5223bba9 --- /dev/null +++ b/.check_expression_baseline.json @@ -0,0 +1,180 @@ +{ + "entries": { + "0d3852f7ba8b76e3": 1, + "1733228f0faaf7fb": 1, + "1c222663c2ff230c": 1, + "25584d8b645569f1": 1, + "3038bd0d0e5dcd27": 1, + "3715c5f92c09460a": 1, + "38ab2da142dab644": 2, + "40ca24046bbddecd": 1, + "488fd080f7966cde": 2, + "50b81498e3d15a2e": 1, + "6c9c2319fe934f93": 1, + "75efe01dcaf4e7bf": 4, + "8983eb94844190c3": 1, + "8b7f4ab3b24c1f7b": 1, + "96091eb1eba4302d": 1, + "9aaed2de90b39a01": 1, + "9b9ad66ba54eee09": 2, + "a01b9b7363bd773e": 1, + "a606fcded0220d2e": 1, + "b0c0dd9e3ac04202": 1, + "b567771f220e6529": 2, + "c956e1c067df95c1": 1, + "eef973453cc73e51": 1 + }, + "findings": [ + { + "found": "invisible: Optional[bool]", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/expression/column.py", + "rule": "ED-10.2" + }, + { + "found": "invisible: Optional[bool]", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/expression/column.py", + "rule": "ED-10.2" + }, + { + "found": "kwargs: Any", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/expression/json.py", + "rule": "ED-KWARGS" + }, + { + "found": "getattr(expr, \"if_exists\", False)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/ddl/alter_table.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"wait\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/ddl/alter_table.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"nowait\", False)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/ddl/alter_table.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(action, \"if_not_exists\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/ddl/column.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(action, \"if_exists\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/ddl/column.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(action, \"if_exists\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/ddl/constraint.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(action, \"cascade\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/ddl/constraint.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"cascade\", False)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/ddl/routine.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"restrict\", False)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/ddl/routine.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"cascade\", False)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/ddl/routine.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"table_options\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/ddl_table.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"table_options\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/ddl_table.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(table_options, \"comment\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/ddl_table.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, 'replace', False)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/dml.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, 'ignore', False)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/dml.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"columns\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/json.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"json_column\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/json.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"nested_paths\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/json.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"partitions\", [])", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/partition.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"partitions\", [])", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/partition.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"partitions\", [])", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/partition.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"partitions\", [])", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/partition.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"partitions_count\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/partition.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"partitions_count\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/partition.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(definition, \"subpartition_definitions\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/partition.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"nowait\", False)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/truncate.py", + "rule": "ED-11.2" + }, + { + "found": "getattr(expr, \"wait\", None)", + "path": "src/rhosocial/activerecord/backend/impl/mariadb/mixins/truncate.py", + "rule": "ED-11.2" + } + ], + "format": 1 +} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fe3b8829..62967920 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -66,7 +66,7 @@ jobs: - name: Install activerecord and testsuite run: | - pip install "rhosocial-activerecord @ git+https://github.com/rhosocial/python-activerecord.git@feature/declaration-surface" # NOSONAR + pip install "rhosocial-activerecord @ git+https://github.com/rhosocial/python-activerecord.git@release/v1.0.0.dev30" # NOSONAR pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@feature/declaration-surface" # NOSONAR - name: Install dependencies @@ -153,7 +153,7 @@ jobs: - name: Install activerecord and testsuite run: | - pip install "rhosocial-activerecord @ git+https://github.com/rhosocial/python-activerecord.git@feature/declaration-surface" # NOSONAR + pip install "rhosocial-activerecord @ git+https://github.com/rhosocial/python-activerecord.git@release/v1.0.0.dev30" # NOSONAR pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@feature/declaration-surface" # NOSONAR - name: Install dependencies From c1ef667e09c249d9318f24caa3add9a6a808e990 Mon Sep 17 00:00:00 2001 From: zhao vistart Date: Thu, 12 Nov 2026 15:20:01 +0800 Subject: [PATCH 3/3] ci: track the merged testsuite instead of the feature branch The testsuite's PR #32 is merged into release/v1.0.0.dev17, so the testsuite ref now names that branch. Every cross-repository install in a run therefore resolves to a released artifact: core from release/v1.0.0.dev30, the testsuite from release/v1.0.0.dev17, and this repository from its own feature branch. --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 62967920..5c158b13 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -67,7 +67,7 @@ jobs: - name: Install activerecord and testsuite run: | pip install "rhosocial-activerecord @ git+https://github.com/rhosocial/python-activerecord.git@release/v1.0.0.dev30" # NOSONAR - pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@feature/declaration-surface" # NOSONAR + pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@release/v1.0.0.dev17" # NOSONAR - name: Install dependencies run: | @@ -154,7 +154,7 @@ jobs: - name: Install activerecord and testsuite run: | pip install "rhosocial-activerecord @ git+https://github.com/rhosocial/python-activerecord.git@release/v1.0.0.dev30" # NOSONAR - pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@feature/declaration-surface" # NOSONAR + pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@release/v1.0.0.dev17" # NOSONAR - name: Install dependencies run: |