Skip to content

Commit 0e63158

Browse files
committed
Fix Union optimization in merged models;
Add 2 swagger examples;
1 parent dad97d5 commit 0e63158

File tree

5 files changed

+3158
-1054
lines changed

5 files changed

+3158
-1054
lines changed

json_to_models/registry.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,7 @@ def merge_models(self, generator, strict=False) -> List[Tuple[ModelMeta, Set[Mod
179179
replaces.append((model_meta, group))
180180

181181
for model_meta in self.models:
182-
if model_meta.index not in replaces_ids:
183-
generator.optimize_type(model_meta)
182+
generator.optimize_type(model_meta)
184183
return replaces
185184

186185
def _merge(self, generator, *models: ModelMeta):
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from pathlib import Path
2+
3+
import yaml
4+
5+
from json_to_models.dynamic_typing.string_serializable import StringSerializable, registry
6+
from json_to_models.generator import MetadataGenerator
7+
from json_to_models.models.attr import AttrsModelCodeGenerator
8+
from json_to_models.models.base import generate_code
9+
from json_to_models.models.structure import compose_models_flat
10+
from json_to_models.registry import ModelFieldsNumberMatch, ModelFieldsPercentMatch, ModelRegistry
11+
12+
13+
@registry.add()
14+
class SwaggerRef(StringSerializable, str):
15+
@classmethod
16+
def to_internal_value(cls, value: str) -> 'SwaggerRef':
17+
if not value.startswith("#/"):
18+
raise ValueError(f"invalid literal for SwaggerRef: '{value}'")
19+
return cls(value)
20+
21+
def to_representation(self) -> str:
22+
return str(self)
23+
24+
25+
def load_data() -> dict:
26+
with (Path(__file__) / ".." / ".." / "spotify-swagger.yaml").open() as f:
27+
data = yaml.load(f, Loader=yaml.SafeLoader)
28+
return data
29+
30+
31+
def main():
32+
data = load_data()
33+
del data["paths"]
34+
35+
gen = MetadataGenerator(
36+
dict_keys_regex=[],
37+
dict_keys_fields=["securityDefinitions", "paths", "responses", "definitions", "properties", "scopes"]
38+
)
39+
reg = ModelRegistry(ModelFieldsPercentMatch(.5), ModelFieldsNumberMatch(10))
40+
fields = gen.generate(data)
41+
reg.process_meta_data(fields, model_name="Swagger")
42+
reg.merge_models(generator=gen)
43+
reg.generate_names()
44+
45+
structure = compose_models_flat(reg.models_map)
46+
code = generate_code(structure, AttrsModelCodeGenerator)
47+
print(code)
48+
49+
50+
if __name__ == '__main__':
51+
main()

testing_tools/real_apis/swagger.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import json
2+
from pathlib import Path
3+
4+
from json_to_models.dynamic_typing.string_serializable import StringSerializable, registry
5+
from json_to_models.generator import MetadataGenerator
6+
from json_to_models.models.attr import AttrsModelCodeGenerator
7+
from json_to_models.models.base import generate_code
8+
from json_to_models.models.structure import compose_models_flat
9+
from json_to_models.registry import ModelFieldsNumberMatch, ModelFieldsPercentMatch, ModelRegistry
10+
11+
12+
@registry.add()
13+
class SwaggerRef(StringSerializable, str):
14+
@classmethod
15+
def to_internal_value(cls, value: str) -> 'SwaggerRef':
16+
if not value.startswith("#/"):
17+
raise ValueError(f"invalid literal for SwaggerRef: '{value}'")
18+
return cls(value)
19+
20+
def to_representation(self) -> str:
21+
return str(self)
22+
23+
24+
def load_data() -> dict:
25+
with (Path(__file__) / ".." / ".." / "swagger.json").open() as f:
26+
data = json.load(f)
27+
return data
28+
29+
30+
def main():
31+
data = load_data()
32+
del data["paths"]
33+
34+
gen = MetadataGenerator(
35+
dict_keys_regex=[],
36+
dict_keys_fields=["securityDefinitions", "paths", "responses", "definitions", "properties"]
37+
)
38+
reg = ModelRegistry(ModelFieldsPercentMatch(.5), ModelFieldsNumberMatch(10))
39+
fields = gen.generate(data)
40+
reg.process_meta_data(fields, model_name="Swagger")
41+
reg.merge_models(generator=gen)
42+
reg.generate_names()
43+
44+
structure = compose_models_flat(reg.models_map)
45+
code = generate_code(structure, AttrsModelCodeGenerator)
46+
print(code)
47+
48+
49+
if __name__ == '__main__':
50+
main()

0 commit comments

Comments
 (0)