Path: blob/main/test/lib/python3.9/site-packages/setuptools/_distutils/config.py
4799 views
"""distutils.pypirc12Provides the PyPIRCCommand class, the base class for the command classes3that uses .pypirc in the distutils.command package.4"""5import os6from configparser import RawConfigParser78from distutils.cmd import Command910DEFAULT_PYPIRC = """\11[distutils]12index-servers =13pypi1415[pypi]16username:%s17password:%s18"""1920class PyPIRCCommand(Command):21"""Base command that knows how to handle the .pypirc file22"""23DEFAULT_REPOSITORY = 'https://upload.pypi.org/legacy/'24DEFAULT_REALM = 'pypi'25repository = None26realm = None2728user_options = [29('repository=', 'r',30"url of repository [default: %s]" % \31DEFAULT_REPOSITORY),32('show-response', None,33'display full response text from server')]3435boolean_options = ['show-response']3637def _get_rc_file(self):38"""Returns rc file path."""39return os.path.join(os.path.expanduser('~'), '.pypirc')4041def _store_pypirc(self, username, password):42"""Creates a default .pypirc file."""43rc = self._get_rc_file()44with os.fdopen(os.open(rc, os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f:45f.write(DEFAULT_PYPIRC % (username, password))4647def _read_pypirc(self):48"""Reads the .pypirc file."""49rc = self._get_rc_file()50if os.path.exists(rc):51self.announce('Using PyPI login from %s' % rc)52repository = self.repository or self.DEFAULT_REPOSITORY5354config = RawConfigParser()55config.read(rc)56sections = config.sections()57if 'distutils' in sections:58# let's get the list of servers59index_servers = config.get('distutils', 'index-servers')60_servers = [server.strip() for server in61index_servers.split('\n')62if server.strip() != '']63if _servers == []:64# nothing set, let's try to get the default pypi65if 'pypi' in sections:66_servers = ['pypi']67else:68# the file is not properly defined, returning69# an empty dict70return {}71for server in _servers:72current = {'server': server}73current['username'] = config.get(server, 'username')7475# optional params76for key, default in (('repository',77self.DEFAULT_REPOSITORY),78('realm', self.DEFAULT_REALM),79('password', None)):80if config.has_option(server, key):81current[key] = config.get(server, key)82else:83current[key] = default8485# work around people having "repository" for the "pypi"86# section of their config set to the HTTP (rather than87# HTTPS) URL88if (server == 'pypi' and89repository in (self.DEFAULT_REPOSITORY, 'pypi')):90current['repository'] = self.DEFAULT_REPOSITORY91return current9293if (current['server'] == repository or94current['repository'] == repository):95return current96elif 'server-login' in sections:97# old format98server = 'server-login'99if config.has_option(server, 'repository'):100repository = config.get(server, 'repository')101else:102repository = self.DEFAULT_REPOSITORY103return {'username': config.get(server, 'username'),104'password': config.get(server, 'password'),105'repository': repository,106'server': server,107'realm': self.DEFAULT_REALM}108109return {}110111def _read_pypi_response(self, response):112"""Read and decode a PyPI HTTP response."""113import cgi114content_type = response.getheader('content-type', 'text/plain')115encoding = cgi.parse_header(content_type)[1].get('charset', 'ascii')116return response.read().decode(encoding)117118def initialize_options(self):119"""Initialize options."""120self.repository = None121self.realm = None122self.show_response = 0123124def finalize_options(self):125"""Finalizes options."""126if self.repository is None:127self.repository = self.DEFAULT_REPOSITORY128if self.realm is None:129self.realm = self.DEFAULT_REALM130131132