@@ -364,9 +364,12 @@ def __init__(
364364 self ,
365365 rulesdirs : list [str ] | None = None ,
366366 options : Namespace = default_options ,
367+ profile : list [str ] | None = None ,
368+ conditional : bool = True ,
367369 ) -> None :
368370 """Initialize a RulesCollection instance."""
369371 self .options = options
372+ self .profile = profile or []
370373 if rulesdirs is None :
371374 rulesdirs = []
372375 self .rulesdirs = expand_paths_vars (rulesdirs )
@@ -377,15 +380,21 @@ def __init__(
377380 [RuntimeErrorRule (), AnsibleParserErrorRule (), LoadingFailureRule ()]
378381 )
379382 for rule in load_plugins (rulesdirs ):
380- self .register (rule )
383+ self .register (rule , conditional = conditional )
381384 self .rules = sorted (self .rules )
382385
383- def register (self , obj : AnsibleLintRule ) -> None :
386+ # when we have a profile we unload some of the rules
387+ if self .profile :
388+ filter_rules_with_profile (self .rules , self .profile [0 ])
389+
390+ def register (self , obj : AnsibleLintRule , conditional : bool = False ) -> None :
384391 """Register a rule."""
385392 # We skip opt-in rules which were not manually enabled.
386393 # But we do include opt-in rules when listing all rules or tags
387394 if any (
388395 [
396+ not conditional ,
397+ self .profile , # when profile is used we load all rules and filter later
389398 "opt-in" not in obj .tags ,
390399 obj .id in self .options .enable_list ,
391400 self .options .listrules ,
@@ -497,19 +506,36 @@ def listtags(self) -> str:
497506 return result
498507
499508
500- def filter_rules_with_profile (rule_col : RulesCollection , profile : str ) -> None :
509+ def filter_rules_with_profile (rule_col : list [ BaseRule ] , profile : str ) -> None :
501510 """Unload rules that are not part of the specified profile."""
502511 included = set ()
503512 extends = profile
513+ total_rules = len (rule_col )
504514 while extends :
505515 for rule in PROFILES [extends ]["rules" ]:
516+ _logger .debug ("Activating rule `%s` due to profile `%s`" , rule , extends )
506517 included .add (rule )
507518 extends = PROFILES [extends ].get ("extends" , None )
508- for rule in list ( rule_col . rules ) :
519+ for rule in rule_col :
509520 if rule .id not in included :
510521 _logger .debug (
511522 "Unloading %s rule due to not being part of %s profile." ,
512523 rule .id ,
513524 profile ,
514525 )
515- rule_col .rules .remove (rule )
526+ rule_col .remove (rule )
527+ else :
528+ for tag in ("opt-in" , "experimental" ):
529+ if tag in rule .tags :
530+ _logger .debug (
531+ "Removing tag `%s` from `%s` rule because `%s` profile makes it mandatory." ,
532+ tag ,
533+ rule .id ,
534+ profile ,
535+ )
536+ rule .tags .remove (tag )
537+ # rule_col.rules.remove(rule)
538+ # break
539+ if "opt-in" in rule .tags :
540+ rule .tags .remove ("opt-in" )
541+ _logger .debug ("%s/%s rules included in the profile" , len (rule_col ), total_rules )
0 commit comments