"""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)
|