- Notifications
You must be signed in to change notification settings - Fork 31.7k
/
Copy pathconfig.py
130 lines (112 loc) · 4.71 KB
/
config.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
"""distutils.pypirc
Provides the PyPIRCCommand class, the base class for the command classes
that uses .pypirc in the distutils.command package.
"""
importos
fromconfigparserimportRawConfigParser
fromdistutils.cmdimportCommand
DEFAULT_PYPIRC="""\
[distutils]
index-servers =
pypi
[pypi]
username:%s
password:%s
"""
classPyPIRCCommand(Command):
"""Base command that knows how to handle the .pypirc file
"""
DEFAULT_REPOSITORY='https://upload.pypi.org/legacy/'
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."""
returnos.path.join(os.path.expanduser('~'), '.pypirc')
def_store_pypirc(self, username, password):
"""Creates a default .pypirc file."""
rc=self._get_rc_file()
withos.fdopen(os.open(rc, os.O_CREAT|os.O_WRONLY, 0o600), 'w') asf:
f.write(DEFAULT_PYPIRC% (username, password))
def_read_pypirc(self):
"""Reads the .pypirc file."""
rc=self._get_rc_file()
ifos.path.exists(rc):
self.announce('Using PyPI login from %s'%rc)
repository=self.repositoryorself.DEFAULT_REPOSITORY
config=RawConfigParser()
config.read(rc)
sections=config.sections()
if'distutils'insections:
# let's get the list of servers
index_servers=config.get('distutils', 'index-servers')
_servers= [server.strip() forserverin
index_servers.split('\n')
ifserver.strip() !='']
if_servers== []:
# nothing set, let's try to get the default pypi
if'pypi'insections:
_servers= ['pypi']
else:
# the file is not properly defined, returning
# an empty dict
return {}
forserverin_servers:
current= {'server': server}
current['username'] =config.get(server, 'username')
# optional params
forkey, defaultin (('repository',
self.DEFAULT_REPOSITORY),
('realm', self.DEFAULT_REALM),
('password', None)):
ifconfig.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
repositoryin (self.DEFAULT_REPOSITORY, 'pypi')):
current['repository'] =self.DEFAULT_REPOSITORY
returncurrent
if (current['server'] ==repositoryor
current['repository'] ==repository):
returncurrent
elif'server-login'insections:
# old format
server='server-login'
ifconfig.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."""
importcgi
content_type=response.getheader('content-type', 'text/plain')
encoding=cgi.parse_header(content_type)[1].get('charset', 'ascii')
returnresponse.read().decode(encoding)
definitialize_options(self):
"""Initialize options."""
self.repository=None
self.realm=None
self.show_response=0
deffinalize_options(self):
"""Finalizes options."""
ifself.repositoryisNone:
self.repository=self.DEFAULT_REPOSITORY
ifself.realmisNone:
self.realm=self.DEFAULT_REALM