"""distutils.pypircProvides the PyPIRCCommand class, the base class for the command classesthat uses .pypirc in the distutils.command package."""import osfrom configparser import RawConfigParserfrom distutils.cmd import CommandDEFAULT_PYPIRC = """\[distutils]index-servers =pypi[pypi]username:%spassword:%s"""class PyPIRCCommand(Command):"""Base command that knows how to handle the .pypirc file"""DEFAULT_REPOSITORY = 'https://upload.pypi.org/legacy/'DEFAULT_REALM = 'pypi'repository = Nonerealm = Noneuser_options = [('repository=', 'r',"url of repository [default: %s]" % \DEFAULT_REPOSITORY),('show-response', None,'display full response text from server')]boolean_options = ['show-response']def _get_rc_file(self):"""Returns rc file path."""return os.path.join(os.path.expanduser('~'), '.pypirc')def _store_pypirc(self, username, password):"""Creates a default .pypirc file."""rc = self._get_rc_file()with os.fdopen(os.open(rc, os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f:f.write(DEFAULT_PYPIRC % (username, password))def _read_pypirc(self):"""Reads the .pypirc file."""rc = self._get_rc_file()if os.path.exists(rc):self.announce('Using PyPI login from %s' % rc)repository = self.repository or self.DEFAULT_REPOSITORYconfig = RawConfigParser()config.read(rc)sections = config.sections()if 'distutils' in sections:# let's get the list of serversindex_servers = config.get('distutils', 'index-servers')_servers = [server.strip() for server inindex_servers.split('\n')if server.strip() != '']if _servers == []:# nothing set, let's try to get the default pypiif 'pypi' in sections:_servers = ['pypi']else:# the file is not properly defined, returning# an empty dictreturn {}for server in _servers:current = {'server': server}current['username'] = config.get(server, 'username')# optional paramsfor key, default in (('repository',self.DEFAULT_REPOSITORY),('realm', self.DEFAULT_REALM),('password', None)):if config.has_option(server, key):current[key] = config.get(server, key)else:current[key] = default# work around people having "repository" for the "pypi"# section of their config set to the HTTP (rather than# HTTPS) URLif (server == 'pypi' andrepository in (self.DEFAULT_REPOSITORY, 'pypi')):current['repository'] = self.DEFAULT_REPOSITORYreturn currentif (current['server'] == repository orcurrent['repository'] == repository):return currentelif 'server-login' in sections:# old formatserver = 'server-login'if config.has_option(server, 'repository'):repository = config.get(server, 'repository')else:repository = self.DEFAULT_REPOSITORYreturn {'username': config.get(server, 'username'),'password': config.get(server, 'password'),'repository': repository,'server': server,'realm': self.DEFAULT_REALM}return {}def _read_pypi_response(self, response):"""Read and decode a PyPI HTTP response."""import cgicontent_type = response.getheader('content-type', 'text/plain')encoding = cgi.parse_header(content_type)[1].get('charset', 'ascii')return response.read().decode(encoding)def initialize_options(self):"""Initialize options."""self.repository = Noneself.realm = Noneself.show_response = 0def finalize_options(self):"""Finalizes options."""if self.repository is None:self.repository = self.DEFAULT_REPOSITORYif self.realm is None:self.realm = self.DEFAULT_REALM
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。