Skip to content

Commit e252f7f

Browse files
committed
refactor: allow TABLE_PREFIX logic reuse
1 parent 8dbd146 commit e252f7f

File tree

3 files changed

+33
-24
lines changed

3 files changed

+33
-24
lines changed

sc_audit/db_schema/association.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
"""
2+
Declare associative models that produce many-to-many tables.
3+
4+
Author: Alex Olieman <https://keybase.io/alioli>
5+
"""
16
from __future__ import annotations
27
import typing
38

sc_audit/db_schema/base.py

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"""
66
from dataclasses import fields
77
from decimal import Decimal
8-
from typing import Annotated
8+
from typing import Annotated, Type
99

1010
from sqlalchemy import Dialect, MetaData, String
1111
import sqlalchemy.types as types
@@ -51,37 +51,41 @@ class ScBase(MappedAsDataclass, DeclarativeBase):
5151
})
5252

5353
def __init_subclass__(cls) -> None:
54-
if settings.TABLE_PREFIX:
55-
# Check if the prefix has already been applied
56-
# unless the class is a test mapper class
57-
if (
58-
cls.__name__.startswith('Test')
59-
or not cls.__tablename__.startswith(settings.TABLE_PREFIX)
60-
):
61-
# Prefix the table name
62-
cls.__tablename__ = f"{settings.TABLE_PREFIX}_{cls.__tablename__}"
63-
64-
for dfield in fields(cls):
65-
field = getattr(cls, dfield.name, None)
66-
if field and hasattr(field, 'foreign_keys'):
67-
# Prefix all foreign key column references
68-
for fk in field.foreign_keys:
69-
if not fk._colspec.startswith(settings.TABLE_PREFIX):
70-
fk._colspec = f"{settings.TABLE_PREFIX}_{fk._colspec}"
71-
if fk.name and not fk.name.startswith(settings.TABLE_PREFIX):
72-
fk.name = f"{settings.TABLE_PREFIX}_{fk.name}"
73-
54+
prefix_tables_and_foreign_keys(cls)
7455
super().__init_subclass__()
7556

7657

77-
def create_test_mappers():
58+
def prefix_tables_and_foreign_keys(subclass: Type[DeclarativeBase]):
59+
if settings.TABLE_PREFIX:
60+
assert issubclass(subclass, MappedAsDataclass)
61+
# Check if the prefix has already been applied
62+
# unless the class is a test mapper class
63+
if (
64+
subclass.__name__.startswith('Test')
65+
or not subclass.__tablename__.startswith(settings.TABLE_PREFIX)
66+
):
67+
# Prefix the table name
68+
subclass.__tablename__ = f"{settings.TABLE_PREFIX}_{subclass.__tablename__}"
69+
70+
for dfield in fields(subclass):
71+
field = getattr(subclass, dfield.name, None)
72+
if field and hasattr(field, 'foreign_keys'):
73+
# Prefix all foreign key column references
74+
for fk in field.foreign_keys:
75+
if not fk._colspec.startswith(settings.TABLE_PREFIX):
76+
fk._colspec = f"{settings.TABLE_PREFIX}_{fk._colspec}"
77+
if fk.name and not fk.name.startswith(settings.TABLE_PREFIX):
78+
fk.name = f"{settings.TABLE_PREFIX}_{fk.name}"
79+
80+
81+
def create_test_mappers(base_class: Type[DeclarativeBase]):
7882
"""
7983
Create testnet versions of all registered models.
8084
These mappers are not needed at runtime, but they must exist when generating migrations.
8185
"""
8286
models = [
8387
mapper.class_
84-
for mapper in ScBase.registry.mappers
88+
for mapper in base_class.registry.mappers
8589
]
8690
# TODO: generate indexes for test tables
8791
settings.TABLE_PREFIX = "test"

sc_audit/migrations/env.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111

1212
# create test mappers after all models have been registered
13-
create_test_mappers()
13+
create_test_mappers(ScBase)
1414

1515
# this is the Alembic Config object, which provides
1616
# access to the values within the .ini file in use.

0 commit comments

Comments
 (0)