Move config files locations inside a function (#6736)

This commit is contained in:
Xavier Fernandez 2019-07-20 22:29:24 +02:00 committed by GitHub
parent c1eb1d76ba
commit 645809944c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 59 additions and 45 deletions

View File

@ -4,9 +4,10 @@ import subprocess
from pip._internal.cli.base_command import Command from pip._internal.cli.base_command import Command
from pip._internal.cli.status_codes import ERROR, SUCCESS from pip._internal.cli.status_codes import ERROR, SUCCESS
from pip._internal.configuration import Configuration, kinds from pip._internal.configuration import (
Configuration, get_configuration_files, kinds,
)
from pip._internal.exceptions import PipError from pip._internal.exceptions import PipError
from pip._internal.locations import site_config_file
from pip._internal.utils.deprecation import deprecated from pip._internal.utils.deprecation import deprecated
from pip._internal.utils.misc import get_prog from pip._internal.utils.misc import get_prog
from pip._internal.utils.virtualenv import running_under_virtualenv from pip._internal.utils.virtualenv import running_under_virtualenv
@ -165,7 +166,10 @@ class ConfigurationCommand(Command):
if not need_value: if not need_value:
return None return None
# Default to user, unless there's a site file. # Default to user, unless there's a site file.
elif os.path.exists(site_config_file): elif any(
os.path.exists(site_config_file)
for site_config_file in get_configuration_files()[kinds.SITE]
):
return kinds.SITE return kinds.SITE
else: else:
return kinds.USER return kinds.USER

View File

@ -14,15 +14,15 @@ Some terminology:
import locale import locale
import logging import logging
import os import os
import sys
from pip._vendor.six.moves import configparser from pip._vendor.six.moves import configparser
from pip._internal.exceptions import ( from pip._internal.exceptions import (
ConfigurationError, ConfigurationFileCouldNotBeLoaded, ConfigurationError, ConfigurationFileCouldNotBeLoaded,
) )
from pip._internal.locations import ( from pip._internal.utils import appdirs
global_config_files, legacy_config_file, new_config_file, site_config_file, from pip._internal.utils.compat import WINDOWS, expanduser
)
from pip._internal.utils.misc import ensure_dir, enum from pip._internal.utils.misc import ensure_dir, enum
from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.utils.typing import MYPY_CHECK_RUNNING
@ -69,6 +69,31 @@ kinds = enum(
) )
CONFIG_BASENAME = 'pip.ini' if WINDOWS else 'pip.conf'
def get_configuration_files():
global_config_files = [
os.path.join(path, CONFIG_BASENAME)
for path in appdirs.site_config_dirs('pip')
]
site_config_file = os.path.join(sys.prefix, CONFIG_BASENAME)
legacy_config_file = os.path.join(
expanduser('~'),
'pip' if WINDOWS else '.pip',
CONFIG_BASENAME,
)
new_config_file = os.path.join(
appdirs.user_config_dir("pip"), CONFIG_BASENAME
)
return {
kinds.GLOBAL: global_config_files,
kinds.SITE: [site_config_file],
kinds.USER: [legacy_config_file, new_config_file],
}
class Configuration(object): class Configuration(object):
"""Handles management of configuration. """Handles management of configuration.
@ -355,8 +380,10 @@ class Configuration(object):
else: else:
yield kinds.ENV, [] yield kinds.ENV, []
config_files = get_configuration_files()
# at the base we have any global configuration # at the base we have any global configuration
yield kinds.GLOBAL, list(global_config_files) yield kinds.GLOBAL, config_files[kinds.GLOBAL]
# per-user configuration next # per-user configuration next
should_load_user_config = not self.isolated and not ( should_load_user_config = not self.isolated and not (
@ -364,10 +391,10 @@ class Configuration(object):
) )
if should_load_user_config: if should_load_user_config:
# The legacy config file is overridden by the new config file # The legacy config file is overridden by the new config file
yield kinds.USER, [legacy_config_file, new_config_file] yield kinds.USER, config_files[kinds.USER]
# finally virtualenv configuration first trumping others # finally virtualenv configuration first trumping others
yield kinds.SITE, [site_config_file] yield kinds.SITE, config_files[kinds.SITE]
def _get_parser_to_modify(self): def _get_parser_to_modify(self):
# type: () -> Tuple[str, RawConfigParser] # type: () -> Tuple[str, RawConfigParser]

View File

@ -11,7 +11,7 @@ from distutils import sysconfig as distutils_sysconfig
from distutils.command.install import SCHEME_KEYS # type: ignore from distutils.command.install import SCHEME_KEYS # type: ignore
from pip._internal.utils import appdirs from pip._internal.utils import appdirs
from pip._internal.utils.compat import WINDOWS, expanduser from pip._internal.utils.compat import WINDOWS
from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.utils.typing import MYPY_CHECK_RUNNING
from pip._internal.utils.virtualenv import running_under_virtualenv from pip._internal.utils.virtualenv import running_under_virtualenv
@ -56,7 +56,7 @@ try:
user_site = site.getusersitepackages() user_site = site.getusersitepackages()
except AttributeError: except AttributeError:
user_site = site.USER_SITE user_site = site.USER_SITE
user_dir = expanduser('~')
if WINDOWS: if WINDOWS:
bin_py = os.path.join(sys.prefix, 'Scripts') bin_py = os.path.join(sys.prefix, 'Scripts')
bin_user = os.path.join(user_site, 'Scripts') bin_user = os.path.join(user_site, 'Scripts')
@ -64,38 +64,15 @@ if WINDOWS:
if not os.path.exists(bin_py): if not os.path.exists(bin_py):
bin_py = os.path.join(sys.prefix, 'bin') bin_py = os.path.join(sys.prefix, 'bin')
bin_user = os.path.join(user_site, 'bin') bin_user = os.path.join(user_site, 'bin')
config_basename = 'pip.ini'
legacy_storage_dir = os.path.join(user_dir, 'pip')
legacy_config_file = os.path.join(
legacy_storage_dir,
config_basename,
)
else: else:
bin_py = os.path.join(sys.prefix, 'bin') bin_py = os.path.join(sys.prefix, 'bin')
bin_user = os.path.join(user_site, 'bin') bin_user = os.path.join(user_site, 'bin')
config_basename = 'pip.conf'
legacy_storage_dir = os.path.join(user_dir, '.pip')
legacy_config_file = os.path.join(
legacy_storage_dir,
config_basename,
)
# Forcing to use /usr/local/bin for standard macOS framework installs # Forcing to use /usr/local/bin for standard macOS framework installs
# Also log to ~/Library/Logs/ for use with the Console.app log viewer # Also log to ~/Library/Logs/ for use with the Console.app log viewer
if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/':
bin_py = '/usr/local/bin' bin_py = '/usr/local/bin'
global_config_files = [
os.path.join(path, config_basename)
for path in appdirs.site_config_dirs('pip')
]
site_config_file = os.path.join(sys.prefix, config_basename)
new_config_file = os.path.join(appdirs.user_config_dir("pip"), config_basename)
def distutils_scheme(dist_name, user=False, home=None, root=None, def distutils_scheme(dist_name, user=False, home=None, root=None,
isolated=False, prefix=None): isolated=False, prefix=None):

View File

@ -192,9 +192,9 @@ def test_options_from_venv_config(script, virtualenv):
Test if ConfigOptionParser reads a virtualenv-local config file Test if ConfigOptionParser reads a virtualenv-local config file
""" """
from pip._internal.locations import config_basename from pip._internal.configuration import CONFIG_BASENAME
conf = "[global]\nno-index = true" conf = "[global]\nno-index = true"
ini = virtualenv.location / config_basename ini = virtualenv.location / CONFIG_BASENAME
with open(ini, 'w') as f: with open(ini, 'w') as f:
f.write(conf) f.write(conf)
result = script.pip('install', '-vvv', 'INITools', expect_error=True) result = script.pip('install', '-vvv', 'INITools', expect_error=True)

View File

@ -6,11 +6,9 @@ import os
import pytest import pytest
from mock import MagicMock from mock import MagicMock
from pip._internal.configuration import get_configuration_files, kinds
from pip._internal.exceptions import ConfigurationError from pip._internal.exceptions import ConfigurationError
from pip._internal.locations import ( from tests.lib.configuration_helpers import ConfigurationMixin
global_config_files, new_config_file, site_config_file,
)
from tests.lib.configuration_helpers import ConfigurationMixin, kinds
class TestConfigurationLoading(ConfigurationMixin): class TestConfigurationLoading(ConfigurationMixin):
@ -194,7 +192,9 @@ class TestConfigurationModification(ConfigurationMixin):
# get the path to site config file # get the path to site config file
assert mymock.call_count == 1 assert mymock.call_count == 1
assert mymock.call_args[0][0] == site_config_file assert mymock.call_args[0][0] == (
get_configuration_files()[kinds.SITE][0]
)
def test_user_modification(self): def test_user_modification(self):
# get the path to local config file # get the path to local config file
@ -209,7 +209,10 @@ class TestConfigurationModification(ConfigurationMixin):
# get the path to user config file # get the path to user config file
assert mymock.call_count == 1 assert mymock.call_count == 1
assert mymock.call_args[0][0] == new_config_file assert mymock.call_args[0][0] == (
# Use new config file
get_configuration_files()[kinds.USER][1]
)
def test_global_modification(self): def test_global_modification(self):
# get the path to local config file # get the path to local config file
@ -224,4 +227,6 @@ class TestConfigurationModification(ConfigurationMixin):
# get the path to user config file # get the path to user config file
assert mymock.call_count == 1 assert mymock.call_count == 1
assert mymock.call_args[0][0] == global_config_files[-1] assert mymock.call_args[0][0] == (
get_configuration_files()[kinds.GLOBAL][-1]
)

View File

@ -384,9 +384,10 @@ class TestGeneralOptions(AddFakeCommandMixin):
class TestOptionsConfigFiles(object): class TestOptionsConfigFiles(object):
def test_venv_config_file_found(self, monkeypatch): def test_venv_config_file_found(self, monkeypatch):
# strict limit on the global_config_files list # strict limit on the global config files list
monkeypatch.setattr( monkeypatch.setattr(
pip._internal.configuration, 'global_config_files', ['/a/place'] pip._internal.utils.appdirs, 'site_config_dirs',
lambda _: ['/a/place']
) )
cp = pip._internal.configuration.Configuration(isolated=False) cp = pip._internal.configuration.Configuration(isolated=False)