Skip to content

Commit 41282e2

Browse files
authored
Merge pull request #4 from weynelucas/chore/namespaced_tables
chore(builders): apply strategy for include namespace
2 parents f9e89fd + 235dd7c commit 41282e2

File tree

4 files changed

+43
-16
lines changed

4 files changed

+43
-16
lines changed

db_adapter/name_builders.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,7 @@ def __init__(self, settings=None):
1616
self.settings = settings or self.default_db_settings
1717

1818
def process_name(
19-
self,
20-
model: Model,
21-
fields: Fields,
22-
type: str,
23-
qualifier='',
24-
include_namespace=True,
19+
self, model: Model, fields: Fields, type: str, qualifier=''
2520
):
2621
parts = split_table_identifiers(
2722
model._meta.db_table,
@@ -44,11 +39,17 @@ def process_name(
4439
name=name,
4540
)
4641

47-
if namespace and include_namespace:
42+
include_namespace = namespace and self.should_include_namespace(
43+
model, fields, type, qualifier
44+
)
45+
if include_namespace:
4846
return '"{}"."{}"'.format(namespace, obj_name)
4947

5048
return obj_name
5149

50+
def should_include_namespace(self, model, field, type, qualifier=''):
51+
return type in ['sequence', 'trigger', 'index']
52+
5253
@cached_property
5354
def object_type_name_formats(self):
5455
return {

tests/models.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,19 @@ class Meta:
6262
db_table = 'tbl_post'
6363

6464

65+
class TwitterPost(DBAdapterModel):
66+
id = models.AutoField(primary_key=True, db_column='twitter_id')
67+
name = models.CharField(max_length=100, primary_key=True)
68+
flag = models.CharField(max_length=30, null=True, unique=True)
69+
description = models.TextField(
70+
null=True, help_text='Optional description for tag'
71+
)
72+
73+
class Meta:
74+
abstract = True
75+
db_table = '"twitter"."tbl_post"'
76+
77+
6578
class Article(DBAdapterModel):
6679
article_id = models.BigAutoField(primary_key=True)
6780
name = models.CharField(max_length=30)

tests/test_name_builders.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from db_adapter.name_builders import ObjectNameBuilder
44
from db_adapter.settings import DatabaseAdapterSettings
55

6-
from .models import Post, Reporter
6+
from .models import Post, TwitterPost
77

88

99
class ObjectNameBuilderTests(TestCase):
@@ -15,8 +15,9 @@ def setUp(self):
1515
'DEFAULT_TRIGGER_NAME': 'tg_{table_name}_b',
1616
'DEFAULT_INDEX_NAME': '{columns}_idx',
1717
'DEFAULT_PRIMARY_KEY_NAME': 'pk_{name}',
18-
'DEFAULT_CHECK_NAME': 'check{qualifier}',
18+
'DEFAULT_FOREIGN_KEY_NAME': 'fk_{name}',
1919
'DEFAULT_UNIQUE_NAME': 'ct_{table_name}_{columns}_uniq',
20+
'DEFAULT_CHECK_NAME': 'check{qualifier}',
2021
}
2122
)
2223

@@ -82,14 +83,26 @@ def test_process_namespaced_table(self):
8283
"""
8384
When a model include namespace inside `Meta.db_table`, all object names
8485
builded from that model should include the namespace too, excluding
85-
calls with `include_namespace=False`
86+
primary/unique/foreign keys and check constraints
8687
"""
87-
kwargs = dict(model=Reporter, fields=[], type='trigger')
8888

89-
with_namespace = self.builder.process_name(**kwargs)
90-
without_namespace = self.builder.process_name(
91-
**kwargs, include_namespace=False
89+
model = TwitterPost
90+
field = TwitterPost._meta.get_field('id')
91+
92+
sequence = self.builder.process_name(model, [field], 'sequence')
93+
trigger = self.builder.process_name(model, [field], 'trigger')
94+
index = self.builder.process_name(model, [field], 'index')
95+
primary_key = self.builder.process_name(model, [field], 'primary_key')
96+
foreign_key = self.builder.process_name(model, [field], 'foreign_key')
97+
unique = self.builder.process_name(model, [field], 'unique')
98+
check = self.builder.process_name(
99+
model, [field], 'check', qualifier='_nn'
92100
)
93101

94-
self.assertEqual(with_namespace, '"tests"."tg_reporter_b"')
95-
self.assertEqual(without_namespace, 'tg_reporter_b')
102+
self.assertEqual(sequence, '"twitter"."tbl_post_seq"')
103+
self.assertEqual(trigger, '"twitter"."tg_post_b"')
104+
self.assertEqual(index, '"twitter"."twitter_id_idx"')
105+
self.assertEqual(primary_key, 'pk_post_twitter_id')
106+
self.assertEqual(foreign_key, 'fk_post_twitter_id')
107+
self.assertEqual(unique, 'ct_post_twitter_id_uniq')
108+
self.assertEqual(check, 'check_nn')

0 commit comments

Comments
 (0)