10
10
import distutils .cmd
11
11
import distutils .dist
12
12
import itertools
13
+
14
+
13
15
from collections import defaultdict
16
+ from email import message_from_file
17
+
14
18
from distutils .errors import (
15
19
DistutilsOptionError , DistutilsPlatformError , DistutilsSetupError ,
16
20
)
@@ -39,35 +43,103 @@ def _get_unpatched(cls):
39
43
return get_unpatched (cls )
40
44
41
45
42
- def get_metadata_version (dist_md ):
43
- if dist_md .long_description_content_type or dist_md .provides_extras :
44
- return StrictVersion ('2.1' )
45
- elif (dist_md .maintainer is not None or
46
- dist_md .maintainer_email is not None or
47
- getattr (dist_md , 'python_requires' , None ) is not None ):
48
- return StrictVersion ('1.2' )
49
- elif (dist_md .provides or dist_md .requires or dist_md .obsoletes or
50
- dist_md .classifiers or dist_md .download_url ):
51
- return StrictVersion ('1.1' )
46
+ def get_metadata_version (self ):
47
+ mv = getattr (self , 'metadata_version' , None )
48
+
49
+ if mv is None :
50
+ if self .long_description_content_type or self .provides_extras :
51
+ mv = StrictVersion ('2.1' )
52
+ elif (self .maintainer is not None or
53
+ self .maintainer_email is not None or
54
+ getattr (self , 'python_requires' , None ) is not None ):
55
+ mv = StrictVersion ('1.2' )
56
+ elif (self .provides or self .requires or self .obsoletes or
57
+ self .classifiers or self .download_url ):
58
+ mv = StrictVersion ('1.1' )
59
+ else :
60
+ mv = StrictVersion ('1.0' )
61
+
62
+ self .metadata_version = mv
63
+
64
+ return mv
65
+
66
+
67
+ def read_pkg_file (self , file ):
68
+ """Reads the metadata values from a file object."""
69
+ msg = message_from_file (file )
70
+
71
+ def _read_field (name ):
72
+ value = msg [name ]
73
+ if value == 'UNKNOWN' :
74
+ return None
75
+ return value
76
+
77
+ def _read_list (name ):
78
+ values = msg .get_all (name , None )
79
+ if values == []:
80
+ return None
81
+ return values
82
+
83
+ self .metadata_version = StrictVersion (msg ['metadata-version' ])
84
+ self .name = _read_field ('name' )
85
+ self .version = _read_field ('version' )
86
+ self .description = _read_field ('summary' )
87
+ # we are filling author only.
88
+ self .author = _read_field ('author' )
89
+ self .maintainer = None
90
+ self .author_email = _read_field ('author-email' )
91
+ self .maintainer_email = None
92
+ self .url = _read_field ('home-page' )
93
+ self .license = _read_field ('license' )
94
+
95
+ if 'download-url' in msg :
96
+ self .download_url = _read_field ('download-url' )
97
+ else :
98
+ self .download_url = None
99
+
100
+ self .long_description = _read_field ('description' )
101
+ self .description = _read_field ('summary' )
52
102
53
- return StrictVersion ('1.0' )
103
+ if 'keywords' in msg :
104
+ self .keywords = _read_field ('keywords' ).split (',' )
105
+
106
+ self .platforms = _read_list ('platform' )
107
+ self .classifiers = _read_list ('classifier' )
108
+
109
+ # PEP 314 - these fields only exist in 1.1
110
+ if self .metadata_version == StrictVersion ('1.1' ):
111
+ self .requires = _read_list ('requires' )
112
+ self .provides = _read_list ('provides' )
113
+ self .obsoletes = _read_list ('obsoletes' )
114
+ else :
115
+ self .requires = None
116
+ self .provides = None
117
+ self .obsoletes = None
54
118
55
119
56
120
# Based on Python 3.5 version
57
121
def write_pkg_file (self , file ):
58
122
"""Write the PKG-INFO format data to a file object.
59
123
"""
60
- version = get_metadata_version (self )
124
+ version = self .get_metadata_version ()
125
+
126
+ if six .PY2 :
127
+ def write_field (key , value ):
128
+ file .write ("%s: %s\n " % (key , self ._encode_field (value )))
129
+ else :
130
+ def write_field (key , value ):
131
+ file .write ("%s: %s\n " % (key , value ))
132
+
61
133
62
- file . write ('Metadata-Version: %s \n ' % version )
63
- file . write ('Name: %s \n ' % self .get_name ())
64
- file . write ('Version: %s \n ' % self .get_version ())
65
- file . write ('Summary: %s \n ' % self .get_description ())
66
- file . write ('Home-page: %s \n ' % self .get_url ())
134
+ write_field ('Metadata-Version' , str ( version ) )
135
+ write_field ('Name' , self .get_name ())
136
+ write_field ('Version' , self .get_version ())
137
+ write_field ('Summary' , self .get_description ())
138
+ write_field ('Home-page' , self .get_url ())
67
139
68
140
if version < StrictVersion ('1.2' ):
69
- file . write ('Author: %s \n ' % self .get_contact ())
70
- file . write ('Author-email: %s \n ' % self .get_contact_email ())
141
+ write_field ('Author:' , self .get_contact ())
142
+ write_field ('Author-email:' , self .get_contact_email ())
71
143
else :
72
144
optional_fields = (
73
145
('Author' , 'author' ),
@@ -78,28 +150,26 @@ def write_pkg_file(self, file):
78
150
79
151
for field , attr in optional_fields :
80
152
attr_val = getattr (self , attr )
81
- if six .PY2 :
82
- attr_val = self ._encode_field (attr_val )
83
153
84
154
if attr_val is not None :
85
- file . write ( '%s: %s \n ' % ( field , attr_val ) )
155
+ write_field ( field , attr_val )
86
156
87
- file . write ('License: %s \n ' % self .get_license ())
157
+ write_field ('License' , self .get_license ())
88
158
if self .download_url :
89
- file . write ('Download-URL: %s \n ' % self .download_url )
159
+ write_field ('Download-URL' , self .download_url )
90
160
for project_url in self .project_urls .items ():
91
- file . write ('Project-URL: %s, %s\n ' % project_url )
161
+ write_field ('Project-URL' , ' %s, %s' % project_url )
92
162
93
163
long_desc = rfc822_escape (self .get_long_description ())
94
- file . write ('Description: %s \n ' % long_desc )
164
+ write_field ('Description' , long_desc )
95
165
96
166
keywords = ',' .join (self .get_keywords ())
97
167
if keywords :
98
- file . write ('Keywords: %s \n ' % keywords )
168
+ write_field ('Keywords' , keywords )
99
169
100
170
if version >= StrictVersion ('1.2' ):
101
171
for platform in self .get_platforms ():
102
- file . write ('Platform: %s \n ' % platform )
172
+ write_field ('Platform' , platform )
103
173
else :
104
174
self ._write_list (file , 'Platform' , self .get_platforms ())
105
175
@@ -112,17 +182,17 @@ def write_pkg_file(self, file):
112
182
113
183
# Setuptools specific for PEP 345
114
184
if hasattr (self , 'python_requires' ):
115
- file . write ('Requires-Python: %s \n ' % self .python_requires )
185
+ write_field ('Requires-Python' , self .python_requires )
116
186
117
187
# PEP 566
118
188
if self .long_description_content_type :
119
- file . write (
120
- 'Description-Content-Type: %s \n ' %
189
+ write_field (
190
+ 'Description-Content-Type' ,
121
191
self .long_description_content_type
122
192
)
123
193
if self .provides_extras :
124
194
for extra in self .provides_extras :
125
- file . write ('Provides-Extra: %s \n ' % extra )
195
+ write_field ('Provides-Extra' , extra )
126
196
127
197
128
198
sequence = tuple , list
0 commit comments