Skip to content

Commit b3c07b4

Browse files
committed
Update name property;
Extract generic functions; Names merging at models merge stage;
1 parent e54eef8 commit b3c07b4

File tree

6 files changed

+79
-41
lines changed

6 files changed

+79
-41
lines changed

rest_client_gen/models_meta.py

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import inflection
44

55
from .dynamic_typing import MetaData, SingleType
6+
from .utils import distinct_words
67

78
try:
89
# https://www.clips.uantwerpen.be/pages/pattern-en#pluralization
@@ -27,6 +28,7 @@ def __init__(self, t: MetaData, index, _original_fields=None):
2728
self.index = index
2829
self.pointers: Set[ModelPtr] = set()
2930
self._name: Optional[str] = None
31+
self._name_generated: Optional[bool] = None
3032

3133
def __str__(self):
3234
return f"Model#{self.index}" + ("-" + self._name if self._name else "")
@@ -40,39 +42,44 @@ def __eq__(self, other):
4042
def __hash__(self):
4143
return hash(self.index)
4244

43-
def update_base_name(self):
45+
def generate_name(self):
4446
# TODO: Tests
45-
base_names = {singularize(inflection.underscore(ptr.parent_field_name))
46-
for ptr in self.pointers if ptr.parent is not None}
47-
filtered_names = set()
48-
for name in base_names:
49-
for other in list(filtered_names):
50-
if name in other:
51-
filtered_names.add(name)
52-
filtered_names.remove(other)
53-
break
54-
elif other in name:
55-
break
56-
else:
57-
filtered_names.add(name)
58-
names = [inflection.camelize(name)
59-
for name in sorted(filtered_names)]
60-
self._name = "_".join(names)
47+
base_names = (singularize(inflection.underscore(ptr.parent_field_name))
48+
for ptr in self.pointers if ptr.parent is not None)
49+
filtered_names = distinct_words(*base_names)
50+
new_name = self.name_joiner(*map(inflection.camelize, sorted(filtered_names)))
51+
if new_name:
52+
self._name = new_name
53+
self._name_generated = True
54+
55+
@classmethod
56+
def name_joiner(cls, *names: str) -> str:
57+
return "_".join(names)
6158

6259
@property
63-
def base_name(self) -> str:
64-
if self._name is None:
65-
self.update_base_name()
60+
def name(self) -> str:
61+
# if self._name is None:
62+
# self.generate_name()
6663
return self._name
6764

68-
@base_name.setter
69-
def base_name(self, value: str):
65+
@name.setter
66+
def name(self, name: str):
67+
value = inflection.camelize(singularize(name))
7068
self._name = value
69+
self._name_generated = False
7170

72-
@base_name.deleter
73-
def base_name(self):
71+
@name.deleter
72+
def name(self):
7473
self._name = None
7574

75+
def set_raw_name(self, name):
76+
self._name = name
77+
self._name_generated = False
78+
79+
@property
80+
def is_name_generated(self):
81+
return self._name_generated
82+
7683
def connect(self, ptr: 'ModelPtr'):
7784
self.pointers.add(ptr)
7885

rest_client_gen/registry.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from .dynamic_typing import BaseType, MetaData
88
from .models_meta import ModelMeta, ModelPtr
9-
from .utils import Index
9+
from .utils import Index, distinct_words
1010

1111

1212
class ModelCmp:
@@ -144,12 +144,18 @@ def merge_models(self, generator, strict=False) -> List[Tuple[ModelMeta, Set[Mod
144144

145145
def _merge(self, generator, *models: ModelMeta):
146146
original_fields = list(chain(model.original_fields for model in models))
147+
originals_names = []
147148
fields = OrderedSet()
148149
for model in models:
149150
fields.update(model.type.keys())
151+
if not model.is_name_generated and model.name:
152+
originals_names.append(model.name)
153+
originals_names = distinct_words(*originals_names)
150154

151155
metadata = generator.merge_field_sets([model.type for model in models])
152156
model_meta = ModelMeta(metadata, self._index(), original_fields)
157+
if originals_names:
158+
model_meta.name = ModelMeta.name_joiner(*originals_names)
153159
for model in models:
154160
self._unregister(model)
155161
for ptr in tuple(model.pointers):

rest_client_gen/utils.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
from typing import Set
23

34

45
class Index:
@@ -16,5 +17,30 @@ def __call__(self, *args, **kwargs):
1617
self.i += 1
1718
return value
1819

20+
1921
def json_format(x) -> str:
20-
return json.dumps(x, indent=4, default=str, ensure_ascii=False)
22+
return json.dumps(x, indent=4, default=str, ensure_ascii=False)
23+
24+
25+
def distinct_words(*words: str) -> Set[str]:
26+
"""
27+
Filters strings so only unique strings without extended ones will be exists in resulted set, e.g.
28+
>>> distinct_words('test', 'another_test', 'foo', 'qwerty_foo_bar')
29+
{'test', 'foo'}
30+
31+
:param words:
32+
:return:
33+
"""
34+
words = set(words)
35+
filtered_words = set()
36+
for name in words:
37+
for other in list(filtered_words):
38+
if name in other:
39+
filtered_words.add(name)
40+
filtered_words.remove(other)
41+
break
42+
elif other in name:
43+
break
44+
else:
45+
filtered_words.add(name)
46+
return filtered_words

testing_tools/real_apis/f1.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""
22
Example uses Ergast Developer API (http://ergast.com/mrd/)
33
"""
4+
import inflection
45
import requests
56

67
from rest_client_gen.generator import Generator
@@ -27,31 +28,29 @@ def driver_standings(season='current', round_code='last'):
2728
def main():
2829
results_data = results()
2930
dump_response("f1", "results", results_data)
31+
results_data = ("results", results_data)
3032

3133
drivers_data = drivers()
3234
dump_response("f1", "drivers", drivers_data)
35+
drivers_data = ("drivers", drivers_data)
3336

3437
driver_standings_data = driver_standings()
3538
dump_response("f1", "driver_standings", driver_standings_data)
39+
driver_standings_data = ("driver_standings", driver_standings_data)
3640

3741
gen = Generator()
3842
reg = ModelRegistry()
39-
for data in (results_data, drivers_data, driver_standings_data):
43+
for name, data in (results_data, drivers_data, driver_standings_data):
4044
fields = gen.generate(*data)
41-
model = reg.process_meta_data(fields)
42-
print(pretty_format_meta(model))
45+
model_ptr = reg.process_meta_data(fields)
46+
model_ptr.type.set_raw_name(inflection.camelize(name))
47+
reg.merge_models(generator=gen)
48+
for model in reg.models:
49+
model.generate_name()
4350

44-
result = reg.merge_models(generator=gen)
45-
for model, group in result:
46-
print("\n" + "=" * 20, end='')
51+
for model in reg.models:
4752
print(pretty_format_meta(model))
48-
49-
print("\n" + "-" * 10 + " replaces " + "-" * 10, end='')
50-
for old_model in group:
51-
print(pretty_format_meta(old_model))
52-
53-
print("\n" + "=" * 20, end='')
54-
print(pretty_format_meta(next(iter(reg.models))))
53+
print("=" * 20, end='')
5554

5655

5756
if __name__ == '__main__':

testing_tools/real_apis/openlibrary.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def main():
5050

5151
print("\n" + "=" * 20, end='')
5252
for model in reg.models:
53-
model.update_base_name()
53+
model.generate_name()
5454
for model in reg.models:
5555
print(pretty_format_meta(model))
5656
print("\n" + "=" * 20, end='')

testing_tools/real_apis/pathofexile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def main():
3838

3939
print("\n" + "=" * 20, end='')
4040
for model in reg.models:
41-
model.update_base_name()
41+
model.generate_name()
4242
print(pretty_format_meta(next(iter(reg.models))))
4343

4444

0 commit comments

Comments
 (0)