diff --git a/ansiblelater/__main__.py b/ansiblelater/__main__.py index 63a71e1..f02402d 100755 --- a/ansiblelater/__main__.py +++ b/ansiblelater/__main__.py @@ -59,9 +59,7 @@ def main(): "-q", dest="logging.level", action="append_const", const=1, help="decrease log level" ) parser.add_argument("rules.files", nargs="*") - parser.add_argument( - "-V", "--version", action="version", version="%(prog)s {}".format(__version__) - ) + parser.add_argument("-V", "--version", action="version", version=f"%(prog)s {__version__}") args = parser.parse_args().__dict__ @@ -78,16 +76,16 @@ def main(): candidate = Candidate.classify(filename, settings) if candidate: if candidate.binary: - LOG.info("Not reviewing binary file {name}".format(name=filename)) + LOG.info(f"Not reviewing binary file {filename}") continue if candidate.vault: - LOG.info("Not reviewing vault file {name}".format(name=filename)) + LOG.info(f"Not reviewing vault file {filename}") continue else: - LOG.info("Reviewing all of {candidate}".format(candidate=candidate)) + LOG.info(f"Reviewing all of {candidate}") tasks.append(candidate) else: - LOG.info("Couldn't classify file {name}".format(name=filename)) + LOG.info(f"Couldn't classify file {filename}") errors = (sum(p.map(_review_wrapper, tasks))) p.close() diff --git a/ansiblelater/candidate.py b/ansiblelater/candidate.py index d4c4ce0..f78fb9e 100644 --- a/ansiblelater/candidate.py +++ b/ansiblelater/candidate.py @@ -41,6 +41,7 @@ class Candidate(object): self.binary = True def _get_version(self): + name = type(self).__name__ path = self.path version = None config_version = self.config["rules"]["version"].strip() @@ -73,25 +74,17 @@ class Candidate(object): if self.expected_version: if isinstance(self, RoleFile): LOG.warning( - "{name} {path} is in a role that contains a meta/main.yml without a " - "declared standards version. " - "Using latest standards version {version}".format( - name=type(self).__name__, path=self.path, version=version - ) + f"{name} {path} is in a role that contains a " + "meta/main.yml without a declared standards version. " + f"Using latest standards version {version}" ) else: LOG.warning( - "{name} {path} does not present standards version. " - "Using latest standards version {version}".format( - name=type(self).__name__, path=self.path, version=version - ) + f"{name} {path} does not present standards version. " + f"Using latest standards version {version}" ) else: - LOG.info( - "{name} {path} declares standards version {version}".format( - name=type(self).__name__, path=self.path, version=version - ) - ) + LOG.info(f"{name} {path} declares standards version {version}") return version @@ -122,9 +115,7 @@ class Candidate(object): if not result: LOG.error( - "Standard '{id}' returns an empty result object. Check failed!".format( - id=standard.sid - ) + f"Standard '{standard.sid}' returns an empty result object. Check failed!" ) continue @@ -141,36 +132,26 @@ class Candidate(object): for err in result.errors: err_labels = copy.copy(labels) err_labels["passed"] = False + + sid = self._format_id(standard.sid) + path = self.path + description = standard.description + if isinstance(err, StandardBase.Error): err_labels.update(err.to_dict()) if not standard.version: LOG.warning( - "{sid}Best practice '{description}' not met:\n{path}:{error}".format( - sid=self._format_id(standard.sid), - description=standard.description, - path=self.path, - error=err - ), + f"{sid}Best practice '{description}' not met:\n{path}:{err}", extra=flag_extra(err_labels) ) elif LooseVersion(standard.version) > LooseVersion(self.version): LOG.warning( - "{sid}Future standard '{description}' not met:\n{path}:{error}".format( - sid=self._format_id(standard.sid), - description=standard.description, - path=self.path, - error=err - ), + f"{sid}Future standard '{description}' not met:\n{path}:{err}", extra=flag_extra(err_labels) ) else: - msg = "{sid}Standard '{description}' not met:\n{path}:{error}".format( - sid=self._format_id(standard.sid), - description=standard.description, - path=self.path, - error=err - ) + msg = f"{sid}Standard '{description}' not met:\n{path}:{err}" if standard.sid not in self.config["rules"]["warning_filter"]: LOG.error(msg, extra=flag_extra(err_labels)) @@ -222,13 +203,14 @@ class Candidate(object): return None def _format_id(self, standard_id): - if standard_id and standard_id.strip(): - standard_id = "[{id}] ".format(id=standard_id.strip()) + sid = standard_id.strip() + if sid: + standard_id = f"[{sid}] " return standard_id def __repr__(self): # noqa - return "{name} ({path})".format(name=type(self).__name__, path=self.path) + return f"{type(self).__name__} ({self.path})" def __getitem__(self, item): # noqa return self.__dict__.get(item) diff --git a/ansiblelater/exceptions.py b/ansiblelater/exceptions.py index 07fbe16..027048b 100644 --- a/ansiblelater/exceptions.py +++ b/ansiblelater/exceptions.py @@ -8,7 +8,7 @@ class LaterError(Exception): def __init__(self, msg, original): """Initialize new exception.""" - super(LaterError, self).__init__("{msg}: {org}".format(msg=msg, org=original)) + super(LaterError, self).__init__(f"{msg}: {original}") self.original = original diff --git a/ansiblelater/logger.py b/ansiblelater/logger.py index a37c58c..71350e9 100644 --- a/ansiblelater/logger.py +++ b/ansiblelater/logger.py @@ -61,7 +61,7 @@ class MultilineFormatter(logging.Formatter): """Logging Formatter to reset color after newline characters.""" def format(self, record): # noqa - record.msg = record.msg.replace("\n", "\n{}... ".format(colorama.Style.RESET_ALL)) + record.msg = record.msg.replace("\n", f"\n{colorama.Style.RESET_ALL}... ") record.msg = record.msg + "\n" return logging.Formatter.format(self, record) @@ -185,4 +185,4 @@ def color_text(color, msg): """ msg = msg.format(colorama.Style.BRIGHT, colorama.Style.NORMAL) - return "{}{}{}".format(color, msg, colorama.Style.RESET_ALL) + return f"{color}{msg}{colorama.Style.RESET_ALL}" diff --git a/ansiblelater/rules/CheckMetaChangeFromDefault.py b/ansiblelater/rules/CheckMetaChangeFromDefault.py index 0b9c60f..2f9f599 100644 --- a/ansiblelater/rules/CheckMetaChangeFromDefault.py +++ b/ansiblelater/rules/CheckMetaChangeFromDefault.py @@ -24,7 +24,7 @@ class CheckMetaChangeFromDefault(StandardBase): if not errors: for field, default in field_defaults: - pair = "{field}: {default}".format(field=field, default=default) + pair = f"{field}: {default}" lookup = nested_lookup(field, content) if lookup and default in nested_lookup(field, content): errors.append(self.Error(None, self.helptext.format(field=pair))) diff --git a/ansiblelater/rules/CheckRelativeRolePaths.py b/ansiblelater/rules/CheckRelativeRolePaths.py index 399a6b9..01ad66f 100644 --- a/ansiblelater/rules/CheckRelativeRolePaths.py +++ b/ansiblelater/rules/CheckRelativeRolePaths.py @@ -26,7 +26,7 @@ class CheckRelativeRolePaths(StandardBase): path_to_check = None if module in module_to_path_folder and "src" in task["action"]: - path_to_check = "../{}".format(module_to_path_folder[module]) + path_to_check = f"../{module_to_path_folder[module]}" if path_to_check and path_to_check in task["action"]["src"]: errors.append(self.Error(task["__line__"], self.helptext)) diff --git a/ansiblelater/rules/CheckYamlColons.py b/ansiblelater/rules/CheckYamlColons.py index 0d1513f..8d48f8d 100644 --- a/ansiblelater/rules/CheckYamlColons.py +++ b/ansiblelater/rules/CheckYamlColons.py @@ -9,7 +9,7 @@ class CheckYamlColons(StandardBase): types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"] def check(self, candidate, settings): - options = "rules: {{colons: {conf}}}".format(conf=settings["yamllint"]["colons"]) + options = f"rules: {{colons: {settings['yamllint']['colons']}}}" errors = self.run_yamllint(candidate, options) return self.Result(candidate.path, errors) diff --git a/ansiblelater/rules/CheckYamlDocumentEnd.py b/ansiblelater/rules/CheckYamlDocumentEnd.py index 2b280cf..c8de70d 100644 --- a/ansiblelater/rules/CheckYamlDocumentEnd.py +++ b/ansiblelater/rules/CheckYamlDocumentEnd.py @@ -9,9 +9,7 @@ class CheckYamlDocumentEnd(StandardBase): types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"] def check(self, candidate, settings): - options = "rules: {{document-end: {conf}}}".format( - conf=settings["yamllint"]["document-end"] - ) + options = f"rules: {{document-end: {settings['yamllint']['document-end']}}}" errors = self.run_yamllint(candidate, options) return self.Result(candidate.path, errors) diff --git a/ansiblelater/rules/CheckYamlDocumentStart.py b/ansiblelater/rules/CheckYamlDocumentStart.py index 86ed72e..89383ac 100644 --- a/ansiblelater/rules/CheckYamlDocumentStart.py +++ b/ansiblelater/rules/CheckYamlDocumentStart.py @@ -9,9 +9,7 @@ class CheckYamlDocumentStart(StandardBase): types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"] def check(self, candidate, settings): - options = "rules: {{document-start: {conf}}}".format( - conf=settings["yamllint"]["document-start"] - ) + options = f"rules: {{document-start: {settings['yamllint']['document-start']}}}" errors = self.run_yamllint(candidate, options) return self.Result(candidate.path, errors) diff --git a/ansiblelater/rules/CheckYamlEmptyLines.py b/ansiblelater/rules/CheckYamlEmptyLines.py index 9ff1f41..4a9504d 100644 --- a/ansiblelater/rules/CheckYamlEmptyLines.py +++ b/ansiblelater/rules/CheckYamlEmptyLines.py @@ -9,7 +9,7 @@ class CheckYamlEmptyLines(StandardBase): types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"] def check(self, candidate, settings): - options = "rules: {{empty-lines: {conf}}}".format(conf=settings["yamllint"]["empty-lines"]) + options = f"rules: {{empty-lines: {settings['yamllint']['empty-lines']}}}" errors = self.run_yamllint(candidate, options) return self.Result(candidate.path, errors) diff --git a/ansiblelater/rules/CheckYamlHyphens.py b/ansiblelater/rules/CheckYamlHyphens.py index 9b65de7..679bf74 100644 --- a/ansiblelater/rules/CheckYamlHyphens.py +++ b/ansiblelater/rules/CheckYamlHyphens.py @@ -9,7 +9,7 @@ class CheckYamlHyphens(StandardBase): types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"] def check(self, candidate, settings): - options = "rules: {{hyphens: {conf}}}".format(conf=settings["yamllint"]["hyphens"]) + options = f"rules: {{hyphens: {settings['yamllint']['hyphens']}}}" errors = self.run_yamllint(candidate, options) return self.Result(candidate.path, errors) diff --git a/ansiblelater/rules/CheckYamlIndent.py b/ansiblelater/rules/CheckYamlIndent.py index e5f7618..79bf15e 100644 --- a/ansiblelater/rules/CheckYamlIndent.py +++ b/ansiblelater/rules/CheckYamlIndent.py @@ -9,9 +9,7 @@ class CheckYamlIndent(StandardBase): types = ["playbook", "task", "handler", "rolevars", "hostvars", "groupvars", "meta"] def check(self, candidate, settings): - options = "rules: {{document-start: {conf}}}".format( - conf=settings["yamllint"]["document-start"] - ) + options = f"rules: {{document-start: {settings['yamllint']['document-start']}}}" errors = self.run_yamllint(candidate, options) return self.Result(candidate.path, errors) diff --git a/ansiblelater/settings.py b/ansiblelater/settings.py index b81a2a6..3b8a192 100644 --- a/ansiblelater/settings.py +++ b/ansiblelater/settings.py @@ -188,18 +188,16 @@ class Settings(object): anyconfig.validate(config, self.schema, ac_schema_safe=False) return True except jsonschema.exceptions.ValidationError as e: - schema_error = ( - "Error while loading configuration:\n" - "Failed validating '{validator}' at {path}" - ).format( - validator=e.validator, - path=format_as_index( - list(e.absolute_path)[0], - list(e.absolute_path)[1:], - ) + validator = e.validator + path = format_as_index( + list(e.absolute_path)[0], + list(e.absolute_path)[1:], ) + msg = e.message + utils.sysexit_with_message( - "{schema}: {msg}".format(schema=schema_error, msg=e.message) + "Error while loading configuration:\n" + f"Failed validating '{validator}' at {path}: {msg}" ) def _update_filelist(self): diff --git a/ansiblelater/standard.py b/ansiblelater/standard.py index f94aa30..34682cf 100644 --- a/ansiblelater/standard.py +++ b/ansiblelater/standard.py @@ -56,9 +56,7 @@ class StandardBase(object, metaclass=StandardExtendedMeta): pass def __repr__(self): # noqa - return "Standard: {description} (version: {version}, types: {types})".format( - description=self.description, version=self.version, types=self.types - ) + return f"Standard: {self.description} (version: {self.version}, types: {self.types})" @staticmethod def get_tasks(candidate, settings): @@ -72,15 +70,11 @@ class StandardBase(object, metaclass=StandardExtendedMeta): except LaterError as ex: e = ex.original errors.append( - StandardBase.Error( - e.problem_mark.line + 1, "syntax error: {msg}".format(msg=e.problem) - ) + StandardBase.Error(e.problem_mark.line + 1, f"syntax error: {e.problem}") ) candidate.faulty = True except LaterAnsibleError as e: - errors.append( - StandardBase.Error(e.line, "syntax error: {msg}".format(msg=e.message)) - ) + errors.append(StandardBase.Error(e.line, f"syntax error: {e.message}")) candidate.faulty = True return yamllines, errors @@ -100,13 +94,11 @@ class StandardBase(object, metaclass=StandardExtendedMeta): except LaterError as ex: e = ex.original errors.append( - StandardBase.Error( - e.problem_mark.line + 1, "syntax error: {msg}".format(msg=e.problem) - ) + StandardBase.Error(e.problem_mark.line + 1, f"syntax error: {e.problem}") ) candidate.faulty = True except LaterAnsibleError as e: - errors.append(StandardBase.Error(e.line, "syntax error: {}".format(e.message))) + errors.append(StandardBase.Error(e.line, f"syntax error: {e.message}")) candidate.faulty = True return tasks, errors @@ -124,15 +116,11 @@ class StandardBase(object, metaclass=StandardExtendedMeta): except LaterError as ex: e = ex.original errors.append( - StandardBase.Error( - e.problem_mark.line + 1, "syntax error: {msg}".format(msg=e.problem) - ) + StandardBase.Error(e.problem_mark.line + 1, f"syntax error: {e.problem}") ) candidate.faulty = True except LaterAnsibleError as e: - errors.append( - StandardBase.Error(e.line, "syntax error: {msg}".format(msg=e.message)) - ) + errors.append(StandardBase.Error(e.line, f"syntax error: {e.message}")) candidate.faulty = True return normalized, errors @@ -172,15 +160,11 @@ class StandardBase(object, metaclass=StandardExtendedMeta): except LaterError as ex: e = ex.original errors.append( - StandardBase.Error( - e.problem_mark.line + 1, "syntax error: {msg}".format(msg=e.problem) - ) + StandardBase.Error(e.problem_mark.line + 1, f"syntax error: {e.problem}") ) candidate.faulty = True except LaterAnsibleError as e: - errors.append( - StandardBase.Error(e.line, "syntax error: {msg}".format(msg=e.message)) - ) + errors.append(StandardBase.Error(e.line, f"syntax error: {e.message}")) candidate.faulty = True return normalized, errors @@ -201,15 +185,11 @@ class StandardBase(object, metaclass=StandardExtendedMeta): except LaterError as ex: e = ex.original errors.append( - StandardBase.Error( - e.problem_mark.line + 1, "syntax error: {msg}".format(msg=e.problem) - ) + StandardBase.Error(e.problem_mark.line + 1, f"syntax error: {e.problem}") ) candidate.faulty = True except LaterAnsibleError as e: - errors.append( - StandardBase.Error(e.line, "syntax error: {msg}".format(msg=e.message)) - ) + errors.append(StandardBase.Error(e.line, f"syntax error: {e.message}")) candidate.faulty = True return yamllines, errors @@ -231,9 +211,7 @@ class StandardBase(object, metaclass=StandardExtendedMeta): content = yaml.safe_load(f) except yaml.YAMLError as e: errors.append( - StandardBase.Error( - e.problem_mark.line + 1, "syntax error: {msg}".format(msg=e.problem) - ) + StandardBase.Error(e.problem_mark.line + 1, f"syntax error: {e.problem}") ) candidate.faulty = True @@ -250,9 +228,7 @@ class StandardBase(object, metaclass=StandardExtendedMeta): errors.append(StandardBase.Error(problem.line, problem.desc)) except yaml.YAMLError as e: errors.append( - StandardBase.Error( - e.problem_mark.line + 1, "syntax error: {msg}".format(msg=e.problem) - ) + StandardBase.Error(e.problem_mark.line + 1, f"syntax error: {e.problem}") ) candidate.faulty = True @@ -288,9 +264,9 @@ class StandardBase(object, metaclass=StandardExtendedMeta): def __repr__(self): # noqa if self.lineno: - return "{no}: {msg}".format(no=self.lineno, msg=self.message) + return f"{self.lineno}: {self.message}" else: - return " {msg}".format(msg=self.message) + return f" {self.message}" def to_dict(self): result = dict(lineno=self.lineno, message=self.message) @@ -306,7 +282,7 @@ class StandardBase(object, metaclass=StandardExtendedMeta): self.errors = errors or [] def message(self): - return "\n".join(["{0}:{1}".format(self.candidate, error) for error in self.errors]) + return "\n".join([f"{self.candidate}:{error}" for error in self.errors]) class StandardLoader(): @@ -326,18 +302,14 @@ class StandardLoader(): try: spec.loader.exec_module(module) except (ImportError, NameError) as e: - sysexit_with_message( - "Failed to load roles file {module}: \n {msg}".format( - msg=str(e), module=filename - ) - ) + sysexit_with_message(f"Failed to load roles file {filename}: \n {str(e)}") try: for name, obj in inspect.getmembers(module): if self._is_plugin(obj): self.rules.append(obj()) except TypeError as e: - sysexit_with_message("Failed to load roles file: \n {msg}".format(msg=str(e))) + sysexit_with_message(f"Failed to load roles file: \n {str(e)}") self.validate() diff --git a/ansiblelater/test/unit/test_logger.py b/ansiblelater/test/unit/test_logger.py index c1b30e8..bb83c22 100644 --- a/ansiblelater/test/unit/test_logger.py +++ b/ansiblelater/test/unit/test_logger.py @@ -22,10 +22,8 @@ def test_critical(capsys, mocker): _, stderr = capsys.readouterr() print( - "{}{}CRITICAL:{} foo\n{}".format( - colorama.Fore.RED, colorama.Style.BRIGHT, colorama.Style.NORMAL, - colorama.Style.RESET_ALL - ) + f"{colorama.Fore.RED}{colorama.Style.BRIGHT}CRITICAL:{colorama.Style.NORMAL} foo\n" + f"{colorama.Style.RESET_ALL}" ) x, _ = capsys.readouterr() @@ -38,10 +36,8 @@ def test_error(capsys, mocker): _, stderr = capsys.readouterr() print( - "{}{}ERROR:{} foo\n{}".format( - colorama.Fore.RED, colorama.Style.BRIGHT, colorama.Style.NORMAL, - colorama.Style.RESET_ALL - ) + f"{colorama.Fore.RED}{colorama.Style.BRIGHT}ERROR:{colorama.Style.NORMAL} foo\n" + f"{colorama.Style.RESET_ALL}" ) x, _ = capsys.readouterr() @@ -54,10 +50,8 @@ def test_warn(capsys, mocker): stdout, _ = capsys.readouterr() print( - "{}{}WARNING:{} foo\n{}".format( - colorama.Fore.YELLOW, colorama.Style.BRIGHT, colorama.Style.NORMAL, - colorama.Style.RESET_ALL - ) + f"{colorama.Fore.YELLOW}{colorama.Style.BRIGHT}WARNING:{colorama.Style.NORMAL} foo\n" + f"{colorama.Style.RESET_ALL}" ) x, _ = capsys.readouterr() @@ -70,10 +64,8 @@ def test_info(capsys, mocker): stdout, _ = capsys.readouterr() print( - "{}{}INFO:{} foo\n{}".format( - colorama.Fore.BLUE, colorama.Style.BRIGHT, colorama.Style.NORMAL, - colorama.Style.RESET_ALL - ) + f"{colorama.Fore.BLUE}{colorama.Style.BRIGHT}INFO:{colorama.Style.NORMAL} foo\n" + f"{colorama.Style.RESET_ALL}" ) x, _ = capsys.readouterr() diff --git a/ansiblelater/utils/__init__.py b/ansiblelater/utils/__init__.py index 2a71dec..ba1e505 100644 --- a/ansiblelater/utils/__init__.py +++ b/ansiblelater/utils/__init__.py @@ -41,7 +41,7 @@ def get_property(prop): currentdir = os.path.dirname(os.path.realpath(__file__)) parentdir = os.path.dirname(currentdir) result = re.search( - r'{}\s*=\s*[\'"]([^\'"]*)[\'"]'.format(prop), + rf'{prop}\s*=\s*[\'"]([^\'"]*)[\'"]', open(os.path.join(parentdir, "__init__.py")).read() ) return result.group(1) diff --git a/ansiblelater/utils/yamlhelper.py b/ansiblelater/utils/yamlhelper.py index c560b31..7ffe946 100644 --- a/ansiblelater/utils/yamlhelper.py +++ b/ansiblelater/utils/yamlhelper.py @@ -248,7 +248,7 @@ def play_children(basedir, item, parent_type, playbook_dir): def _include_children(basedir, k, v, parent_type): # handle include: filename.yml tags=blah - (command, args, kwargs) = tokenize("{0}: {1}".format(k, v)) + (command, args, kwargs) = tokenize(f"{k}: {v}") result = path_dwim(basedir, args[0]) if not os.path.exists(result) and not basedir.endswith("tasks"): @@ -317,10 +317,7 @@ def _roles_children(basedir, k, v, parent_type, main="main"): ) ) else: - raise SystemExit( - "role dict {0} does not contain a 'role' " - "or 'name' key".format(role) - ) + raise SystemExit(f"role dict {role} does not contain a 'role' or 'name' key") else: results.extend(_look_for_role_files(basedir, role, main=main)) return results @@ -497,9 +494,7 @@ def extract_from_list(blocks, candidates): results.extend(add_action_type(block[candidate], candidate, meta_data)) elif block[candidate] is not None: raise RuntimeError( - "Key '{candidate}' defined, but bad value: '{block}'".format( - candidate=candidate, block=str(block[candidate]) - ) + f"Key '{candidate}' defined, but bad value: '{str(block[candidate])}'" ) return results @@ -551,7 +546,7 @@ def parse_yaml_linenumbers(data, filename): except (yaml.parser.ParserError, yaml.scanner.ScannerError) as e: raise LaterError("syntax error", e) except (yaml.composer.ComposerError) as e: - e.problem = "{} {}".format(e.context, e.problem) + e.problem = f"{e.context} {e.problem}" raise LaterError("syntax error", e) return data