This repository has been archived by the owner on Mar 31, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
scan_pypi_versions.py
126 lines (107 loc) · 3.4 KB
/
scan_pypi_versions.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
"""PEP 386 compatibility test with current distributions on PyPI.
A very simple test to see what percentage of the current PyPI packages
have versions that can be converted automatically by distutils2's new
suggest_normalized_version into PEP 386-compatible versions.
"""
# XXX This file does not actually run tests, move it to a script
# Written by [email protected]
import os
import xmlrpclib
try:
import cPickle as pickle
except ImportError:
import pickle
from distutils2.version import suggest_normalized_version
from distutils2.tests import unittest, run_unittest
def test_pypi():
# FIXME need a better way to do that
# To re-run from scratch, just delete these two .pkl files
INDEX_PICKLE_FILE = 'pypi-index.pkl'
VERSION_PICKLE_FILE = 'pypi-version.pkl'
package_info = version_info = []
# if there's a saved version of the package list
# restore it
# else:
# pull the list down from pypi
# save a pickled version of it
if os.path.exists(INDEX_PICKLE_FILE):
print "Loading saved pypi data..."
f = open(INDEX_PICKLE_FILE, 'rb')
try:
package_info = pickle.load(f)
finally:
f.close()
else:
print "Retrieving pypi packages..."
server = xmlrpclib.Server('http://pypi.python.org/pypi')
package_info = server.search({'name': ''})
print "Saving package info..."
f = open(INDEX_PICKLE_FILE, 'wb')
try:
pickle.dump(package_info, f)
finally:
f.close()
# If there's a saved list of the versions from the packages
# restore it
# else
# extract versions from the package list
# save a pickled version of it
versions = []
if os.path.exists(VERSION_PICKLE_FILE):
print "Loading saved version info..."
f = open(VERSION_PICKLE_FILE, 'rb')
try:
versions = pickle.load(f)
finally:
f.close()
else:
print "Extracting and saving version info..."
versions = [p['version'] for p in package_info]
o = open(VERSION_PICKLE_FILE, 'wb')
try:
pickle.dump(versions, o)
finally:
o.close()
total_versions = len(versions)
matches = 0.00
no_sugg = 0.00
have_sugg = 0.00
suggs = []
no_suggs = []
for ver in versions:
sugg = suggest_normalized_version(ver)
if sugg == ver:
matches += 1
elif sugg == None:
no_sugg += 1
no_suggs.append(ver)
else:
have_sugg += 1
suggs.append((ver, sugg))
pct = "(%2.2f%%)"
print "Results:"
print "--------"
print ""
print "Suggestions"
print "-----------"
print ""
for ver, sugg in suggs:
print "%s -> %s" % (ver, sugg)
print ""
print "No suggestions"
print "--------------"
for ver in no_suggs:
print ver
print ""
print "Summary:"
print "--------"
print "Total Packages : ", total_versions
print "Already Match : ", matches, pct % (matches/total_versions*100,)
print "Have Suggestion : ", have_sugg, pct % (have_sugg/total_versions*100,)
print "No Suggestion : ", no_sugg, pct % (no_sugg/total_versions*100,)
class TestPyPI(unittest.TestCase):
pass
def test_suite():
return unittest.makeSuite(TestPyPI)
if __name__ == '__main__':
run_unittest(test_suite())