| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | """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 = None    realm = None    user_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_REPOSITORY            config = RawConfigParser()            config.read(rc)            sections = config.sections()            if 'distutils' in sections:                # let's get the list of servers                index_servers = config.get('distutils', 'index-servers')                _servers = [server.strip() for server in                            index_servers.split('\n')                            if server.strip() != '']                if _servers == []:                    # nothing set, let's try to get the default pypi                    if 'pypi' in sections:                        _servers = ['pypi']                    else:                        # the file is not properly defined, returning                        # an empty dict                        return {}                for server in _servers:                    current = {'server': server}                    current['username'] = config.get(server, 'username')                    # optional params                    for 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) URL                    if (server == 'pypi' and                        repository in (self.DEFAULT_REPOSITORY, 'pypi')):                        current['repository'] = self.DEFAULT_REPOSITORY                        return current                    if (current['server'] == repository or                        current['repository'] == repository):                        return current            elif 'server-login' in sections:                # old format                server = 'server-login'                if config.has_option(server, 'repository'):                    repository = config.get(server, 'repository')                else:                    repository = self.DEFAULT_REPOSITORY                return {'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 cgi        content_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 = None        self.realm = None        self.show_response = 0    def finalize_options(self):        """Finalizes options."""        if self.repository is None:            self.repository = self.DEFAULT_REPOSITORY        if self.realm is None:            self.realm = self.DEFAULT_REALM
 |