zmc
2023-08-08 e792e9a60d958b93aef96050644f369feb25d61b
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
U
G=®dIŸã@s¢dZddlZddlZddlZddlZddlZddlZddlZddlZddl    Z    ddl
m Z ddl m Z ddlmZmZmZmZddlZddlmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!ddlm"Z"ddl#m$Z$dd    l%m&Z&dd
l'm(Z(dd l)m*Z*dd l+m,Z,dd l-m.Z.e/Z0e 1d¡Z2e 1dej3¡Z4e 1d¡Z5e 1dej3¡j6Z7d 8¡Z9ddddgZ:dZ;dZ<e<j=dj=ej>ŽedZ?dd„Z@dd„ZAdd„ZBdGd d„ZCdHd!d"„ZDdId#d$„ZEdedfd%d„ZFdJd&d'„ZGd(d)„ZHe 1d*ej3¡ZIeHd+d,„ƒZJGd-d.„d.ƒZKGd/d0„d0eKƒZLGd1d„deƒZMe 1d2¡jNZOd3d4„ZPd5d6„ZQdKd7d8„ZRd9d:„ZSGd;d<„d<ƒZTGd=d>„d>ejUƒZVejWjXfd?d@„ZYdAdB„ZZeRe;ƒeYƒZYdCdD„Z[dEdF„Z\dS)Lz#PyPI and direct package downloadingéN©Úwraps)Úsix)ÚurllibÚ http_clientÚ configparserÚmap) Ú CHECKOUT_DISTÚ DistributionÚ BINARY_DISTÚnormalize_pathÚ SOURCE_DISTÚ EnvironmentÚfind_distributionsÚ    safe_nameÚ safe_versionÚ to_filenameÚ RequirementÚ DEVELOP_DISTÚEGG_DIST)Ú ssl_support)Úlog)ÚDistutilsError)Ú    translate)Úget_all_headers)Úunescape)ÚWheelz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)zƒ<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)href="[^?]+\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgzÚ PackageIndexÚdistros_for_urlÚparse_bdist_wininstÚinterpret_distro_nameéz<setuptools/{setuptools.__version__} Python-urllib/{py_major}z{}.{})Zpy_majorÚ
setuptoolsc
CsDz t |¡WStk
r>}ztd|fƒ|‚W5d}~XYnXdS)Nz1Not a URL, existing file, or requirement spec: %r)rÚparseÚ
ValueErrorr)ÚspecÚe©r'úOD:\z\workplace\VsCode\pyvenv\venv\Lib\site-packages\setuptools/package_index.pyÚparse_requirement_arg5s ÿþr)cCs°| ¡}d\}}}| d¡r¦| d¡r8|dd…}d}nn| dd¡rb|d    d
…}|dd…}d}nD| d ¡r~|dd …}d }n(| dd¡r¦|d    d
…}|dd…}d }|||fS)z=Return (base,pyversion) or (None,None) for possible .exe name)NNNú.exez
.win32.exeNiöÿÿÿÚwin32z    .win32-pyiðÿÿÿiùÿÿÿéüÿÿÿz.win-amd64.exeiòÿÿÿz    win-amd64z .win-amd64-pyiìÿÿÿ)ÚlowerÚendswithÚ
startswith)Únamer-ÚbaseÚpy_verÚplatr'r'r(r>s$
 
 
 
    c    Csxtj |¡}|\}}}}}}tj | d¡d¡}|dkrX|dkrXtj | d¡d¡}d|krp| dd¡\}}||fS)Nú/éÿÿÿÿzsourceforge.netÚdownloadéþÿÿÿú#é)rr#ÚurlparseÚunquoteÚsplit)    ÚurlÚpartsÚschemeÚserverÚpathÚ
parametersÚqueryÚfragmentr1r'r'r(Úegg_info_for_urlVs rEccs\t|ƒ\}}t|||ƒD]
}|Vq|rXt |¡}|rXt|| d¡|tdD]
}|VqLdS)zEYield egg or source distribution objects that might be found at a URLr9)Ú
precedenceN)rEÚdistros_for_locationÚ EGG_FRAGMENTÚmatchr Úgroupr    )r=Úmetadatar1rDÚdistrIr'r'r(ras 
ÿ
cCsä| d¡r|dd…}| d¡r8d|kr8t |||¡gS| d¡rxd|krxt|ƒ}| ¡s^gSt||j|jtddgS| d    ¡rªt|ƒ\}}}|dk    rªt    ||||t
|ƒSt D]0}| |¡r®|dt |ƒ …}t    |||ƒSq®gS)
z:Yield egg or source distribution objects based on basenameú.egg.zipNr,z.eggú-z.whlr9)ÚlocationÚ project_nameÚversionrFr*) r.r
Ú from_locationrÚ is_compatiblerPrQrrr r Ú
EXTENSIONSÚlen)rOÚbasenamerKÚwheelZwin_baser2ÚplatformÚextr'r'r(rGos<
 û
ÿ
rGcCstt|ƒtj |¡|ƒS)zEYield possible egg or source distribution objects based on a filename)rGr ÚosrArV)ÚfilenamerKr'r'r(Údistros_for_filenames
 
ÿr\c
cs|| d¡}|s,tdd„|dd…Dƒƒr,dStdt|ƒdƒD]8}t||d |d|…¡d ||d…¡|||dVq>dS)zØGenerate alternative interpretations of a source distro name
 
    Note: if `location` is a filesystem filename, you should call
    ``pkg_resources.normalize_path()`` on it before passing it to this
    routine!
    rNcss|]}t d|¡VqdS)z    py\d\.\d$N)ÚrerI)Ú.0Úpr'r'r(Ú    <genexpr>®sz(interpret_distro_name.<locals>.<genexpr>éNr9)Ú
py_versionrFrX)r<ÚanyÚrangerUr
Újoin)rOrVrKrbrFrXr>r_r'r'r(r —s
ýccsftƒ}|j}|dkr:tj |j|¡D]}||ƒ|Vq$n(|D]"}||ƒ}||kr>||ƒ|Vq>dS)zHList unique elements, preserving order. Remember all elements ever seen.N)ÚsetÚaddrÚmovesÚ filterfalseÚ __contains__)ÚiterableÚkeyÚseenZseen_addÚelementÚkr'r'r(Úunique_everseen»s
rpcstˆƒ‡fdd„ƒ}|S)zs
    Wrap a function returning an iterable such that the resulting iterable
    only ever yields unique items.
    cstˆ||ŽƒS©N)rp)ÚargsÚkwargs©Úfuncr'r(ÚwrapperÓszunique_values.<locals>.wrapperr)rurvr'rtr(Ú unique_valuesÍsrwz(<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>c    csºt |¡D]d}| ¡\}}tttj| ¡ d¡ƒƒ}d|ksDd|kr
t     |¡D]}t
j   |t | d¡ƒ¡VqNq
dD]@}| |¡}|dkrtt     ||¡}|rtt
j   |t | d¡ƒ¡VqtdS)zEFind rel="homepage" and rel="download" links in `page`, yielding URLsú,Zhomepager6r9)z <th>Home Pagez<th>Download URLr5N)ÚRELÚfinditerÚgroupsrfrÚstrÚstripr-r<ÚHREFrr#ÚurljoinÚ
htmldecoderJÚfindÚsearch)r=ÚpagerIÚtagÚrelZrelsÚposr'r'r(Úfind_external_linksÞs 
 r‡c@s(eZdZdZdd„Zdd„Zdd„ZdS)    ÚContentCheckerzP
    A null content checker that defines the interface for checking content
    cCsdS)z3
        Feed a block of data to the hash.
        Nr'©ÚselfÚblockr'r'r(ÚfeedöszContentChecker.feedcCsdS)zC
        Check the hash. Return False if validation fails.
        Tr'©rŠr'r'r(Úis_validüszContentChecker.is_validcCsdS)zu
        Call reporter with information about the checker (hash name)
        substituted into the template.
        Nr')rŠÚreporterÚtemplater'r'r(ÚreportszContentChecker.reportN)Ú__name__Ú
__module__Ú __qualname__Ú__doc__rŒrŽr‘r'r'r'r(rˆñsrˆc@sBeZdZe d¡Zdd„Zedd„ƒZdd„Z    dd    „Z
d
d „Z d S) Ú HashCheckerzK(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=(?P<expected>[a-f0-9]+)cCs||_t |¡|_||_dSrq)Ú    hash_nameÚhashlibÚnewÚhashÚexpected)rŠr—r›r'r'r(Ú__init__s zHashChecker.__init__cCs>tj |¡d}|stƒS|j |¡}|s0tƒS|f| ¡ŽS)z5Construct a (possibly null) ContentChecker from a URLr5)rr#r:rˆÚpatternr‚Ú    groupdict)Úclsr=rDrIr'r'r(Úfrom_urls zHashChecker.from_urlcCs|j |¡dSrq)ršÚupdater‰r'r'r(rŒ szHashChecker.feedcCs|j ¡|jkSrq)ršÚ    hexdigestr›rr'r'r(rŽ#szHashChecker.is_validcCs||j}||ƒSrq)r—)rŠrrÚmsgr'r'r(r‘&s
zHashChecker.reportN) r’r“r”r]ÚcompilerrœÚ classmethodr rŒrŽr‘r'r'r'r(r–
sÿ
 
r–cs<eZdZdZdJdd„ZdKd    d
„ZdLd d „ZdMd d„Zdd„Zdd„Z    dd„Z
dd„Z dNdd„Z dd„Z dO‡fdd„    Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„ZdPd'd(„ZdQd)d*„Zd+d,„Zd-Zd.d/„Zd0d1„ZdRd2d3„Zd4d5„Zd6d7„Zd8d9„Zd:d;„Zd<d=„Ze dSd>d?„ƒZ!d@dA„Z"dBdC„Z#dDdE„Z$dFdG„Z%dHdI„Z&‡Z'S)Trz;A distribution index that scans web pages for download URLsúhttps://pypi.org/simple/©Ú*NTcOs”tj|f|ž|Ž|dd| d¡ …|_i|_i|_i|_t d     t
t |ƒ¡¡j |_ g|_|ortjor|prt ¡}|r†t |¡|_n
tjj|_dS)Nr4ú|)rrœr.Ú    index_urlÚ scanned_urlsÚ fetched_urlsÚ package_pagesr]r¤rerrrIÚallowsÚto_scanrZ is_availableZfind_ca_bundleZ
opener_forÚopenerrÚrequestÚurlopen)rŠrªÚhostsZ    ca_bundleZ
verify_sslrrÚkwZuse_sslr'r'r(rœ.sÿ
ýzPackageIndex.__init__Fc Csâ||jkr|sdSd|j|<t|ƒs2| |¡dStt|ƒƒ}|r\| |¡sPdS| d|¡|sn|rn||jkr‚tt|j    |ƒƒdS| |¡sšd|j|<dS| 
d|¡d|j|<d}|  |||¡}|dkrÐdSt |t jjƒrø|jdkrø| 
d|j¡d|j|j<d|j d    d
¡ ¡kr(| ¡dS|j}| ¡}t |tƒsvt |t jjƒrXd }n|j d ¡phd }| |d ¡}| ¡t |¡D](}    t j |t|      d¡ƒ¡}
| !|
¡qˆ| "|j#¡rÞt$|ddƒdkrÞ| %||¡}dS)z<Evaluate a URL as a possible download, and maybe retrieve itNTzFound link: %sz
Reading %sz<Download error on %s: %%s -- Some packages may not be found!i‘zAuthentication error: %sÚhtmlú content-typeÚzlatin-1ÚcharsetÚignorer9Úcodeé”)&r«Ú
URL_SCHEMEÚprocess_filenameÚlistrÚurl_okÚdebugr¬rrgÚinfoÚopen_urlÚ
isinstancerÚerrorÚ    HTTPErrorrºr£r=ÚheadersÚgetr-ÚcloseÚreadr|Ú    get_paramÚdecoder~rzr#rr€rJÚ process_urlr/rªÚgetattrÚ process_index) rŠr=ÚretrieveÚdistsÚtmplÚfr1rƒr¸rIÚlinkr'r'r(rÌCsT
 
 
 
 
 
    zPackageIndex.process_urlcCsŠtj |¡s| d|¡dStj |¡r^|s^tj |¡}t |¡D]}| tj ||¡d¡qBt    |ƒ}|r†| 
d|¡t t |j |ƒƒdS)Nz Not found: %sTz    Found: %s)rZrAÚexistsÚwarnÚisdirÚrealpathÚlistdirr½rer\rÀr¾rrg)rŠÚfnÚnestedrAÚitemrÐr'r'r(r½xs    zPackageIndex.process_filenamecCsbt|ƒ}|o| d¡ ¡dk}|s8| tj |¡d¡r<dSd}|rRt||ƒ‚n | ||¡dS)Nr9ÚfileTzN
Note: Bypassing %s (disallowed host; see http://bit.ly/2hrImnY for details).
)    r¼rJr-r®rr#r:rrÕ)rŠr=ÚfatalÚsÚis_filer£r'r'r(r¿ˆsÿzPackageIndex.url_okcCs2ttjj|ƒ}dd„|Dƒ}tt |j|¡ƒdS)Ncss0|](}t |¡D]}| d¡r||fVqqdS)z    .egg-linkN)rZrØr.)r^rAÚentryr'r'r(r`—s
 
ýz.PackageIndex.scan_egg_links.<locals>.<genexpr>)ÚfilterrZrArÖr¾Ú    itertoolsÚstarmapÚ scan_egg_link)rŠÚ search_pathÚdirsZ    egg_linksr'r'r(Úscan_egg_links•s
þzPackageIndex.scan_egg_linksc    CsŒttj ||¡ƒ}ttdttj|ƒƒƒ}W5QRXt    |ƒdkrDdS|\}}t
tj ||¡ƒD](}tjj|f|žŽ|_ t |_ | |¡q^dS)Nra)ÚopenrZrArer¾rárr|r}rUrrOr rFrg)rŠrAràZ    raw_linesÚlinesZegg_pathZ
setup_pathrLr'r'r(räŸs  zPackageIndex.scan_egg_linkc
    s·fdd„}t |¡D]:}z |tj |t| d¡ƒ¡ƒWqtk
rNYqXq||ƒ\}}|rÆt||ƒD]H}t    |ƒ\}}    | 
d¡rª|    sª|r |d||f7}n
ˆ  |¡ˆ  |¡qlt  dd„|¡SdSd    S)
z#Process the contents of a PyPI pagecsŒ| ˆj¡rˆtttjj|tˆjƒd… d¡ƒƒ}t|ƒdkrˆd|dkrˆt    |dƒ}t
|dƒ}dˆj   |  ¡i¡|<t|ƒt|ƒfSdS)Nr4rar8r9rT)NN)r/rªr¾rrr#r;rUr<rrr­Ú
setdefaultr-r)rÓr>ÚpkgÚverrr'r(Úscan²s ÿ  z(PackageIndex.process_index.<locals>.scanr9ú.pyz
#egg=%s-%scSsd| ddd¡S)Nz<a href="%s#md5=%s">%s</a>r9éra)rJ)Úmr'r'r(Ú<lambda>Õóz,PackageIndex.process_index.<locals>.<lambda>r·N)r~rzrr#rr€rJr$r‡rEr.Úneed_version_infoÚscan_urlÚPYPI_MD5Úsub)
rŠr=rƒrírIrërìÚnew_urlr1Úfragr'rr(rίs(    
 ÿzPackageIndex.process_indexcCs| d|¡dS)NzPPage at %s links to .py file(s) without version info; an index scan is required.)Úscan_all©rŠr=r'r'r(róÚsþzPackageIndex.need_version_infocGs:|j|jkr*|r |j|f|žŽ| d¡| |j¡dS)Nz6Scanning index of all packages (this may take a while))rªr¬rÕrÁrô©rŠr£rrr'r'r(rùàs ÿzPackageIndex.scan_allcCsz| |j|jd¡|j |j¡s:| |j|jd¡|j |j¡sR| |¡t|j |jd¡ƒD]}| |¡qfdS)Nr4r')    rôrªÚ unsafe_namer­rÇrlrPÚnot_found_in_indexr¾)rŠÚ requirementr=r'r'r(Ú find_packagesés
zPackageIndex.find_packagescsR| ¡| |¡||jD]"}||kr0|S| d||¡qtt|ƒ ||¡S)Nz%s does not match %s)ÚprescanrÿrlrÀÚsuperrÚobtain)rŠrþÚ    installerrL©Ú    __class__r'r(røs
zPackageIndex.obtaincCsL| |jd|¡| ¡sH| ¡t |¡td|jjtj     
|¡fƒ‚dS)z-
        checker is a ContentChecker
        zValidating %%s checksum for %sz7%s validation failed for %s; possible download problem?N) r‘rÀrŽrÈrZÚunlinkrršr0rArV)rŠÚcheckerr[Útfpr'r'r(Ú
check_hashsþ
þÿzPackageIndex.check_hashcCsN|D]D}|jdks0t|ƒr0| d¡s0tt|ƒƒr<| |¡q|j |¡qdS)z;Add `urls` to the list that will be prescanned for searchesNúfile:)r¯r¼r/r¾rrôÚappend)rŠÚurlsr=r'r'r(Úadd_find_linkssÿþý
ü zPackageIndex.add_find_linkscCs"|jrtt|j|jƒƒd|_dS)z7Scan urls scheduled for prescanning (e.g. --find-links)N)r¯r¾rrôrr'r'r(r szPackageIndex.prescancCs<||jr|jd}}n |jd}}|||jƒ| ¡dS)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))rlrÁrÕrürù)rŠrþÚmethr£r'r'r(rý&s
þ zPackageIndex.not_found_in_indexcCs~t|tƒsjt|ƒ}|rR| | d¡||¡}t|ƒ\}}| d¡rN| |||¡}|Stj     
|¡rb|St |ƒ}t |  ||¡ddƒS)aLocate and/or download `spec` to `tmpdir`, returning a local path
 
        `spec` may be a ``Requirement`` object, or a string containing a URL,
        an existing local filename, or a project/version requirement spec
        (i.e. the string form of a ``Requirement`` object).  If it is the URL
        of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one
        that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is
        automatically created alongside the downloaded file.
 
        If `spec` is a ``Requirement`` object or a string containing a
        project/version requirement spec, this method returns the location of
        a matching distribution (possibly after downloading it to `tmpdir`).
        If `spec` is a locally existing file or directory name, it is simply
        returned unchanged.  If `spec` is a URL, it is downloaded to a subpath
        of `tmpdir`, and the local filename is returned.  Various errors may be
        raised if a problem occurs during downloading.
        r9rîrON)rÃrr¼Ú _download_urlrJrEr.Ú    gen_setuprZrArÔr)rÍÚfetch_distribution)rŠr%Útmpdirr?Úfoundr1rDr'r'r(r60s
 
 zPackageIndex.downloadc    s܈ d|¡i‰d}d
‡‡‡‡‡fdd„    }|rHˆ ¡ˆ |¡||ƒ}|s^|dk    r^|||ƒ}|dkr€ˆjdk    rxˆ ¡||ƒ}|dkrž|sžˆ |¡||ƒ}|dkr¾ˆ dˆr´dp¶d|¡nˆ d|¡|j|jd    SdS) a|Obtain a distribution suitable for fulfilling `requirement`
 
        `requirement` must be a ``pkg_resources.Requirement`` instance.
        If necessary, or if the `force_scan` flag is set, the requirement is
        searched for in the (online) package index as well as the locally
        installed packages.  If a distribution matching `requirement` is found,
        the returned distribution's ``location`` is the value you would have
        gotten from calling the ``download()`` method with the matching
        distribution's URL or filename.  If no matching distribution is found,
        ``None`` is returned.
 
        If the `source` flag is set, only source distributions and source
        checkout links will be considered.  Unless the `develop_ok` flag is
        set, development and system eggs (i.e., those using the ``.egg-info``
        format) will be ignored.
        zSearching for %sNcs’|dkr ˆ}||jD]v}|jtkrFˆsF|ˆkrˆ d|¡dˆ|<q||ko\|jtkp\ˆ }|rˆ |jˆ¡}||_tj     
|j¡r|SqdS)Nz&Skipping development or system egg: %sr9) rlrFrrÕr r6rOÚdownload_locationrZrArÔ)ÚreqÚenvrLÚtestÚloc©Ú
develop_okrŠÚskippedÚsourcerr'r(rjs&ÿþz-PackageIndex.fetch_distribution.<locals>.findz:No local packages or working download links found for %s%sza source distribution of r·zBest match: %s)rO)N)rÁrrÿr¯rÕÚcloner)    rŠrþrÚ
force_scanrrZ local_indexrLrr'rr(rRs2 
 
 
 
 
ý zPackageIndex.fetch_distributioncCs"| ||||¡}|dk    r|jSdS)a3Obtain a file suitable for fulfilling `requirement`
 
        DEPRECATED; use the ``fetch_distribution()`` method now instead.  For
        backward compatibility, this routine is identical but returns the
        ``location`` of the downloaded distribution instead of a distribution
        object.
        N)rrO)rŠrþrrrrLr'r'r(ÚfetchžszPackageIndex.fetchc
    Csüt |¡}|r*dd„t|| d¡dƒDƒp,g}t|ƒdkrÚtj |¡}tj |¡|krŠtj     ||¡}ddl
m }|||ƒsŠt   ||¡|}ttj     |d¡dƒ2}    |     d|dj|djtj |¡df¡W5QRX|S|rðtd    ||fƒ‚ntd
ƒ‚dS) NcSsg|]}|jr|‘qSr')rQ)r^Údr'r'r(Ú
<listcomp>­sÿz*PackageIndex.gen_setup.<locals>.<listcomp>r9r)Úsamefilezsetup.pyÚwzIfrom setuptools import setup
setup(name=%r, version=%r, py_modules=[%r])
z†Can't unambiguously interpret project/version identifier %r; any dashes in the name or version should be escaped using underscores. %rzpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rHrIr rJrUrZrArVÚdirnamereZsetuptools.command.easy_installr"ÚshutilÚcopy2rèÚwriterPrQÚsplitextr)
rŠr[rDrrIrÐrVÚdstr"rÜr'r'r(r«sB
 
þý   
 þþÿþÿÿzPackageIndex.gen_setupi c     Cs| d|¡d}zît |¡}| |¡}t|tjjƒrJt    d||j
|j fƒ‚| ¡}d}|j }d}d|kr’t |dƒ}    ttt|    ƒƒ}| |||||¡t|dƒV}
| |¡} | rà| | ¡|
 | ¡|d7}| |||||¡qžqàqž| |||
¡W5QRX|W¢S|r| ¡XdS)    NzDownloading %szCan't download %s: %s %srr5zcontent-lengthzContent-LengthÚwbr9)rÁrÈr–r rÂrÃrrÄrÅrrºr£Ú dl_blocksizerÚmaxrÚintÚ
reporthookrèrÉrŒr'r    ) rŠr=r[ÚfprrÆÚblocknumÚbsÚsizeÚsizesrr‹r'r'r(Ú _download_toÖs: 
 
ÿ
 
 
 
zPackageIndex._download_tocCsdSrqr')rŠr=r[r0Zblksizer2r'r'r(r.úszPackageIndex.reporthookc
Cs¢| d¡rt|ƒSzt||jƒWSttjfk
r„}z>d dd„|jDƒ¡}|r`|     ||¡nt
d||fƒ|‚W5d}~XYnt j j k
r°}z |WY¢Sd}~XYnît j jk
rþ}z,|rÚ|     ||j¡nt
d||jfƒ|‚W5d}~XYn tjk
rL}z.|r(|     ||j¡nt
d||jfƒ|‚W5d}~XYnRtjtj fk
rœ}z*|rz|     ||¡nt
d||fƒ|‚W5d}~XYnXdS)Nr
ú cSsg|] }t|ƒ‘qSr')r|)r^Úargr'r'r(r!sz)PackageIndex.open_url.<locals>.<listcomp>z%s %szDownload error for %s: %sz;%s returned a bad status line. The server might be down, %s)r/Ú
local_openÚopen_with_authr°r$rÚ
InvalidURLrerrrÕrrrÄrÅÚURLErrorÚreasonÚ BadStatusLineÚlineÚ HTTPExceptionÚsocket)rŠr=ÚwarningÚvr£r'r'r(rÂýsJ
$ÿÿþÿüÿÿzPackageIndex.open_urlcCsæt|ƒ\}}|r0d|kr4| dd¡ dd¡}qnd}| d¡rJ|dd…}tj ||¡}|dksj| d    ¡rv| ||¡S|d
ksˆ| d ¡r”| ||¡S| d ¡rª|     ||¡S|d krÊt
j   t
j  |¡d¡S| |d¡| ||¡SdS)Nz..Ú.ú\Ú_Z__downloaded__rMr,Úsvnzsvn+Úgitzgit+zhg+rÜraT)rEÚreplacer.rZrArer/Ú _download_svnÚ _download_gitÚ _download_hgrr±Ú url2pathnamer#r:r¿Ú_attempt_download)rŠr?r=rr0rDr[r'r'r(r s$ 
 
  zPackageIndex._download_urlcCs| |d¡dS)NT)rÌrúr'r'r(rô=szPackageIndex.scan_urlcCs6| ||¡}d| dd¡ ¡kr.| |||¡S|SdS)Nrµr¶r·)r4rÇr-Ú_download_html)rŠr=r[rÆr'r'r(rL@s zPackageIndex._attempt_downloadcCsnt|ƒ}|D]>}| ¡r t d|¡rF| ¡t |¡| ||¡SqLq | ¡t |¡td|ƒ‚dS)Nz <title>([^- ]+ - )?Revision \d+:zUnexpected HTML page found at )    rèr}r]r‚rÈrZrrHr)rŠr=rÆr[rÜr=r'r'r(rMGs 
 
zPackageIndex._download_htmlcCst dt¡| dd¡d}d}| ¡ d¡râd|krâtj |¡\}}}}}}    |sâ| d¡râd    |d
d…krâ|d
d… d    d¡\}}t    |ƒ\}
} |
râd |
krº|
 d d¡\} } d | | f}nd |
}| }||||||    f}tj 
|¡}|  d||¡t   d|||f¡|S)Nz"SVN download support is deprecatedr8r9rr·zsvn:ú@z//r4raú:z --username=%s --password=%sz  --username=z'Doing subversion checkout from %s to %szsvn checkout%s -q %s %s)ÚwarningsrÕÚ UserWarningr<r-r/rr#r:Ú
_splituserÚ
urlunparserÁrZÚsystem)rŠr=r[Úcredsr?ÚnetlocrAr_ÚqrÒÚauthÚhostÚuserÚpwr>r'r'r(rHVs&   zPackageIndex._download_svncCsptj |¡\}}}}}| dd¡d}| dd¡d}d}d|krR| dd¡\}}tj ||||df¡}||fS)Nú+r9r5r8rrNr·)rr#Úurlsplitr<ÚrsplitÚ
urlunsplit)r=Ú
pop_prefixr?rVrArCrøÚrevr'r'r(Ú_vcs_split_rev_from_urllsz$PackageIndex._vcs_split_rev_from_urlcCsl| dd¡d}|j|dd\}}| d||¡t d||f¡|dk    rh| d|¡t d    ||f¡|S)
Nr8r9rT©r`zDoing git clone from %s to %szgit clone --quiet %s %szChecking out %szgit -C %s checkout --quiet %s©r<rbrÁrZrT©rŠr=r[rar'r'r(rI~s þzPackageIndex._download_gitcCsl| dd¡d}|j|dd\}}| d||¡t d||f¡|dk    rh| d|¡t d    ||f¡|S)
Nr8r9rTrczDoing hg clone from %s to %szhg clone --quiet %s %szUpdating to %szhg --cwd %s up -C -r %s -qrdrer'r'r(rJŽs þzPackageIndex._download_hgcGstj|f|žŽdSrq)rrÀrûr'r'r(rÀžszPackageIndex.debugcGstj|f|žŽdSrq)rrÁrûr'r'r(rÁ¡szPackageIndex.infocGstj|f|žŽdSrq)rrÕrûr'r'r(rÕ¤szPackageIndex.warn)r¦r§NT)F)F)F)N)N)FFFN)FF)N)F)(r’r“r”r•rœrÌr½r¿rçrärÎrórùrÿrr    r rrýr6rrrr+r4r.rÂrrôrLrMrHÚ staticmethodrbrIrJrÀrÁrÕÚ __classcell__r'r'rr(r+sXþ
 
5
 
 
+
        
#þ
L
)$
# z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?cCs| d¡}t|ƒS)Nr)rJr)rIÚwhatr'r'r(Ú decode_entity­s
ricCs
tt|ƒS)a
    Decode HTML entities in the given text.
 
    >>> htmldecode(
    ...     'https://../package_name-0.1.2.tar.gz'
    ...     '?tokena=A&amp;tokenb=B">package_name-0.1.2.tar.gz')
    'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz'
    )Ú
entity_subri)Útextr'r'r(r€²s    r€cs‡fdd„}|S)Ncs‡‡fdd„}|S)Nc    s2t ¡}t ˆ¡zˆ||ŽW¢St |¡XdSrq)r?ÚgetdefaulttimeoutÚsetdefaulttimeout)rrrsZ old_timeout)ruÚtimeoutr'r(Ú_socket_timeoutÀs
 
z@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr')ruro©rnrtr(ro¿sz'socket_timeout.<locals>._socket_timeoutr')rnror'rpr(Úsocket_timeout¾s rqcCs2tj |¡}| ¡}t |¡}| ¡}| dd¡S)aq
    A function compatible with Python 2.3-3.3 that will encode
    auth from a URL suitable for an HTTP header.
    >>> str(_encode_auth('username%3Apassword'))
    'dXNlcm5hbWU6cGFzc3dvcmQ='
 
    Long auth strings should not cause a newline to be inserted.
    >>> long_auth = 'username:' + 'password'*10
    >>> chr(10) in str(_encode_auth(long_auth))
    False
    Ú
r·)rr#r;ÚencodeÚbase64Ú    b64encoderËrG)rXZauth_sZ
auth_bytesZ encoded_bytesÚencodedr'r'r(Ú _encode_authÍs
 
rwc@s(eZdZdZdd„Zdd„Zdd„ZdS)    Ú
Credentialz:
    A username/password pair. Use like a namedtuple.
    cCs||_||_dSrq©ÚusernameÚpassword)rŠrzr{r'r'r(rœèszCredential.__init__ccs|jV|jVdSrqryrr'r'r(Ú__iter__ìszCredential.__iter__cCs dt|ƒS)Nz%(username)s:%(password)s)Úvarsrr'r'r(Ú__str__ðszCredential.__str__N)r’r“r”r•rœr|r~r'r'r'r(rxãsrxc@s0eZdZdd„Zedd„ƒZdd„Zdd„Zd    S)
Ú
PyPIConfigcCsPt dddgd¡}tj ||¡tj tj d¡d¡}tj     |¡rL| 
|¡dS)z%
        Load from ~/.pypirc
        rzr{Ú
repositoryr·ú~z.pypircN) ÚdictÚfromkeysrÚRawConfigParserrœrZrAreÚ
expanduserrÔrÉ)rŠÚdefaultsÚrcr'r'r(rœõs
 zPyPIConfig.__init__cs&‡fdd„ˆ ¡Dƒ}ttˆj|ƒƒS)Ncs g|]}ˆ |d¡ ¡r|‘qS)r€)rÇr})r^Úsectionrr'r(r!sÿz2PyPIConfig.creds_by_repository.<locals>.<listcomp>)Úsectionsr‚rÚ_get_repo_cred)rŠZsections_with_repositoriesr'rr(Úcreds_by_repositorys
ÿzPyPIConfig.creds_by_repositorycCs6| |d¡ ¡}|t| |d¡ ¡| |d¡ ¡ƒfS)Nr€rzr{)rÇr}rx)rŠrˆÚrepor'r'r(rŠ    s
þzPyPIConfig._get_repo_credcCs*|j ¡D]\}}| |¡r
|Sq
dS)zŒ
        If the URL indicated appears to be a repository defined in this
        config, return the credential for that repository.
        N)r‹Úitemsr/)rŠr=r€Úcredr'r'r(Úfind_credentials
zPyPIConfig.find_credentialN)r’r“r”rœÚpropertyr‹rŠrr'r'r'r(rôs
 
rcCs:tj |¡}|\}}}}}}| d¡r0t d¡‚|dkrFt|ƒ\}    }
nd}    |    s~tƒ |¡} | r~t    | ƒ}    | j
|f} t j d    | žŽ|    rÄdt |    ƒ}    ||
||||f} tj | ¡}tj |¡}| d|    ¡n tj |¡}| dt¡||ƒ}|    r6tj |j¡\}}}}}}||kr6||
kr6||||||f} tj | ¡|_|S)
z4Open a urllib2 request, handling HTTP authenticationrOznonnumeric port: '')ÚhttpÚhttpsNú*Authenticating as %s for %s (from .pypirc)zBasic Ú Authorizationz
User-Agent)r“)rr#r:r.rr9rRrrr|rzrrÁrwrSr±ÚRequestÚ
add_headerÚ
user_agentr=)r=r°Úparsedr?rVrAÚparamsrCrørXÚaddressrŽrÁr>r÷r±r/Ús2Úh2Úpath2Zparam2Zquery2Zfrag2r'r'r(r8s8 
 
 
     r8cCs | d¡\}}}|r|nd|fS)zNsplituser('user[:passwd]@host[:port]')
    --> 'user[:passwd]', 'host[:port]'.rNN)Ú
rpartition)rYrZÚdelimr'r'r(rRIsrRcCs|Srqr')r=r'r'r(Ú
fix_sf_urlTsr c
Cstj |¡\}}}}}}tj |¡}tj |¡r<tj |¡S|     d¡rètj 
|¡règ}t  |¡D]d}    tj  ||    ¡}
|    dkržt |
dƒ} |  ¡} W5QRXqÞntj 
|
¡r²|    d7}    | dj|    d¡q`d} | j|d  |¡d} d    \}}n
d
\}}} d d i}t | ¡}tj |||||¡S) z7Read a local path, with special support for directoriesr4z
index.htmlÚrz<a href="{name}">{name}</a>)r0zB<html><head><title>{url}</title></head><body>{files}</body></html>rr)r=Úfiles)éÈÚOK)r»zPath not foundz    Not foundr¶z    text/html)rr#r:r±rKrZrAÚisfiler²r.rÖrØrerèrÉr ÚformatrÚStringIOrÄrÅ)r=r?r@rAÚparamrCrør[r¢rÒÚfilepathr/ÚbodyrÑÚstatusÚmessagerÆZ body_streamr'r'r(r7Xs.     ÿ
 
 
r7)N)N)N)N)r!)]r•ÚsysrZr]r%r?rtr˜rârPÚ    functoolsrZsetuptools.externrZsetuptools.extern.six.movesrrrrr"Ú pkg_resourcesr    r
r r r rrrrrrrrrÚ    distutilsrÚdistutils.errorsrÚfnmatchrZsetuptools.py27compatrZsetuptools.py33compatrZsetuptools.wheelrÚtypeÚ __metaclass__r¤rHÚIr~rõrIr¼r<rTÚ__all__Z_SOCKET_TIMEOUTZ_tmplr¦Ú version_infor—r)rrErrGr\r rprwryr‡rˆr–rrörjrir€rqrwrxr„rr±r²r8rRr r7r'r'r'r(Ú<module>s–  <       
ÿþ
ÿ    
 
!
þ
$
 
! 
&/