"""Glue for the "black" library. """ import sys from pkg_resources import parse_version import os try: import toml except ImportError: toml = None from elpy.rpc import Fault BLACK_NOT_SUPPORTED = sys.version_info < (3, 6) try: if BLACK_NOT_SUPPORTED: black = None else: import black except ImportError: # pragma: no cover black = None def fix_code(code, directory): """Formats Python code to conform to the PEP 8 style guide. """ if not black: raise Fault("black not installed", code=400) # Get black config from pyproject.toml line_length = black.DEFAULT_LINE_LENGTH string_normalization = True pyproject_path = os.path.join(directory, "pyproject.toml") if toml is not None and os.path.exists(pyproject_path): pyproject_config = toml.load(pyproject_path) black_config = pyproject_config.get("tool", {}).get("black", {}) if "line-length" in black_config: line_length = black_config["line-length"] if "skip-string-normalization" in black_config: string_normalization = not black_config["skip-string-normalization"] try: if parse_version(black.__version__) < parse_version("19.0"): reformatted_source = black.format_file_contents( src_contents=code, line_length=line_length, fast=False) else: fm = black.FileMode( line_length=line_length, string_normalization=string_normalization) reformatted_source = black.format_file_contents( src_contents=code, fast=False, mode=fm) return reformatted_source except black.NothingChanged: return code except Exception as e: raise Fault("Error during formatting: {}".format(e), code=400)