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