3
3
import typing
4
4
5
5
from jinja2 import Environment
6
-
7
6
import keyword_generation .data_model as data_model
8
-
9
- from keyword_generation .handlers .handler_base import KeywordHandler
7
+ from keyword_generation .handlers .add_option import AddOptionHandler
8
+ from keyword_generation .handlers .card_set import CardSetHandler
9
+ from keyword_generation .handlers .conditional_card import ConditionalCardHandler
10
10
from keyword_generation .handlers .external_card import ExternalCardHandler
11
+ from keyword_generation .handlers .handler_base import KeywordHandler
12
+ from keyword_generation .handlers .insert_card import InsertCardHandler
13
+ from keyword_generation .handlers .override_field import OverrideFieldHandler
14
+ from keyword_generation .handlers .override_subkeyword import OverrideSubkeywordHandler
15
+ from keyword_generation .handlers .rename_property import RenamePropertyHandler
16
+ from keyword_generation .handlers .reorder_card import ReorderCardHandler
17
+ from keyword_generation .handlers .replace_card import ReplaceCardHandler
11
18
from keyword_generation .handlers .series_card import SeriesCardHandler
12
19
from keyword_generation .handlers .shared_field import SharedFieldHandler
20
+ from keyword_generation .handlers .skip_card import SkipCardHandler
13
21
from keyword_generation .handlers .table_card import TableCardHandler
14
22
from keyword_generation .handlers .table_card_group import TableCardGroupHandler
15
- from keyword_generation .handlers .override_field import OverrideFieldHandler
16
- from keyword_generation .handlers .rename_property import RenamePropertyHandler
17
- from keyword_generation .handlers .conditional_card import ConditionalCardHandler
18
- from keyword_generation .handlers .add_option import AddOptionHandler
19
- from keyword_generation .handlers .override_subkeyword import OverrideSubkeywordHandler
20
- from keyword_generation .handlers .skip_card import SkipCardHandler
21
- from keyword_generation .handlers .insert_card import InsertCardHandler
22
- from keyword_generation .handlers .replace_card import ReplaceCardHandler
23
- from keyword_generation .handlers .card_set import CardSetHandler
24
- from keyword_generation .handlers .reorder_card import ReorderCardHandler
25
-
26
- from keyword_generation .utils import fix_keyword , get_license_header , get_classname , handle_single_word_keyword
23
+ from keyword_generation .utils import fix_keyword , get_classname , get_license_header , handle_single_word_keyword
27
24
28
25
29
26
def _get_source_keyword (keyword , settings ):
@@ -273,6 +270,51 @@ def _handle_keyword_data(kwd_data, settings):
273
270
_after_handle (kwd_data )
274
271
275
272
273
+ def _add_define_transform_link_data (link_data : typing .List [typing .Dict ], link_fields : typing .List [str ]):
274
+ transform_link_data = {
275
+ "classname" : "DefineTransformation" ,
276
+ "modulename" : "define_transformation" ,
277
+ "keyword_type" : "DEFINE" ,
278
+ "keyword_subtype" : "TRANSFORMATION" ,
279
+ "fields" : link_fields ,
280
+ "linkid" : "tranid" ,
281
+ }
282
+ link_data .append (transform_link_data )
283
+
284
+
285
+ class LinkIdentity :
286
+ DEFINE_TRANSFORMATION = 40
287
+
288
+
289
+ def _get_links (kwd_data ) -> typing .Optional [typing .Dict ]:
290
+ links = {LinkIdentity .DEFINE_TRANSFORMATION : []}
291
+ has_link = False
292
+ for card in kwd_data ["cards" ]:
293
+ for field in _get_fields (card ):
294
+ if "link" not in field :
295
+ continue
296
+ link = field ["link" ]
297
+ if link not in links .keys ():
298
+ continue
299
+ has_link = True
300
+ links [link ].append (field ["name" ])
301
+ if not has_link :
302
+ return None
303
+ return links
304
+
305
+
306
+ def _add_links (kwd_data ):
307
+ """Add "links", or properties that link one keyword to another."""
308
+ links = _get_links (kwd_data )
309
+ if links is None :
310
+ return
311
+ link_data = []
312
+ for link_type , link_fields in links .items ():
313
+ if link_type == LinkIdentity .DEFINE_TRANSFORMATION :
314
+ _add_define_transform_link_data (link_data , link_fields )
315
+ kwd_data ["links" ] = link_data
316
+
317
+
276
318
def _get_keyword_data (keyword_name , keyword , settings ):
277
319
"""Gets the keyword data dict from kwdm. Transforms it
278
320
based on the generation settings that are passed in, if any,
@@ -288,6 +330,8 @@ def _get_keyword_data(keyword_name, keyword, settings):
288
330
289
331
# default transformations to a valid format we need for jinja
290
332
_transform_data (kwd_data )
333
+
334
+ _add_links (kwd_data )
291
335
return kwd_data
292
336
293
337
@@ -314,8 +358,12 @@ def generate_class(env: Environment, lib_path: str, item: typing.Dict) -> None:
314
358
keyword = item ["name" ]
315
359
fixed_keyword = fix_keyword (keyword )
316
360
classname = item ["options" ].get ("classname" , get_classname (fixed_keyword ))
317
- base_variable = _get_base_variable (classname , keyword , item ["options" ])
318
- jinja_variable = _get_jinja_variable (base_variable )
319
- filename = os .path .join (lib_path , "auto" , fixed_keyword .lower () + ".py" )
320
- with open (filename , "w" , encoding = "utf-8" ) as f :
321
- f .write (env .get_template ("keyword.j2" ).render (** jinja_variable ))
361
+ try :
362
+ base_variable = _get_base_variable (classname , keyword , item ["options" ])
363
+ jinja_variable = _get_jinja_variable (base_variable )
364
+ filename = os .path .join (lib_path , "auto" , fixed_keyword .lower () + ".py" )
365
+ with open (filename , "w" , encoding = "utf-8" ) as f :
366
+ f .write (env .get_template ("keyword.j2" ).render (** jinja_variable ))
367
+ except Exception as e :
368
+ print (f"Failure in generating { classname } " )
369
+ raise e
0 commit comments