1"""distutils.pypirc 2 3Provides the PyPIRCCommand class, the base class for the command classes 4that uses .pypirc in the distutils.command package. 5""" 6import os 7from ConfigParser import ConfigParser 8 9from distutils.cmd import Command 10 11DEFAULT_PYPIRC = """\ 12[distutils] 13index-servers = 14 pypi 15 16[pypi] 17username:%s 18password:%s 19""" 20 21class PyPIRCCommand(Command): 22 """Base command that knows how to handle the .pypirc file 23 """ 24 DEFAULT_REPOSITORY = 'http://pypi.python.org/pypi' 25 DEFAULT_REALM = 'pypi' 26 repository = None 27 realm = None 28 29 user_options = [ 30 ('repository=', 'r', 31 "url of repository [default: %s]" % \ 32 DEFAULT_REPOSITORY), 33 ('show-response', None, 34 'display full response text from server')] 35 36 boolean_options = ['show-response'] 37 38 def _get_rc_file(self): 39 """Returns rc file path.""" 40 return os.path.join(os.path.expanduser('~'), '.pypirc') 41 42 def _store_pypirc(self, username, password): 43 """Creates a default .pypirc file.""" 44 rc = self._get_rc_file() 45 f = open(rc, 'w') 46 try: 47 f.write(DEFAULT_PYPIRC % (username, password)) 48 finally: 49 f.close() 50 try: 51 os.chmod(rc, 0600) 52 except OSError: 53 # should do something better here 54 pass 55 56 def _read_pypirc(self): 57 """Reads the .pypirc file.""" 58 rc = self._get_rc_file() 59 if os.path.exists(rc): 60 self.announce('Using PyPI login from %s' % rc) 61 repository = self.repository or self.DEFAULT_REPOSITORY 62 config = ConfigParser() 63 config.read(rc) 64 sections = config.sections() 65 if 'distutils' in sections: 66 # let's get the list of servers 67 index_servers = config.get('distutils', 'index-servers') 68 _servers = [server.strip() for server in 69 index_servers.split('\n') 70 if server.strip() != ''] 71 if _servers == []: 72 # nothing set, let's try to get the default pypi 73 if 'pypi' in sections: 74 _servers = ['pypi'] 75 else: 76 # the file is not properly defined, returning 77 # an empty dict 78 return {} 79 for server in _servers: 80 current = {'server': server} 81 current['username'] = config.get(server, 'username') 82 83 # optional params 84 for key, default in (('repository', 85 self.DEFAULT_REPOSITORY), 86 ('realm', self.DEFAULT_REALM), 87 ('password', None)): 88 if config.has_option(server, key): 89 current[key] = config.get(server, key) 90 else: 91 current[key] = default 92 if (current['server'] == repository or 93 current['repository'] == repository): 94 return current 95 elif 'server-login' in sections: 96 # old format 97 server = 'server-login' 98 if config.has_option(server, 'repository'): 99 repository = config.get(server, 'repository') 100 else: 101 repository = self.DEFAULT_REPOSITORY 102 return {'username': config.get(server, 'username'), 103 'password': config.get(server, 'password'), 104 'repository': repository, 105 'server': server, 106 'realm': self.DEFAULT_REALM} 107 108 return {} 109 110 def initialize_options(self): 111 """Initialize options.""" 112 self.repository = None 113 self.realm = None 114 self.show_response = 0 115 116 def finalize_options(self): 117 """Finalizes options.""" 118 if self.repository is None: 119 self.repository = self.DEFAULT_REPOSITORY 120 if self.realm is None: 121 self.realm = self.DEFAULT_REALM 122