def setUp(self): rulesdir = os.path.join('lib', 'ansiblelint', 'rules') self.rules = RulesCollection.create_from_directory(rulesdir) # make dir and write role tasks to import or include self.play_root = tempfile.mkdtemp() with open(os.path.join(self.play_root, 'imported_playbook.yml'), 'w') as f_main: f_main.write(IMPORTED_PLAYBOOK)
def ansiblelint(rulename, candidate, settings): result = Result(candidate.path) rules = RulesCollection() rules.extend(RulesCollection.create_from_directory(default_rulesdir)) if settings.lintdir: rules.extend(RulesCollection.create_from_directory(settings.lintdir)) fileinfo = dict(path=candidate.path, type=candidate.filetype) matches = rules.run(fileinfo, rulename.split(',')) result.errors = [Error(match.linenumber, "[%s] %s" % (match.rule.id, match.message)) for match in matches] return result
def setUp(self): rulesdir = os.path.join('lib', 'ansiblelint', 'rules') self.rules = RulesCollection.create_from_directory(rulesdir) # make dir and write role tasks to import or include self.play_root = tempfile.mkdtemp() role_path = os.path.join(self.play_root, 'test-role', 'tasks') os.makedirs(role_path) with open(os.path.join(role_path, 'main.yml'), 'w') as f_main: f_main.write(ROLE_TASKS_MAIN) with open(os.path.join(role_path, 'world.yml'), 'w') as f_world: f_world.write(ROLE_TASKS_WORLD)
def setUp(self): rulesdir = os.path.join("lib", "ansiblelint", "rules") self.rules = RulesCollection.create_from_directory(rulesdir)
def main(): formatter = formatters.Formatter() parser = optparse.OptionParser("%prog [options] playbook.yml [playbook2 ...]", version="%prog " + __version__) parser.add_option('-L', dest='listrules', default=False, action='store_true', help="list all the rules") parser.add_option('-q', dest='quiet', default=False, action='store_true', help="quieter, although not silent output") parser.add_option('-p', dest='parseable', default=False, action='store_true', help="parseable output in the format of pep8") parser.add_option('--parseable-severity', dest='parseable_severity', default=False, action='store_true', help="parseable output including severity of rule") parser.add_option('-r', action='append', dest='rulesdir', default=[], type='str', help="specify one or more rules directories using " "one or more -r arguments. Any -r flags override " "the default rules in %s, unless -R is also used." % ansiblelint.default_rulesdir) parser.add_option('-R', action='store_true', default=False, dest='use_default_rules', help="Use default rules in %s in addition to any extra " "rules directories specified with -r. There is " "no need to specify this if no -r flags are used" % ansiblelint.default_rulesdir) parser.add_option('-t', dest='tags', action='append', default=[], help="only check rules whose id/tags match these values") parser.add_option('-T', dest='listtags', action='store_true', help="list all the tags") parser.add_option('-v', dest='verbosity', action='count', help="Increase verbosity level", default=0) parser.add_option('-x', dest='skip_list', default=[], action='append', help="only check rules whose id/tags do not " + "match these values") parser.add_option('--nocolor', dest='colored', default=hasattr(sys.stdout, 'isatty') and sys.stdout.isatty(), action='store_false', help="disable colored output") parser.add_option('--force-color', dest='colored', action='store_true', help="Try force colored output (relying on ansible's code)") parser.add_option('--exclude', dest='exclude_paths', action='append', help='path to directories or files to skip. This option' ' is repeatable.', default=[]) parser.add_option('-c', help='Specify configuration file to use. Defaults to ".ansible-lint"') options, args = parser.parse_args(sys.argv[1:]) config = load_config(options.c) if config: if 'quiet' in config: options.quiet = options.quiet or config['quiet'] if 'parseable' in config: options.parseable = options.parseable or config['parseable'] if 'parseable_severity' in config: options.parseable_severity = options.parseable_severity or \ config['parseable_severity'] if 'use_default_rules' in config: options.use_default_rules = options.use_default_rules or config['use_default_rules'] if 'verbosity' in config: options.verbosity = options.verbosity + config['verbosity'] if 'exclude_paths' in config: options.exclude_paths = options.exclude_paths + config['exclude_paths'] if 'rulesdir' in config: options.rulesdir = options.rulesdir + config['rulesdir'] if 'skip_list' in config: options.skip_list = options.skip_list + config['skip_list'] if 'tags' in config: options.tags = options.tags + config['tags'] if options.quiet: formatter = formatters.QuietFormatter() if options.parseable: formatter = formatters.ParseableFormatter() if options.parseable_severity: formatter = formatters.ParseableSeverityFormatter() if len(args) == 0 and not (options.listrules or options.listtags): parser.print_help(file=sys.stderr) return 1 if options.use_default_rules: rulesdirs = options.rulesdir + [ansiblelint.default_rulesdir] else: rulesdirs = options.rulesdir or [ansiblelint.default_rulesdir] rules = RulesCollection() for rulesdir in rulesdirs: rules.extend(RulesCollection.create_from_directory(rulesdir)) if options.listrules: print(rules) return 0 if options.listtags: print(rules.listtags()) return 0 if isinstance(options.tags, six.string_types): options.tags = options.tags.split(',') skip = set() for s in options.skip_list: skip.update(str(s).split(',')) options.skip_list = frozenset(skip) playbooks = set(args) matches = list() checked_files = set() for playbook in playbooks: runner = ansiblelint.Runner(rules, playbook, options.tags, options.skip_list, options.exclude_paths, options.verbosity, checked_files) matches.extend(runner.run()) matches.sort(key=lambda x: (x.filename, x.linenumber, x.rule.id)) for match in matches: print(formatter.format(match, options.colored)) if len(matches): return 2 else: return 0
def test_no_duplicate_rule_ids(self): real_rules = RulesCollection.create_from_directory('./lib/ansiblelint/rules') rule_ids = [ rule.id for rule in real_rules ] self.assertEqual([x for x, y in collections.Counter(rule_ids).items() if y > 1], [])
def test_rules_collection(): return RulesCollection([os.path.abspath('./test/rules')])
def test_snake_case_rule(self): RulesCollection.create_from_directory('./test/snake_case_rule')
def main(): cwd = pathlib.Path.cwd() options, args = cli.get_config(sys.argv[1:]) formatter_factory = formatters.Formatter if options.quiet: formatter_factory = formatters.QuietFormatter if options.parseable: formatter_factory = formatters.ParseableFormatter if options.parseable_severity: formatter_factory = formatters.ParseableSeverityFormatter formatter = formatter_factory(cwd, options.display_relative_path) # no args triggers auto-detection mode if len(args) == 0 and not (options.listrules or options.listtags): cli.print_help(file=sys.stderr) return 1 if options.use_default_rules: rulesdirs = options.rulesdir + [default_rulesdir] else: rulesdirs = options.rulesdir or [default_rulesdir] rules = RulesCollection(rulesdirs) if options.listrules: print(rules) return 0 if options.listtags: print(rules.listtags()) return 0 if isinstance(options.tags, str): options.tags = options.tags.split(',') skip = set() for s in options.skip_list: skip.update(str(s).split(',')) options.skip_list = frozenset(skip) playbooks = sorted(set(args)) matches = list() checked_files = set() for playbook in playbooks: runner = Runner(rules, playbook, options.tags, options.skip_list, options.exclude_paths, options.verbosity, checked_files) matches.extend(runner.run()) matches.sort(key=lambda x: (normpath(x.filename), x.linenumber, x.rule.id)) for match in matches: print(formatter.format(match, options.colored)) if len(matches): return 2 else: return 0
def main(): formatter = formatters.Formatter() parser = optparse.OptionParser("%prog [options] [playbook.yml [playbook2 ...]]", version="%prog " + __version__) parser.add_option('-L', dest='listrules', default=False, action='store_true', help="list all the rules") parser.add_option('-q', dest='quiet', default=False, action='store_true', help="quieter, although not silent output") parser.add_option('-p', dest='parseable', default=False, action='store_true', help="parseable output in the format of pep8") parser.add_option('--parseable-json', dest='parseable_json', default=False, action='store_true', help="parseable output in JSON format") parser.add_option('--parseable-severity', dest='parseable_severity', default=False, action='store_true', help="parseable output including severity of rule") parser.add_option('-r', action='append', dest='rulesdir', default=[], type='str', help="specify one or more rules directories using " "one or more -r arguments. Any -r flags override " "the default rules in %s, unless -R is also used." % default_rulesdir) parser.add_option('-R', action='store_true', default=False, dest='use_default_rules', help="Use default rules in %s in addition to any extra " "rules directories specified with -r. There is " "no need to specify this if no -r flags are used" % default_rulesdir) parser.add_option('-t', dest='tags', action='append', default=[], help="only check rules whose id/tags match these values") parser.add_option('-T', dest='listtags', action='store_true', help="list all the tags") parser.add_option('-v', dest='verbosity', action='count', help="Increase verbosity level", default=0) parser.add_option('-x', dest='skip_list', default=[], action='append', help="only check rules whose id/tags do not " + "match these values") parser.add_option('--nocolor', dest='colored', default=hasattr(sys.stdout, 'isatty') and sys.stdout.isatty(), action='store_false', help="disable colored output") parser.add_option('--force-color', dest='colored', action='store_true', help="Try force colored output (relying on ansible's code)") parser.add_option('--exclude', dest='exclude_paths', action='append', help='path to directories or files to skip. This option' ' is repeatable.', default=[]) parser.add_option('-c', help='Specify configuration file to use. Defaults to ".ansible-lint"') options, args = parser.parse_args(sys.argv[1:]) config = load_config(options.c) if config: if 'quiet' in config: options.quiet = options.quiet or config['quiet'] if 'parseable' in config: options.parseable = options.parseable or config['parseable'] if 'parseable_json' in config: options.parseable_json = options.parseable_json or \ config['parseable_json'] if 'parseable_severity' in config: options.parseable_severity = options.parseable_severity or \ config['parseable_severity'] if 'use_default_rules' in config: options.use_default_rules = options.use_default_rules or config['use_default_rules'] if 'verbosity' in config: options.verbosity = options.verbosity + config['verbosity'] options.exclude_paths.extend( config.get('exclude_paths', [])) if 'rulesdir' in config: options.rulesdir = options.rulesdir + config['rulesdir'] if 'skip_list' in config: options.skip_list = options.skip_list + config['skip_list'] if 'tags' in config: options.tags = options.tags + config['tags'] if options.quiet: formatter = formatters.QuietFormatter() if options.parseable: formatter = formatters.ParseableFormatter() if options.parseable_severity: formatter = formatters.ParseableSeverityFormatter() # no args triggers auto-detection mode if len(args) == 0 and not (options.listrules or options.listtags): args = get_playbooks_and_roles(options=options) if options.use_default_rules: rulesdirs = options.rulesdir + [default_rulesdir] else: rulesdirs = options.rulesdir or [default_rulesdir] rules = RulesCollection() for rulesdir in rulesdirs: rules.extend(RulesCollection.create_from_directory(rulesdir)) if options.listrules: print(rules) return 0 if options.listtags: print(rules.listtags()) return 0 if isinstance(options.tags, six.string_types): options.tags = options.tags.split(',') skip = set() for s in options.skip_list: skip.update(str(s).split(',')) options.skip_list = frozenset(skip) playbooks = sorted(set(args)) matches = list() checked_files = set() for playbook in playbooks: runner = Runner(rules, playbook, options.tags, options.skip_list, options.exclude_paths, options.verbosity, checked_files) matches.extend(runner.run()) matches.sort(key=lambda x: (normpath(x.filename), x.linenumber, x.rule.id)) if options.parseable_json: formatter = formatters.ParseableJsonFormatter() formatter.format(matches) else: for match in matches: print(formatter.format(match, options.colored)) if len(matches): return 2 else: return 0
def main(): """Linter CLI entry point.""" cwd = pathlib.Path.cwd() options = cli.get_config(sys.argv[1:]) initialize_logger(options.verbosity) _logger.debug("Options: %s", options) formatter_factory = formatters.Formatter if options.quiet: formatter_factory = formatters.QuietFormatter if options.parseable: formatter_factory = formatters.ParseableFormatter if options.parseable_severity: formatter_factory = formatters.ParseableSeverityFormatter formatter = formatter_factory(cwd, options.display_relative_path) if options.use_default_rules: rulesdirs = options.rulesdir + [default_rulesdir] else: rulesdirs = options.rulesdir or [default_rulesdir] rules = RulesCollection(rulesdirs) if options.listrules: formatted_rules = rules if options.format == 'plain' else rules_as_rst( rules) print(formatted_rules) return 0 if options.listtags: print(rules.listtags()) return 0 if isinstance(options.tags, str): options.tags = options.tags.split(',') skip = set() for s in options.skip_list: skip.update(str(s).split(',')) options.skip_list = frozenset(skip) if not options.playbook: # no args triggers auto-detection mode playbooks = get_playbooks_and_roles(options=options) else: playbooks = sorted(set(options.playbook)) matches = list() checked_files = set() for playbook in playbooks: runner = Runner(rules, playbook, options.tags, options.skip_list, options.exclude_paths, options.verbosity, checked_files) matches.extend(runner.run()) matches.sort(key=lambda x: (normpath(x.filename), x.linenumber, x.rule.id)) for match in matches: print(formatter.format(match, options.colored)) if len(matches): return 2 else: return 0
def setUp(self): self.rules = RulesCollection.create_from_directory('./test/rules')
def test_no_duplicate_rule_ids(test_rules_collection): real_rules = RulesCollection([os.path.abspath('./lib/ansiblelint/rules')]) rule_ids = [rule.id for rule in real_rules] assert not any(y > 1 for y in collections.Counter(rule_ids).values())
def setUp(self): self.collection.extend( RulesCollection.create_from_directory(default_rulesdir) )
def main(): formatter = formatters.Formatter() parser = optparse.OptionParser("%prog playbook.yml", version="%prog " + __version__) parser.add_option('-L', dest='listrules', default=False, action='store_true', help="list all the rules") parser.add_option('-q', dest='quiet', default=False, action='store_true', help="quieter, although not silent output") parser.add_option('-p', dest='parseable', default=False, action='store_true', help="parseable output in the format of pep8") parser.add_option('-r', action='append', dest='rulesdir', default=[], type='str', help="specify one or more rules directories using " "one or more -r arguments. Any -r flags override " "the default rules in %s, unless -R is also used." % ansiblelint.default_rulesdir) parser.add_option('-R', action='store_true', default=False, dest='use_default_rules', help="Use default rules in %s in addition to any extra " "rules directories specified with -r. There is " "no need to specify this if no -r flags are used" % ansiblelint.default_rulesdir) parser.add_option('-t', dest='tags', default=[], help="only check rules whose id/tags match these values") parser.add_option('-T', dest='listtags', action='store_true', help="list all the tags") parser.add_option('-v', dest='verbosity', action='count', help="Increase verbosity level", default=0) parser.add_option('-x', dest='skip_list', default=[], help="only check rules whose id/tags do not " + "match these values") parser.add_option('--nocolor', dest='colored', default=hasattr(sys.stdout, 'isatty') and sys.stdout.isatty(), action='store_false', help="disable colored output") parser.add_option('--force-color', dest='colored', action='store_true', help="Try force colored output (relying on ansible's code)") parser.add_option('--exclude', dest='exclude_paths', action='append', help='path to directories or files to skip. This option' ' is repeatable.') options, args = parser.parse_args(sys.argv[1:]) if options.quiet: formatter = formatters.QuietFormatter() if options.parseable: formatter = formatters.ParseableFormatter() if len(args) == 0 and not (options.listrules or options.listtags): parser.print_help(file=sys.stderr) return 1 if options.use_default_rules: rulesdirs = options.rulesdir + [ansiblelint.default_rulesdir] else: rulesdirs = options.rulesdir or [ansiblelint.default_rulesdir] rules = RulesCollection() for rulesdir in rulesdirs: rules.extend(RulesCollection.create_from_directory(rulesdir)) if options.listrules: print(rules) return 0 if options.listtags: print(rules.listtags()) return 0 if isinstance(options.tags, six.string_types): options.tags = options.tags.split(',') if isinstance(options.skip_list, six.string_types): options.skip_list = options.skip_list.split(',') playbooks = set(args) matches = list() checked_files = set() for playbook in playbooks: runner = ansiblelint.Runner(rules, playbook, options.tags, options.skip_list, options.exclude_paths, options.verbosity, checked_files) matches.extend(runner.run()) matches.sort(key=lambda x: (x.filename, x.linenumber, x.rule.id)) for match in matches: print(formatter.format(match, options.colored)) if len(matches): return 2 else: return 0
def setUp(self): self.rules = RulesCollection.create_from_directory("./test/rules")
def setUp(self): rulesdir = os.path.join('lib', 'ansiblelint', 'rules') self.rules = RulesCollection.create_from_directory(rulesdir)
def test_running_nonexistent_file_raises_ioerror(): RulesCollection().run({"path": "no_such_playbook"})