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