@@ -143,14 +143,22 @@ def rule_exists(text):
143143 return match .rule .identifier
144144
145145
146- def all_rule_tokens ():
146+ def all_rule_by_tokens ():
147147 """
148- Return a set of tuples of tokens, one corresponding to every existing and
149- added rules. Used to avoid duplicates.
148+ Return a mapping of { tuples of tokens: rule id}, with one item for each
149+ existing and added rules. Used to avoid duplicates.
150150 """
151- rule_tokens = set ()
151+ rule_tokens = {}
152152 for rule in models .get_rules ():
153- rule_tokens .add (tuple (rule .tokens ()))
153+ try :
154+ rule_tokens [tuple (rule .tokens ())] = rule .identifier
155+ except Exception as e :
156+ df = (' file://' + rule .data_file )
157+ tf = (' file://' + rule .text_file )
158+ raise Exception (
159+ f'Failed to to get tokens from rule:: { rule .identifier } \n '
160+ f'{ df } \n { tf } '
161+ ) from e
154162 return rule_tokens
155163
156164
@@ -185,7 +193,7 @@ def cli(licenses_file):
185193 """
186194
187195 rules_data = load_data (licenses_file )
188- rules_tokens = all_rule_tokens ()
196+ rule_by_tokens = all_rule_by_tokens ()
189197
190198 licenses_by_key = cache .get_licenses_db ()
191199 skinny_rules = []
@@ -205,10 +213,6 @@ def cli(licenses_file):
205213
206214 print ()
207215 for rule in skinny_rules :
208- existing = rule_exists (rule .text ())
209- if existing :
210- print ('Skipping existing rule:' , existing , 'with text:\n ' , rule .text ()[:50 ].strip (), '...' )
211- continue
212216
213217 if rule .is_false_positive :
214218 base_name = 'false-positive'
@@ -217,6 +221,21 @@ def cli(licenses_file):
217221 else :
218222 base_name = rule .license_expression
219223
224+ text = rule .text ()
225+
226+ existing_rule = rule_exists (text )
227+ skinny_text = ' ' .join (text [:80 ].split ())
228+
229+ existing_msg = (
230+ f'Skipping rule for: { base_name !r} , '
231+ 'dupe of: {existing_rule} '
232+ f'with text: { skinny_text !r} ...'
233+ )
234+
235+ if existing_rule :
236+ print (existing_msg .format (** locals ()))
237+ continue
238+
220239 base_loc = find_rule_base_loc (base_name )
221240
222241 rd = rule .to_dict ()
@@ -234,17 +253,20 @@ def cli(licenses_file):
234253
235254 rule_tokens = tuple (rulerec .tokens ())
236255
237- if rule_tokens in rules_tokens :
238- print ('Skipping already added rule with text for:' , base_name )
256+ existing_rule = rule_by_tokens .get (rule_tokens )
257+ if existing_rule :
258+ print (existing_msg .format (** locals ()))
259+ continue
239260 else :
240- print ('Adding new rule:' )
261+ print (f 'Adding new rule: { base_name } ' )
241262 print (' file://' + rulerec .data_file )
242263 print (' file://' + rulerec .text_file ,)
243- rules_tokens .add (rule_tokens )
244264 rulerec .dump ()
245265 models .update_ignorables (rulerec , verbose = False )
246266 rulerec .dump ()
247267
268+ rule_by_tokens [rule_tokens ] = base_name
269+
248270
249271if __name__ == '__main__' :
250272 cli ()
0 commit comments