third_party.pylibs.pylint.src/pylint/config/__init__.py
Pierre Sassoulas 9e0baf370a Simplify hard to maintain copyright notice
git is the source of truth for the copyright, copyrite (the tool)
was taking exponentially longer with each release, and it's
polluting the code with sometime as much as 50 lines of names.
2022-03-24 13:06:15 +01:00

114 lines
4.0 KiB
Python

# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/graphs/contributors
import os
import pathlib
import pickle
import sys
from datetime import datetime
from pylint.config.configuration_mixin import ConfigurationMixIn
from pylint.config.find_default_config_files import (
find_default_config_files,
find_pylintrc,
)
from pylint.config.man_help_formatter import _ManHelpFormatter
from pylint.config.option import Option
from pylint.config.option_manager_mixin import OptionsManagerMixIn
from pylint.config.option_parser import OptionParser
from pylint.config.options_provider_mixin import OptionsProviderMixIn, UnsupportedAction
from pylint.constants import DEFAULT_PYLINT_HOME, OLD_DEFAULT_PYLINT_HOME
from pylint.utils import LinterStats
__all__ = [
"ConfigurationMixIn",
"find_default_config_files",
"_ManHelpFormatter",
"Option",
"OptionsManagerMixIn",
"OptionParser",
"OptionsProviderMixIn",
"UnsupportedAction",
]
USER_HOME = os.path.expanduser("~")
if "PYLINTHOME" in os.environ:
PYLINT_HOME = os.environ["PYLINTHOME"]
if USER_HOME == "~":
USER_HOME = os.path.dirname(PYLINT_HOME)
elif USER_HOME == "~":
PYLINT_HOME = OLD_DEFAULT_PYLINT_HOME
else:
PYLINT_HOME = DEFAULT_PYLINT_HOME
# The spam prevention is due to pylint being used in parallel by
# pre-commit, and the message being spammy in this context
# Also if you work with old version of pylint that recreate the
# old pylint home, you can get the old message for a long time.
prefix_spam_prevention = "pylint_warned_about_old_cache_already"
spam_prevention_file = os.path.join(
PYLINT_HOME,
datetime.now().strftime(prefix_spam_prevention + "_%Y-%m-%d.temp"),
)
old_home = os.path.join(USER_HOME, OLD_DEFAULT_PYLINT_HOME)
if os.path.exists(old_home) and not os.path.exists(spam_prevention_file):
print(
f"PYLINTHOME is now '{PYLINT_HOME}' but obsolescent '{old_home}' is found; "
"you can safely remove the latter",
file=sys.stderr,
)
# Remove old spam prevention file
if os.path.exists(PYLINT_HOME):
for filename in os.listdir(PYLINT_HOME):
if prefix_spam_prevention in filename:
try:
os.remove(os.path.join(PYLINT_HOME, filename))
except OSError:
pass
# Create spam prevention file for today
try:
pathlib.Path(PYLINT_HOME).mkdir(parents=True, exist_ok=True)
with open(spam_prevention_file, "w", encoding="utf8") as f:
f.write("")
except Exception: # pylint: disable=broad-except
# Can't write in PYLINT_HOME ?
print(
"Can't write the file that was supposed to "
f"prevent pylint.d deprecation spam in {PYLINT_HOME}."
)
def _get_pdata_path(base_name, recurs):
base_name = base_name.replace(os.sep, "_")
return os.path.join(PYLINT_HOME, f"{base_name}{recurs}.stats")
def load_results(base):
data_file = _get_pdata_path(base, 1)
try:
with open(data_file, "rb") as stream:
data = pickle.load(stream)
if not isinstance(data, LinterStats):
raise TypeError
return data
except Exception: # pylint: disable=broad-except
return None
def save_results(results, base):
if not os.path.exists(PYLINT_HOME):
try:
os.makedirs(PYLINT_HOME)
except OSError:
print(f"Unable to create directory {PYLINT_HOME}", file=sys.stderr)
data_file = _get_pdata_path(base, 1)
try:
with open(data_file, "wb") as stream:
pickle.dump(results, stream)
except OSError as ex:
print(f"Unable to create file {data_file}: {ex}", file=sys.stderr)
PYLINTRC = find_pylintrc()