33import itertools
44import json
55import os .path
6+ import re
67from collections import defaultdict
78from datetime import datetime
89from pathlib import Path
@@ -79,26 +80,21 @@ def parse_args(self, args: List[str] = None):
7980 framework = namespace .framework
8081 code_generator = namespace .code_generator
8182 code_generator_kwargs_raw : List [str ] = namespace .code_generator_kwargs
82- code_generator_kwargs = {}
83- if code_generator_kwargs_raw :
84- for item in code_generator_kwargs_raw :
85- if item [0 ] == '"' :
86- item = item [1 :]
87- if item [- 1 ] == '"' :
88- item = item [:- 1 ]
89- name , value = item .split ("=" , 1 )
90- code_generator_kwargs [name ] = value
83+ dict_keys_regex : List [str ] = namespace .dict_keys_regex
84+ dict_keys_fields : List [str ] = namespace .dict_keys_fields
9185
9286 self .validate (models , models_lists , merge_policy , framework , code_generator )
9387 self .setup_models_data (models , models_lists )
94- self .set_args (merge_policy , structure , framework , code_generator , code_generator_kwargs )
88+ self .set_args (merge_policy , structure , framework , code_generator , code_generator_kwargs_raw ,
89+ dict_keys_regex , dict_keys_fields )
9590
9691 def run (self ):
9792 if self .enable_datetime :
9893 register_datetime_classes ()
99-
100- # TODO: Inject dict_keys_regex and dict_keys_fields
101- generator = MetadataGenerator ()
94+ generator = MetadataGenerator (
95+ dict_keys_regex = self .dict_keys_regex ,
96+ dict_keys_fields = self .dict_keys_fields
97+ )
10298 registry = ModelRegistry (* self .merge_policy )
10399 for name , data in self .models_data .items ():
104100 meta = generator .generate (* data )
@@ -152,7 +148,8 @@ def setup_models_data(self, models: Iterable[Tuple[str, Iterable[Path]]],
152148 }
153149
154150 def set_args (self , merge_policy : List [Union [List [str ], str ]],
155- structure : str , framework : str , code_generator : str , code_generator_kwargs : dict ):
151+ structure : str , framework : str , code_generator : str , code_generator_kwargs_raw : List [str ],
152+ dict_keys_regex : List [str ], dict_keys_fields : List [str ]):
156153 """
157154 Convert CLI args to python representation and set them to appropriate object attributes
158155 """
@@ -175,8 +172,18 @@ def set_args(self, merge_policy: List[Union[List[str], str]],
175172 m = importlib .import_module (module )
176173 self .model_generator = getattr (m , cls )
177174
178- if code_generator_kwargs :
179- self .model_generator_kwargs = code_generator_kwargs
175+ self .model_generator_kwargs = {}
176+ if code_generator_kwargs_raw :
177+ for item in code_generator_kwargs_raw :
178+ if item [0 ] == '"' :
179+ item = item [1 :]
180+ if item [- 1 ] == '"' :
181+ item = item [:- 1 ]
182+ name , value = item .split ("=" , 1 )
183+ self .model_generator_kwargs [name ] = value
184+
185+ self .dict_keys_regex = [re .compile (rf"^{ r } $" ) for r in dict_keys_regex ] if dict_keys_regex else ()
186+ self .dict_keys_fields = dict_keys_fields or ()
180187
181188 self .initialize = True
182189
@@ -185,7 +192,6 @@ def _create_argparser() -> argparse.ArgumentParser:
185192 """
186193 ArgParser factory
187194 """
188- # TODO: dict_keys_regex and dict_keys_fields arguments
189195 parser = argparse .ArgumentParser (
190196 formatter_class = argparse .RawTextHelpFormatter ,
191197 description = "Convert given json files into Python models."
@@ -215,6 +221,21 @@ def _create_argparser() -> argparse.ArgumentParser:
215221 "Warn.: This can lead to 6-7 times slowdown on large datasets.\n "
216222 " Be sure that you really need this option.\n \n "
217223 )
224+ parser .add_argument (
225+ "--dict-keys-regex" , "--dkr" ,
226+ nargs = "+" , metavar = "RegEx" ,
227+ help = "List of regular expressions (Python syntax).\n "
228+ "If all keys of some dict are match one of them\n "
229+ "then this dict will be marked as dict field but not nested model.\n "
230+ "Note: ^ and $ tokens will be added automatically but you have to\n "
231+ "escape other special characters manually.\n "
232+ )
233+ parser .add_argument (
234+ "--dict-keys-fields" , "--dkf" ,
235+ nargs = "+" , metavar = "FIELD NAME" ,
236+ help = "List of model fields names that will be marked as dict fields\n \n "
237+ )
238+
218239 default_percent = f"{ ModelFieldsPercentMatch .DEFAULT * 100 :.0f} "
219240 default_number = f"{ ModelFieldsNumberMatch .DEFAULT :.0f} "
220241 parser .add_argument (
0 commit comments