33import inflection
44
55from .dynamic_typing import MetaData , SingleType
6+ from .utils import distinct_words
67
78try :
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
0 commit comments