| """distutils.pypirc | 
 |  | 
 | Provides the PyPIRCCommand class, the base class for the command classes | 
 | that uses .pypirc in the distutils.command package. | 
 | """ | 
 | import os | 
 | from configparser import ConfigParser | 
 |  | 
 | from distutils.cmd import Command | 
 |  | 
 | DEFAULT_PYPIRC = """\ | 
 | [distutils] | 
 | index-servers = | 
 |     pypi | 
 |  | 
 | [pypi] | 
 | username:%s | 
 | password:%s | 
 | """ | 
 |  | 
 | class PyPIRCCommand(Command): | 
 |     """Base command that knows how to handle the .pypirc file | 
 |     """ | 
 |     DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi' | 
 |     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 | 
 |             realm = self.realm or self.DEFAULT_REALM | 
 |  | 
 |             config = ConfigParser() | 
 |             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 |