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