##// END OF EJS Templates
release: merge back stable branch into default
marcink -
r363:47ef84d2 merge default
parent child Browse files
Show More
@@ -1,30 +1,32 b''
1 1 c6fad7d1e61f22b1f4a4863eff207a04c27e9462 v4.0.0
2 2 77b6e243b4cc5b702c15abd6d737798edbac60dc v4.0.1
3 3 a359c072337fdd8e1e71df72cc520b8a9b042f80 v4.1.0
4 4 49aa7ed030a36b7ceba149a21e587cb5d20b4946 v4.1.1
5 5 f38ed1e1a31dce3c170b4d31585ba43471cf0705 v4.1.2
6 6 21269ba7bafd8f0c77e79dd86a31eb9bce7643d2 v4.2.0
7 7 b53930c918c25b2c8f69ceddc6641e511be27fd3 v4.2.1
8 8 6627ff4119723d8b2b60918e8b1aa49e9f055aab v4.3.0
9 9 d38f2c2b861dde6c4178923f7cf15ea58b85aa92 v4.3.1
10 10 1232313f9e6adac5ce5399c2a891dc1e72b79022 v4.4.0
11 11 cbb9f1d329ae5768379cdec55a62ebdd546c4e27 v4.4.1
12 12 24ffe44a27fcd1c5b6936144e176b9f6dd2f3a17 v4.4.2
13 13 beaeeaa440cd17471110d4621b8816506c0dff4a v4.5.0
14 14 668e5c656f61dd94595611844e1106d1361aa6a7 v4.5.1
15 15 ae0640240cb7a77e6dc8c77e64dd80d79732cb5b v4.5.2
16 16 7af06899f426813583fe60449d7517cc49c15b28 v4.6.0
17 17 8f7f4299bf341b43f94dadafa1ea73d6cea2c9ba v4.6.1
18 18 de00a831a0709ffaac57f948738ea927b97223a9 v4.7.0
19 19 57f527e0646d731768fb5e0fe742b12a35bdc63b v4.7.1
20 20 f9b09787da9845e4a105f4bffdc252099902cefb v4.7.2
21 21 0b7c790b726f08385e6ebdf4f257c905787b9244 v4.8.0
22 22 f4123e725b74d0e82fe89982ab8791a66062e2b3 v4.9.0
23 23 940bac044a0fe1ec839759df81399b50141be720 v4.9.1
24 24 582d9ebbe46bdddac4b26eacae36ee5ecabca267 v4.10.0
25 25 12fbd08d0ab57acce9c0bdccee75633cfa08d7f4 v4.10.1
26 26 78352f95021a9d128f5803fdbca7036daef5dabe v4.10.2
27 27 a47ccfb020cda78c8680e3844aaf0b82b1390f3b v4.10.3
28 28 347ae9ae544bba8deb417995285287a3b6be1611 v4.10.4
29 29 9b257ac49841f850434be0d518baca0827e6c8cc v4.10.5
30 30 e8bf26eea118694edc4ffe50c6c5aa91022bc434 v4.10.6
31 71fa9274ba59fb982104f0b9b3d0d024c78675f7 v4.11.0
32 92471577ef25636e5babe8001d47fc8e51521522 v4.11.1
@@ -1,877 +1,877 b''
1 1 # Generated by pip2nix 0.4.0
2 2 # See https://github.com/johbo/pip2nix
3 3
4 4 {
5 5 Beaker = super.buildPythonPackage {
6 6 name = "Beaker-1.9.0";
7 7 buildInputs = with self; [];
8 8 doCheck = false;
9 9 propagatedBuildInputs = with self; [funcsigs];
10 10 src = fetchurl {
11 11 url = "https://pypi.python.org/packages/93/b2/12de6937b06e9615dbb3cb3a1c9af17f133f435bdef59f4ad42032b6eb49/Beaker-1.9.0.tar.gz";
12 12 md5 = "38b3fcdfa24faf97c6cf66991eb54e9c";
13 13 };
14 14 meta = {
15 15 license = [ pkgs.lib.licenses.bsdOriginal ];
16 16 };
17 17 };
18 18 Jinja2 = super.buildPythonPackage {
19 19 name = "Jinja2-2.9.6";
20 20 buildInputs = with self; [];
21 21 doCheck = false;
22 22 propagatedBuildInputs = with self; [MarkupSafe];
23 23 src = fetchurl {
24 24 url = "https://pypi.python.org/packages/90/61/f820ff0076a2599dd39406dcb858ecb239438c02ce706c8e91131ab9c7f1/Jinja2-2.9.6.tar.gz";
25 25 md5 = "6411537324b4dba0956aaa8109f3c77b";
26 26 };
27 27 meta = {
28 28 license = [ pkgs.lib.licenses.bsdOriginal ];
29 29 };
30 30 };
31 31 Mako = super.buildPythonPackage {
32 32 name = "Mako-1.0.7";
33 33 buildInputs = with self; [];
34 34 doCheck = false;
35 35 propagatedBuildInputs = with self; [MarkupSafe];
36 36 src = fetchurl {
37 37 url = "https://pypi.python.org/packages/eb/f3/67579bb486517c0d49547f9697e36582cd19dafb5df9e687ed8e22de57fa/Mako-1.0.7.tar.gz";
38 38 md5 = "5836cc997b1b773ef389bf6629c30e65";
39 39 };
40 40 meta = {
41 41 license = [ pkgs.lib.licenses.mit ];
42 42 };
43 43 };
44 44 MarkupSafe = super.buildPythonPackage {
45 45 name = "MarkupSafe-1.0";
46 46 buildInputs = with self; [];
47 47 doCheck = false;
48 48 propagatedBuildInputs = with self; [];
49 49 src = fetchurl {
50 50 url = "https://pypi.python.org/packages/4d/de/32d741db316d8fdb7680822dd37001ef7a448255de9699ab4bfcbdf4172b/MarkupSafe-1.0.tar.gz";
51 51 md5 = "2fcedc9284d50e577b5192e8e3578355";
52 52 };
53 53 meta = {
54 54 license = [ pkgs.lib.licenses.bsdOriginal ];
55 55 };
56 56 };
57 57 PasteDeploy = super.buildPythonPackage {
58 58 name = "PasteDeploy-1.5.2";
59 59 buildInputs = with self; [];
60 60 doCheck = false;
61 61 propagatedBuildInputs = with self; [];
62 62 src = fetchurl {
63 63 url = "https://pypi.python.org/packages/0f/90/8e20cdae206c543ea10793cbf4136eb9a8b3f417e04e40a29d72d9922cbd/PasteDeploy-1.5.2.tar.gz";
64 64 md5 = "352b7205c78c8de4987578d19431af3b";
65 65 };
66 66 meta = {
67 67 license = [ pkgs.lib.licenses.mit ];
68 68 };
69 69 };
70 70 WebOb = super.buildPythonPackage {
71 71 name = "WebOb-1.7.4";
72 72 buildInputs = with self; [];
73 73 doCheck = false;
74 74 propagatedBuildInputs = with self; [];
75 75 src = fetchurl {
76 76 url = "https://pypi.python.org/packages/75/34/731e23f52371852dfe7490a61644826ba7fe70fd52a377aaca0f4956ba7f/WebOb-1.7.4.tar.gz";
77 77 md5 = "397e46892d7f199b1a07eb20a2d3d9bd";
78 78 };
79 79 meta = {
80 80 license = [ pkgs.lib.licenses.mit ];
81 81 };
82 82 };
83 83 WebTest = super.buildPythonPackage {
84 84 name = "WebTest-2.0.29";
85 85 buildInputs = with self; [];
86 86 doCheck = false;
87 87 propagatedBuildInputs = with self; [six WebOb waitress beautifulsoup4];
88 88 src = fetchurl {
89 89 url = "https://pypi.python.org/packages/94/de/8f94738be649997da99c47b104aa3c3984ecec51a1d8153ed09638253d56/WebTest-2.0.29.tar.gz";
90 90 md5 = "30b4cf0d340b9a5335fac4389e6f84fc";
91 91 };
92 92 meta = {
93 93 license = [ pkgs.lib.licenses.mit ];
94 94 };
95 95 };
96 96 backports.shutil-get-terminal-size = super.buildPythonPackage {
97 97 name = "backports.shutil-get-terminal-size-1.0.0";
98 98 buildInputs = with self; [];
99 99 doCheck = false;
100 100 propagatedBuildInputs = with self; [];
101 101 src = fetchurl {
102 102 url = "https://pypi.python.org/packages/ec/9c/368086faa9c016efce5da3e0e13ba392c9db79e3ab740b763fe28620b18b/backports.shutil_get_terminal_size-1.0.0.tar.gz";
103 103 md5 = "03267762480bd86b50580dc19dff3c66";
104 104 };
105 105 meta = {
106 106 license = [ pkgs.lib.licenses.mit ];
107 107 };
108 108 };
109 109 beautifulsoup4 = super.buildPythonPackage {
110 110 name = "beautifulsoup4-4.6.0";
111 111 buildInputs = with self; [];
112 112 doCheck = false;
113 113 propagatedBuildInputs = with self; [];
114 114 src = fetchurl {
115 115 url = "https://pypi.python.org/packages/fa/8d/1d14391fdaed5abada4e0f63543fef49b8331a34ca60c88bd521bcf7f782/beautifulsoup4-4.6.0.tar.gz";
116 116 md5 = "c17714d0f91a23b708a592cb3c697728";
117 117 };
118 118 meta = {
119 119 license = [ pkgs.lib.licenses.mit ];
120 120 };
121 121 };
122 122 configobj = super.buildPythonPackage {
123 123 name = "configobj-5.0.6";
124 124 buildInputs = with self; [];
125 125 doCheck = false;
126 126 propagatedBuildInputs = with self; [six];
127 127 src = fetchurl {
128 128 url = "https://pypi.python.org/packages/64/61/079eb60459c44929e684fa7d9e2fdca403f67d64dd9dbac27296be2e0fab/configobj-5.0.6.tar.gz";
129 129 md5 = "e472a3a1c2a67bb0ec9b5d54c13a47d6";
130 130 };
131 131 meta = {
132 132 license = [ pkgs.lib.licenses.bsdOriginal ];
133 133 };
134 134 };
135 135 cov-core = super.buildPythonPackage {
136 136 name = "cov-core-1.15.0";
137 137 buildInputs = with self; [];
138 138 doCheck = false;
139 139 propagatedBuildInputs = with self; [coverage];
140 140 src = fetchurl {
141 141 url = "https://pypi.python.org/packages/4b/87/13e75a47b4ba1be06f29f6d807ca99638bedc6b57fa491cd3de891ca2923/cov-core-1.15.0.tar.gz";
142 142 md5 = "f519d4cb4c4e52856afb14af52919fe6";
143 143 };
144 144 meta = {
145 145 license = [ pkgs.lib.licenses.mit ];
146 146 };
147 147 };
148 148 coverage = super.buildPythonPackage {
149 149 name = "coverage-3.7.1";
150 150 buildInputs = with self; [];
151 151 doCheck = false;
152 152 propagatedBuildInputs = with self; [];
153 153 src = fetchurl {
154 154 url = "https://pypi.python.org/packages/09/4f/89b06c7fdc09687bca507dc411c342556ef9c5a3b26756137a4878ff19bf/coverage-3.7.1.tar.gz";
155 155 md5 = "c47b36ceb17eaff3ecfab3bcd347d0df";
156 156 };
157 157 meta = {
158 158 license = [ pkgs.lib.licenses.bsdOriginal ];
159 159 };
160 160 };
161 161 decorator = super.buildPythonPackage {
162 162 name = "decorator-4.1.2";
163 163 buildInputs = with self; [];
164 164 doCheck = false;
165 165 propagatedBuildInputs = with self; [];
166 166 src = fetchurl {
167 167 url = "https://pypi.python.org/packages/bb/e0/f6e41e9091e130bf16d4437dabbac3993908e4d6485ecbc985ef1352db94/decorator-4.1.2.tar.gz";
168 168 md5 = "a0f7f4fe00ae2dde93494d90c192cf8c";
169 169 };
170 170 meta = {
171 171 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "new BSD License"; } ];
172 172 };
173 173 };
174 174 dulwich = super.buildPythonPackage {
175 175 name = "dulwich-0.13.0";
176 176 buildInputs = with self; [];
177 177 doCheck = false;
178 178 propagatedBuildInputs = with self; [];
179 179 src = fetchurl {
180 180 url = "https://pypi.python.org/packages/84/95/732d280eee829dacc954e8109f97b47abcadcca472c2ab013e1635eb4792/dulwich-0.13.0.tar.gz";
181 181 md5 = "6dede0626657c2bd08f48ca1221eea91";
182 182 };
183 183 meta = {
184 184 license = [ pkgs.lib.licenses.gpl2Plus ];
185 185 };
186 186 };
187 187 enum34 = super.buildPythonPackage {
188 188 name = "enum34-1.1.6";
189 189 buildInputs = with self; [];
190 190 doCheck = false;
191 191 propagatedBuildInputs = with self; [];
192 192 src = fetchurl {
193 193 url = "https://pypi.python.org/packages/bf/3e/31d502c25302814a7c2f1d3959d2a3b3f78e509002ba91aea64993936876/enum34-1.1.6.tar.gz";
194 194 md5 = "5f13a0841a61f7fc295c514490d120d0";
195 195 };
196 196 meta = {
197 197 license = [ pkgs.lib.licenses.bsdOriginal ];
198 198 };
199 199 };
200 200 funcsigs = super.buildPythonPackage {
201 201 name = "funcsigs-1.0.2";
202 202 buildInputs = with self; [];
203 203 doCheck = false;
204 204 propagatedBuildInputs = with self; [];
205 205 src = fetchurl {
206 206 url = "https://pypi.python.org/packages/94/4a/db842e7a0545de1cdb0439bb80e6e42dfe82aaeaadd4072f2263a4fbed23/funcsigs-1.0.2.tar.gz";
207 207 md5 = "7e583285b1fb8a76305d6d68f4ccc14e";
208 208 };
209 209 meta = {
210 210 license = [ { fullName = "ASL"; } pkgs.lib.licenses.asl20 ];
211 211 };
212 212 };
213 213 gevent = super.buildPythonPackage {
214 214 name = "gevent-1.2.2";
215 215 buildInputs = with self; [];
216 216 doCheck = false;
217 217 propagatedBuildInputs = with self; [greenlet];
218 218 src = fetchurl {
219 219 url = "https://pypi.python.org/packages/1b/92/b111f76e54d2be11375b47b213b56687214f258fd9dae703546d30b837be/gevent-1.2.2.tar.gz";
220 220 md5 = "7f0baf355384fe5ff2ecf66853422554";
221 221 };
222 222 meta = {
223 223 license = [ pkgs.lib.licenses.mit ];
224 224 };
225 225 };
226 226 gprof2dot = super.buildPythonPackage {
227 227 name = "gprof2dot-2017.9.19";
228 228 buildInputs = with self; [];
229 229 doCheck = false;
230 230 propagatedBuildInputs = with self; [];
231 231 src = fetchurl {
232 232 url = "https://pypi.python.org/packages/9d/36/f977122502979f3dfb50704979c9ed70e6b620787942b089bf1af15f5aba/gprof2dot-2017.9.19.tar.gz";
233 233 md5 = "cda2d552bb0d0b9f16e6824a9aabd225";
234 234 };
235 235 meta = {
236 236 license = [ { fullName = "GNU Lesser General Public License v3 or later (LGPLv3+)"; } { fullName = "LGPL"; } ];
237 237 };
238 238 };
239 239 greenlet = super.buildPythonPackage {
240 240 name = "greenlet-0.4.12";
241 241 buildInputs = with self; [];
242 242 doCheck = false;
243 243 propagatedBuildInputs = with self; [];
244 244 src = fetchurl {
245 245 url = "https://pypi.python.org/packages/be/76/82af375d98724054b7e273b5d9369346937324f9bcc20980b45b068ef0b0/greenlet-0.4.12.tar.gz";
246 246 md5 = "e8637647d58a26c4a1f51ca393e53c00";
247 247 };
248 248 meta = {
249 249 license = [ pkgs.lib.licenses.mit ];
250 250 };
251 251 };
252 252 gunicorn = super.buildPythonPackage {
253 253 name = "gunicorn-19.7.1";
254 254 buildInputs = with self; [];
255 255 doCheck = false;
256 256 propagatedBuildInputs = with self; [];
257 257 src = fetchurl {
258 258 url = "https://pypi.python.org/packages/30/3a/10bb213cede0cc4d13ac2263316c872a64bf4c819000c8ccd801f1d5f822/gunicorn-19.7.1.tar.gz";
259 259 md5 = "174d3c3cd670a5be0404d84c484e590c";
260 260 };
261 261 meta = {
262 262 license = [ pkgs.lib.licenses.mit ];
263 263 };
264 264 };
265 265 hg-evolve = super.buildPythonPackage {
266 266 name = "hg-evolve-7.0.1";
267 267 buildInputs = with self; [];
268 268 doCheck = false;
269 269 propagatedBuildInputs = with self; [];
270 270 src = fetchurl {
271 271 url = "https://pypi.python.org/packages/92/5c/4c216be1a08f326a12076b645f4892a2b0865810db1f4a0c9648f1f4c113/hg-evolve-7.0.1.tar.gz";
272 272 md5 = "2dfa926846ea873a8406bababb06b277";
273 273 };
274 274 meta = {
275 275 license = [ { fullName = "GPLv2+"; } ];
276 276 };
277 277 };
278 278 hgsubversion = super.buildPythonPackage {
279 279 name = "hgsubversion-1.9";
280 280 buildInputs = with self; [];
281 281 doCheck = false;
282 282 propagatedBuildInputs = with self; [mercurial subvertpy];
283 283 src = fetchurl {
284 284 url = "https://pypi.python.org/packages/db/26/7293a6c6b85e2a74ab452e9ba7f00b04ff0e440e6cd4f84131ac5d5e6b22/hgsubversion-1.9.tar.gz";
285 285 md5 = "0c6f93ef12cc2e7fe67286f16bcc7211";
286 286 };
287 287 meta = {
288 288 license = [ pkgs.lib.licenses.gpl1 ];
289 289 };
290 290 };
291 291 hupper = super.buildPythonPackage {
292 292 name = "hupper-1.0";
293 293 buildInputs = with self; [];
294 294 doCheck = false;
295 295 propagatedBuildInputs = with self; [];
296 296 src = fetchurl {
297 297 url = "https://pypi.python.org/packages/2e/07/df892c564dc09bb3cf6f6deb976c26adf9117db75ba218cb4353dbc9d826/hupper-1.0.tar.gz";
298 298 md5 = "26e77da7d5ac5858f59af050d1a6eb5a";
299 299 };
300 300 meta = {
301 301 license = [ pkgs.lib.licenses.mit ];
302 302 };
303 303 };
304 304 infrae.cache = super.buildPythonPackage {
305 305 name = "infrae.cache-1.0.1";
306 306 buildInputs = with self; [];
307 307 doCheck = false;
308 308 propagatedBuildInputs = with self; [Beaker repoze.lru];
309 309 src = fetchurl {
310 310 url = "https://pypi.python.org/packages/bb/f0/e7d5e984cf6592fd2807dc7bc44a93f9d18e04e6a61f87fdfb2622422d74/infrae.cache-1.0.1.tar.gz";
311 311 md5 = "b09076a766747e6ed2a755cc62088e32";
312 312 };
313 313 meta = {
314 314 license = [ pkgs.lib.licenses.zpt21 ];
315 315 };
316 316 };
317 317 ipdb = super.buildPythonPackage {
318 318 name = "ipdb-0.10.3";
319 319 buildInputs = with self; [];
320 320 doCheck = false;
321 321 propagatedBuildInputs = with self; [setuptools ipython];
322 322 src = fetchurl {
323 323 url = "https://pypi.python.org/packages/ad/cc/0e7298e1fbf2efd52667c9354a12aa69fb6f796ce230cca03525051718ef/ipdb-0.10.3.tar.gz";
324 324 md5 = "def1f6ac075d54bdee07e6501263d4fa";
325 325 };
326 326 meta = {
327 327 license = [ pkgs.lib.licenses.bsdOriginal ];
328 328 };
329 329 };
330 330 ipython = super.buildPythonPackage {
331 331 name = "ipython-5.1.0";
332 332 buildInputs = with self; [];
333 333 doCheck = false;
334 334 propagatedBuildInputs = with self; [setuptools decorator pickleshare simplegeneric traitlets prompt-toolkit pygments pexpect backports.shutil-get-terminal-size pathlib2 pexpect];
335 335 src = fetchurl {
336 336 url = "https://pypi.python.org/packages/89/63/a9292f7cd9d0090a0f995e1167f3f17d5889dcbc9a175261719c513b9848/ipython-5.1.0.tar.gz";
337 337 md5 = "47c8122420f65b58784cb4b9b4af35e3";
338 338 };
339 339 meta = {
340 340 license = [ pkgs.lib.licenses.bsdOriginal ];
341 341 };
342 342 };
343 343 ipython-genutils = super.buildPythonPackage {
344 344 name = "ipython-genutils-0.2.0";
345 345 buildInputs = with self; [];
346 346 doCheck = false;
347 347 propagatedBuildInputs = with self; [];
348 348 src = fetchurl {
349 349 url = "https://pypi.python.org/packages/e8/69/fbeffffc05236398ebfcfb512b6d2511c622871dca1746361006da310399/ipython_genutils-0.2.0.tar.gz";
350 350 md5 = "5a4f9781f78466da0ea1a648f3e1f79f";
351 351 };
352 352 meta = {
353 353 license = [ pkgs.lib.licenses.bsdOriginal ];
354 354 };
355 355 };
356 356 mercurial = super.buildPythonPackage {
357 357 name = "mercurial-4.4.2";
358 358 buildInputs = with self; [];
359 359 doCheck = false;
360 360 propagatedBuildInputs = with self; [];
361 361 src = fetchurl {
362 362 url = "https://pypi.python.org/packages/d0/83/92a5fa662ba277128db305e39e7ea5a638f2f1cbbc6dc5fbf4c14aefae22/mercurial-4.4.2.tar.gz";
363 363 md5 = "95769125cf7e9dbc341a983253acefcd";
364 364 };
365 365 meta = {
366 366 license = [ pkgs.lib.licenses.gpl1 pkgs.lib.licenses.gpl2Plus ];
367 367 };
368 368 };
369 369 mock = super.buildPythonPackage {
370 370 name = "mock-1.0.1";
371 371 buildInputs = with self; [];
372 372 doCheck = false;
373 373 propagatedBuildInputs = with self; [];
374 374 src = fetchurl {
375 375 url = "https://pypi.python.org/packages/15/45/30273ee91feb60dabb8fbb2da7868520525f02cf910279b3047182feed80/mock-1.0.1.zip";
376 376 md5 = "869f08d003c289a97c1a6610faf5e913";
377 377 };
378 378 meta = {
379 379 license = [ pkgs.lib.licenses.bsdOriginal ];
380 380 };
381 381 };
382 382 msgpack-python = super.buildPythonPackage {
383 383 name = "msgpack-python-0.4.8";
384 384 buildInputs = with self; [];
385 385 doCheck = false;
386 386 propagatedBuildInputs = with self; [];
387 387 src = fetchurl {
388 388 url = "https://pypi.python.org/packages/21/27/8a1d82041c7a2a51fcc73675875a5f9ea06c2663e02fcfeb708be1d081a0/msgpack-python-0.4.8.tar.gz";
389 389 md5 = "dcd854fb41ee7584ebbf35e049e6be98";
390 390 };
391 391 meta = {
392 392 license = [ pkgs.lib.licenses.asl20 ];
393 393 };
394 394 };
395 395 pathlib2 = super.buildPythonPackage {
396 396 name = "pathlib2-2.3.0";
397 397 buildInputs = with self; [];
398 398 doCheck = false;
399 399 propagatedBuildInputs = with self; [six scandir];
400 400 src = fetchurl {
401 401 url = "https://pypi.python.org/packages/a1/14/df0deb867c2733f7d857523c10942b3d6612a1b222502fdffa9439943dfb/pathlib2-2.3.0.tar.gz";
402 402 md5 = "89c90409d11fd5947966b6a30a47d18c";
403 403 };
404 404 meta = {
405 405 license = [ pkgs.lib.licenses.mit ];
406 406 };
407 407 };
408 408 pexpect = super.buildPythonPackage {
409 409 name = "pexpect-4.3.0";
410 410 buildInputs = with self; [];
411 411 doCheck = false;
412 412 propagatedBuildInputs = with self; [ptyprocess];
413 413 src = fetchurl {
414 414 url = "https://pypi.python.org/packages/f8/44/5466c30e49762bb92e442bbdf4472d6904608d211258eb3198a11f0309a4/pexpect-4.3.0.tar.gz";
415 415 md5 = "047a486dcd26134b74f2e67046bb61a0";
416 416 };
417 417 meta = {
418 418 license = [ pkgs.lib.licenses.isc { fullName = "ISC License (ISCL)"; } ];
419 419 };
420 420 };
421 421 pickleshare = super.buildPythonPackage {
422 422 name = "pickleshare-0.7.4";
423 423 buildInputs = with self; [];
424 424 doCheck = false;
425 425 propagatedBuildInputs = with self; [pathlib2];
426 426 src = fetchurl {
427 427 url = "https://pypi.python.org/packages/69/fe/dd137d84daa0fd13a709e448138e310d9ea93070620c9db5454e234af525/pickleshare-0.7.4.tar.gz";
428 428 md5 = "6a9e5dd8dfc023031f6b7b3f824cab12";
429 429 };
430 430 meta = {
431 431 license = [ pkgs.lib.licenses.mit ];
432 432 };
433 433 };
434 434 plaster = super.buildPythonPackage {
435 435 name = "plaster-1.0";
436 436 buildInputs = with self; [];
437 437 doCheck = false;
438 438 propagatedBuildInputs = with self; [setuptools];
439 439 src = fetchurl {
440 440 url = "https://pypi.python.org/packages/37/e1/56d04382d718d32751017d32f351214384e529b794084eee20bb52405563/plaster-1.0.tar.gz";
441 441 md5 = "80e6beb4760c16fea31754babcc0576e";
442 442 };
443 443 meta = {
444 444 license = [ pkgs.lib.licenses.mit ];
445 445 };
446 446 };
447 447 plaster-pastedeploy = super.buildPythonPackage {
448 448 name = "plaster-pastedeploy-0.4.2";
449 449 buildInputs = with self; [];
450 450 doCheck = false;
451 451 propagatedBuildInputs = with self; [PasteDeploy plaster];
452 452 src = fetchurl {
453 453 url = "https://pypi.python.org/packages/2c/62/0daf9c0be958e785023e583e51baac15863699e956bfb3d448898d80edd8/plaster_pastedeploy-0.4.2.tar.gz";
454 454 md5 = "58fd7852002909378e818c9d5b71e90a";
455 455 };
456 456 meta = {
457 457 license = [ pkgs.lib.licenses.mit ];
458 458 };
459 459 };
460 460 prompt-toolkit = super.buildPythonPackage {
461 461 name = "prompt-toolkit-1.0.15";
462 462 buildInputs = with self; [];
463 463 doCheck = false;
464 464 propagatedBuildInputs = with self; [six wcwidth];
465 465 src = fetchurl {
466 466 url = "https://pypi.python.org/packages/8a/ad/cf6b128866e78ad6d7f1dc5b7f99885fb813393d9860778b2984582e81b5/prompt_toolkit-1.0.15.tar.gz";
467 467 md5 = "8fe70295006dbc8afedd43e5eba99032";
468 468 };
469 469 meta = {
470 470 license = [ pkgs.lib.licenses.bsdOriginal ];
471 471 };
472 472 };
473 473 ptyprocess = super.buildPythonPackage {
474 474 name = "ptyprocess-0.5.2";
475 475 buildInputs = with self; [];
476 476 doCheck = false;
477 477 propagatedBuildInputs = with self; [];
478 478 src = fetchurl {
479 479 url = "https://pypi.python.org/packages/51/83/5d07dc35534640b06f9d9f1a1d2bc2513fb9cc7595a1b0e28ae5477056ce/ptyprocess-0.5.2.tar.gz";
480 480 md5 = "d3b8febae1b8c53b054bd818d0bb8665";
481 481 };
482 482 meta = {
483 483 license = [ ];
484 484 };
485 485 };
486 486 py = super.buildPythonPackage {
487 487 name = "py-1.5.2";
488 488 buildInputs = with self; [];
489 489 doCheck = false;
490 490 propagatedBuildInputs = with self; [];
491 491 src = fetchurl {
492 492 url = "https://pypi.python.org/packages/90/e3/e075127d39d35f09a500ebb4a90afd10f9ef0a1d28a6d09abeec0e444fdd/py-1.5.2.tar.gz";
493 493 md5 = "279ca69c632069e1b71e11b14641ca28";
494 494 };
495 495 meta = {
496 496 license = [ pkgs.lib.licenses.mit ];
497 497 };
498 498 };
499 499 pygments = super.buildPythonPackage {
500 500 name = "pygments-2.2.0";
501 501 buildInputs = with self; [];
502 502 doCheck = false;
503 503 propagatedBuildInputs = with self; [];
504 504 src = fetchurl {
505 505 url = "https://pypi.python.org/packages/71/2a/2e4e77803a8bd6408a2903340ac498cb0a2181811af7c9ec92cb70b0308a/Pygments-2.2.0.tar.gz";
506 506 md5 = "13037baca42f16917cbd5ad2fab50844";
507 507 };
508 508 meta = {
509 509 license = [ pkgs.lib.licenses.bsdOriginal ];
510 510 };
511 511 };
512 512 pyramid = super.buildPythonPackage {
513 513 name = "pyramid-1.9.1";
514 514 buildInputs = with self; [];
515 515 doCheck = false;
516 516 propagatedBuildInputs = with self; [setuptools WebOb repoze.lru zope.interface zope.deprecation venusian translationstring PasteDeploy plaster plaster-pastedeploy hupper];
517 517 src = fetchurl {
518 518 url = "https://pypi.python.org/packages/9a/57/73447be9e7d0512d601e3f0a1fb9d7d1efb941911f49efdfe036d2826507/pyramid-1.9.1.tar.gz";
519 519 md5 = "0163e19c58c2d12976a3b6fdb57e052d";
520 520 };
521 521 meta = {
522 522 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
523 523 };
524 524 };
525 525 pyramid-jinja2 = super.buildPythonPackage {
526 526 name = "pyramid-jinja2-2.7";
527 527 buildInputs = with self; [];
528 528 doCheck = false;
529 529 propagatedBuildInputs = with self; [pyramid zope.deprecation Jinja2 MarkupSafe];
530 530 src = fetchurl {
531 531 url = "https://pypi.python.org/packages/d8/80/d60a7233823de22ce77bd864a8a83736a1fe8b49884b08303a2e68b2c853/pyramid_jinja2-2.7.tar.gz";
532 532 md5 = "c2f8b2cd7b73a6f1d9a311fcfaf4fb92";
533 533 };
534 534 meta = {
535 535 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
536 536 };
537 537 };
538 538 pyramid-mako = super.buildPythonPackage {
539 539 name = "pyramid-mako-1.0.2";
540 540 buildInputs = with self; [];
541 541 doCheck = false;
542 542 propagatedBuildInputs = with self; [pyramid Mako];
543 543 src = fetchurl {
544 544 url = "https://pypi.python.org/packages/f1/92/7e69bcf09676d286a71cb3bbb887b16595b96f9ba7adbdc239ffdd4b1eb9/pyramid_mako-1.0.2.tar.gz";
545 545 md5 = "ee25343a97eb76bd90abdc2a774eb48a";
546 546 };
547 547 meta = {
548 548 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
549 549 };
550 550 };
551 551 pytest = super.buildPythonPackage {
552 552 name = "pytest-3.2.5";
553 553 buildInputs = with self; [];
554 554 doCheck = false;
555 555 propagatedBuildInputs = with self; [py setuptools];
556 556 src = fetchurl {
557 557 url = "https://pypi.python.org/packages/1f/f8/8cd74c16952163ce0db0bd95fdd8810cbf093c08be00e6e665ebf0dc3138/pytest-3.2.5.tar.gz";
558 558 md5 = "6dbe9bb093883f75394a689a1426ac6f";
559 559 };
560 560 meta = {
561 561 license = [ pkgs.lib.licenses.mit ];
562 562 };
563 563 };
564 564 pytest-catchlog = super.buildPythonPackage {
565 565 name = "pytest-catchlog-1.2.2";
566 566 buildInputs = with self; [];
567 567 doCheck = false;
568 568 propagatedBuildInputs = with self; [py pytest];
569 569 src = fetchurl {
570 570 url = "https://pypi.python.org/packages/f2/2b/2faccdb1a978fab9dd0bf31cca9f6847fbe9184a0bdcc3011ac41dd44191/pytest-catchlog-1.2.2.zip";
571 571 md5 = "09d890c54c7456c818102b7ff8c182c8";
572 572 };
573 573 meta = {
574 574 license = [ pkgs.lib.licenses.mit ];
575 575 };
576 576 };
577 577 pytest-cov = super.buildPythonPackage {
578 578 name = "pytest-cov-2.5.1";
579 579 buildInputs = with self; [];
580 580 doCheck = false;
581 581 propagatedBuildInputs = with self; [pytest coverage];
582 582 src = fetchurl {
583 583 url = "https://pypi.python.org/packages/24/b4/7290d65b2f3633db51393bdf8ae66309b37620bc3ec116c5e357e3e37238/pytest-cov-2.5.1.tar.gz";
584 584 md5 = "5acf38d4909e19819eb5c1754fbfc0ac";
585 585 };
586 586 meta = {
587 587 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.mit ];
588 588 };
589 589 };
590 590 pytest-profiling = super.buildPythonPackage {
591 591 name = "pytest-profiling-1.2.11";
592 592 buildInputs = with self; [];
593 593 doCheck = false;
594 594 propagatedBuildInputs = with self; [six pytest gprof2dot];
595 595 src = fetchurl {
596 596 url = "https://pypi.python.org/packages/c0/4a/b4aa786e93c07a86f1f87c581a36bf355a9e06a9da7e00dbd05047626bd2/pytest-profiling-1.2.11.tar.gz";
597 597 md5 = "9ef6b60248731be5d44477980408e8f7";
598 598 };
599 599 meta = {
600 600 license = [ pkgs.lib.licenses.mit ];
601 601 };
602 602 };
603 603 pytest-runner = super.buildPythonPackage {
604 604 name = "pytest-runner-3.0";
605 605 buildInputs = with self; [];
606 606 doCheck = false;
607 607 propagatedBuildInputs = with self; [];
608 608 src = fetchurl {
609 609 url = "https://pypi.python.org/packages/65/b4/ae89338cd2d81e2cc54bd6db2e962bfe948f612303610d68ab24539ac2d1/pytest-runner-3.0.tar.gz";
610 610 md5 = "8f8363a52bbabc4cedd5e239beb2ba11";
611 611 };
612 612 meta = {
613 613 license = [ pkgs.lib.licenses.mit ];
614 614 };
615 615 };
616 616 pytest-sugar = super.buildPythonPackage {
617 617 name = "pytest-sugar-0.9.0";
618 618 buildInputs = with self; [];
619 619 doCheck = false;
620 620 propagatedBuildInputs = with self; [pytest termcolor];
621 621 src = fetchurl {
622 622 url = "https://pypi.python.org/packages/49/d8/c5ff6cca3ce2ebd8b73eec89779bf6b4a7737456a70e8ea4d44c1ff90f71/pytest-sugar-0.9.0.tar.gz";
623 623 md5 = "89fbff17277fa6a95a560a04b68cb9f9";
624 624 };
625 625 meta = {
626 626 license = [ pkgs.lib.licenses.bsdOriginal ];
627 627 };
628 628 };
629 629 pytest-timeout = super.buildPythonPackage {
630 630 name = "pytest-timeout-1.2.0";
631 631 buildInputs = with self; [];
632 632 doCheck = false;
633 633 propagatedBuildInputs = with self; [pytest];
634 634 src = fetchurl {
635 635 url = "https://pypi.python.org/packages/cc/b7/b2a61365ea6b6d2e8881360ae7ed8dad0327ad2df89f2f0be4a02304deb2/pytest-timeout-1.2.0.tar.gz";
636 636 md5 = "83607d91aa163562c7ee835da57d061d";
637 637 };
638 638 meta = {
639 639 license = [ pkgs.lib.licenses.mit { fullName = "DFSG approved"; } ];
640 640 };
641 641 };
642 642 repoze.lru = super.buildPythonPackage {
643 643 name = "repoze.lru-0.7";
644 644 buildInputs = with self; [];
645 645 doCheck = false;
646 646 propagatedBuildInputs = with self; [];
647 647 src = fetchurl {
648 648 url = "https://pypi.python.org/packages/12/bc/595a77c4b5e204847fdf19268314ef59c85193a9dc9f83630fc459c0fee5/repoze.lru-0.7.tar.gz";
649 649 md5 = "c08cc030387e0b1fc53c5c7d964b35e2";
650 650 };
651 651 meta = {
652 652 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
653 653 };
654 654 };
655 655 rhodecode-vcsserver = super.buildPythonPackage {
656 name = "rhodecode-vcsserver-4.11.0";
656 name = "rhodecode-vcsserver-4.11.1";
657 657 buildInputs = with self; [pytest py pytest-cov pytest-sugar pytest-runner pytest-catchlog pytest-profiling gprof2dot pytest-timeout mock WebTest cov-core coverage configobj];
658 658 doCheck = true;
659 659 propagatedBuildInputs = with self; [Beaker configobj decorator dulwich hgsubversion hg-evolve infrae.cache mercurial msgpack-python pyramid pyramid-jinja2 pyramid-mako repoze.lru simplejson subprocess32 subvertpy six translationstring WebOb wheel zope.deprecation zope.interface ipdb ipython gevent greenlet gunicorn waitress pytest py pytest-cov pytest-sugar pytest-runner pytest-catchlog pytest-profiling gprof2dot pytest-timeout mock WebTest cov-core coverage];
660 660 src = ./.;
661 661 meta = {
662 662 license = [ { fullName = "GPL V3"; } { fullName = "GNU General Public License v3 or later (GPLv3+)"; } ];
663 663 };
664 664 };
665 665 scandir = super.buildPythonPackage {
666 666 name = "scandir-1.6";
667 667 buildInputs = with self; [];
668 668 doCheck = false;
669 669 propagatedBuildInputs = with self; [];
670 670 src = fetchurl {
671 671 url = "https://pypi.python.org/packages/77/3f/916f524f50ee65e3f465a280d2851bd63685250fddb3020c212b3977664d/scandir-1.6.tar.gz";
672 672 md5 = "0180ddb97c96cbb2d4f25d2ae11c64ac";
673 673 };
674 674 meta = {
675 675 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "New BSD License"; } ];
676 676 };
677 677 };
678 678 setuptools = super.buildPythonPackage {
679 679 name = "setuptools-30.1.0";
680 680 buildInputs = with self; [];
681 681 doCheck = false;
682 682 propagatedBuildInputs = with self; [];
683 683 src = fetchurl {
684 684 url = "https://pypi.python.org/packages/1e/43/002c8616db9a3e7be23c2556e39b90a32bb40ba0dc652de1999d5334d372/setuptools-30.1.0.tar.gz";
685 685 md5 = "cac497f42e5096ac8df29e38d3f81c3e";
686 686 };
687 687 meta = {
688 688 license = [ pkgs.lib.licenses.mit ];
689 689 };
690 690 };
691 691 simplegeneric = super.buildPythonPackage {
692 692 name = "simplegeneric-0.8.1";
693 693 buildInputs = with self; [];
694 694 doCheck = false;
695 695 propagatedBuildInputs = with self; [];
696 696 src = fetchurl {
697 697 url = "https://pypi.python.org/packages/3d/57/4d9c9e3ae9a255cd4e1106bb57e24056d3d0709fc01b2e3e345898e49d5b/simplegeneric-0.8.1.zip";
698 698 md5 = "f9c1fab00fd981be588fc32759f474e3";
699 699 };
700 700 meta = {
701 701 license = [ pkgs.lib.licenses.zpt21 ];
702 702 };
703 703 };
704 704 simplejson = super.buildPythonPackage {
705 705 name = "simplejson-3.11.1";
706 706 buildInputs = with self; [];
707 707 doCheck = false;
708 708 propagatedBuildInputs = with self; [];
709 709 src = fetchurl {
710 710 url = "https://pypi.python.org/packages/08/48/c97b668d6da7d7bebe7ea1817a6f76394b0ec959cb04214ca833c34359df/simplejson-3.11.1.tar.gz";
711 711 md5 = "6e2f1bd5fb0a926facf5d89d217a7183";
712 712 };
713 713 meta = {
714 714 license = [ { fullName = "Academic Free License (AFL)"; } pkgs.lib.licenses.mit ];
715 715 };
716 716 };
717 717 six = super.buildPythonPackage {
718 718 name = "six-1.11.0";
719 719 buildInputs = with self; [];
720 720 doCheck = false;
721 721 propagatedBuildInputs = with self; [];
722 722 src = fetchurl {
723 723 url = "https://pypi.python.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six-1.11.0.tar.gz";
724 724 md5 = "d12789f9baf7e9fb2524c0c64f1773f8";
725 725 };
726 726 meta = {
727 727 license = [ pkgs.lib.licenses.mit ];
728 728 };
729 729 };
730 730 subprocess32 = super.buildPythonPackage {
731 731 name = "subprocess32-3.2.7";
732 732 buildInputs = with self; [];
733 733 doCheck = false;
734 734 propagatedBuildInputs = with self; [];
735 735 src = fetchurl {
736 736 url = "https://pypi.python.org/packages/b8/2f/49e53b0d0e94611a2dc624a1ad24d41b6d94d0f1b0a078443407ea2214c2/subprocess32-3.2.7.tar.gz";
737 737 md5 = "824c801e479d3e916879aae3e9c15e16";
738 738 };
739 739 meta = {
740 740 license = [ pkgs.lib.licenses.psfl ];
741 741 };
742 742 };
743 743 subvertpy = super.buildPythonPackage {
744 744 name = "subvertpy-0.10.1";
745 745 buildInputs = with self; [];
746 746 doCheck = false;
747 747 propagatedBuildInputs = with self; [];
748 748 src = fetchurl {
749 749 url = "https://pypi.python.org/packages/9d/76/99fa82affce75f5ac0f7dbe513796c3f37311ace0c68e1b063683b4f9b99/subvertpy-0.10.1.tar.gz";
750 750 md5 = "a70e03579902d480f5e9f8c570f6536b";
751 751 };
752 752 meta = {
753 753 license = [ pkgs.lib.licenses.lgpl21Plus pkgs.lib.licenses.gpl2Plus ];
754 754 };
755 755 };
756 756 termcolor = super.buildPythonPackage {
757 757 name = "termcolor-1.1.0";
758 758 buildInputs = with self; [];
759 759 doCheck = false;
760 760 propagatedBuildInputs = with self; [];
761 761 src = fetchurl {
762 762 url = "https://pypi.python.org/packages/8a/48/a76be51647d0eb9f10e2a4511bf3ffb8cc1e6b14e9e4fab46173aa79f981/termcolor-1.1.0.tar.gz";
763 763 md5 = "043e89644f8909d462fbbfa511c768df";
764 764 };
765 765 meta = {
766 766 license = [ pkgs.lib.licenses.mit ];
767 767 };
768 768 };
769 769 traitlets = super.buildPythonPackage {
770 770 name = "traitlets-4.3.2";
771 771 buildInputs = with self; [];
772 772 doCheck = false;
773 773 propagatedBuildInputs = with self; [ipython-genutils six decorator enum34];
774 774 src = fetchurl {
775 775 url = "https://pypi.python.org/packages/a5/98/7f5ef2fe9e9e071813aaf9cb91d1a732e0a68b6c44a32b38cb8e14c3f069/traitlets-4.3.2.tar.gz";
776 776 md5 = "3068663f2f38fd939a9eb3a500ccc154";
777 777 };
778 778 meta = {
779 779 license = [ pkgs.lib.licenses.bsdOriginal ];
780 780 };
781 781 };
782 782 translationstring = super.buildPythonPackage {
783 783 name = "translationstring-1.3";
784 784 buildInputs = with self; [];
785 785 doCheck = false;
786 786 propagatedBuildInputs = with self; [];
787 787 src = fetchurl {
788 788 url = "https://pypi.python.org/packages/5e/eb/bee578cc150b44c653b63f5ebe258b5d0d812ddac12497e5f80fcad5d0b4/translationstring-1.3.tar.gz";
789 789 md5 = "a4b62e0f3c189c783a1685b3027f7c90";
790 790 };
791 791 meta = {
792 792 license = [ { fullName = "BSD-like (http://repoze.org/license.html)"; } ];
793 793 };
794 794 };
795 795 venusian = super.buildPythonPackage {
796 796 name = "venusian-1.1.0";
797 797 buildInputs = with self; [];
798 798 doCheck = false;
799 799 propagatedBuildInputs = with self; [];
800 800 src = fetchurl {
801 801 url = "https://pypi.python.org/packages/38/24/b4b470ab9e0a2e2e9b9030c7735828c8934b4c6b45befd1bb713ec2aeb2d/venusian-1.1.0.tar.gz";
802 802 md5 = "56bc5e6756e4bda37bcdb94f74a72b8f";
803 803 };
804 804 meta = {
805 805 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
806 806 };
807 807 };
808 808 waitress = super.buildPythonPackage {
809 809 name = "waitress-1.1.0";
810 810 buildInputs = with self; [];
811 811 doCheck = false;
812 812 propagatedBuildInputs = with self; [];
813 813 src = fetchurl {
814 814 url = "https://pypi.python.org/packages/3c/68/1c10dd5c556872ceebe88483b0436140048d39de83a84a06a8baa8136f4f/waitress-1.1.0.tar.gz";
815 815 md5 = "0f1eb7fdfdbf2e6d18decbda1733045c";
816 816 };
817 817 meta = {
818 818 license = [ pkgs.lib.licenses.zpt21 ];
819 819 };
820 820 };
821 821 wcwidth = super.buildPythonPackage {
822 822 name = "wcwidth-0.1.7";
823 823 buildInputs = with self; [];
824 824 doCheck = false;
825 825 propagatedBuildInputs = with self; [];
826 826 src = fetchurl {
827 827 url = "https://pypi.python.org/packages/55/11/e4a2bb08bb450fdbd42cc709dd40de4ed2c472cf0ccb9e64af22279c5495/wcwidth-0.1.7.tar.gz";
828 828 md5 = "b3b6a0a08f0c8a34d1de8cf44150a4ad";
829 829 };
830 830 meta = {
831 831 license = [ pkgs.lib.licenses.mit ];
832 832 };
833 833 };
834 834 wheel = super.buildPythonPackage {
835 835 name = "wheel-0.29.0";
836 836 buildInputs = with self; [];
837 837 doCheck = false;
838 838 propagatedBuildInputs = with self; [];
839 839 src = fetchurl {
840 840 url = "https://pypi.python.org/packages/c9/1d/bd19e691fd4cfe908c76c429fe6e4436c9e83583c4414b54f6c85471954a/wheel-0.29.0.tar.gz";
841 841 md5 = "555a67e4507cedee23a0deb9651e452f";
842 842 };
843 843 meta = {
844 844 license = [ pkgs.lib.licenses.mit ];
845 845 };
846 846 };
847 847 zope.deprecation = super.buildPythonPackage {
848 848 name = "zope.deprecation-4.1.2";
849 849 buildInputs = with self; [];
850 850 doCheck = false;
851 851 propagatedBuildInputs = with self; [setuptools];
852 852 src = fetchurl {
853 853 url = "https://pypi.python.org/packages/c1/d3/3919492d5e57d8dd01b36f30b34fc8404a30577392b1eb817c303499ad20/zope.deprecation-4.1.2.tar.gz";
854 854 md5 = "e9a663ded58f4f9f7881beb56cae2782";
855 855 };
856 856 meta = {
857 857 license = [ pkgs.lib.licenses.zpt21 ];
858 858 };
859 859 };
860 860 zope.interface = super.buildPythonPackage {
861 861 name = "zope.interface-4.1.3";
862 862 buildInputs = with self; [];
863 863 doCheck = false;
864 864 propagatedBuildInputs = with self; [setuptools];
865 865 src = fetchurl {
866 866 url = "https://pypi.python.org/packages/9d/81/2509ca3c6f59080123c1a8a97125eb48414022618cec0e64eb1313727bfe/zope.interface-4.1.3.tar.gz";
867 867 md5 = "9ae3d24c0c7415deb249dd1a132f0f79";
868 868 };
869 869 meta = {
870 870 license = [ pkgs.lib.licenses.zpt21 ];
871 871 };
872 872 };
873 873
874 874 ### Test requirements
875 875
876 876
877 877 }
@@ -1,481 +1,484 b''
1 1 """
2 2 Module provides a class allowing to wrap communication over subprocess.Popen
3 3 input, output, error streams into a meaningfull, non-blocking, concurrent
4 4 stream processor exposing the output data as an iterator fitting to be a
5 5 return value passed by a WSGI applicaiton to a WSGI server per PEP 3333.
6 6
7 7 Copyright (c) 2011 Daniel Dotsenko <dotsa[at]hotmail.com>
8 8
9 9 This file is part of git_http_backend.py Project.
10 10
11 11 git_http_backend.py Project is free software: you can redistribute it and/or
12 12 modify it under the terms of the GNU Lesser General Public License as
13 13 published by the Free Software Foundation, either version 2.1 of the License,
14 14 or (at your option) any later version.
15 15
16 16 git_http_backend.py Project is distributed in the hope that it will be useful,
17 17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 19 GNU Lesser General Public License for more details.
20 20
21 21 You should have received a copy of the GNU Lesser General Public License
22 22 along with git_http_backend.py Project.
23 23 If not, see <http://www.gnu.org/licenses/>.
24 24 """
25 25 import os
26 import logging
26 27 import subprocess32 as subprocess
27 28 from collections import deque
28 29 from threading import Event, Thread
29 30
31 log = logging.getLogger(__name__)
32
30 33
31 34 class StreamFeeder(Thread):
32 35 """
33 36 Normal writing into pipe-like is blocking once the buffer is filled.
34 37 This thread allows a thread to seep data from a file-like into a pipe
35 38 without blocking the main thread.
36 39 We close inpipe once the end of the source stream is reached.
37 40 """
38 41
39 42 def __init__(self, source):
40 43 super(StreamFeeder, self).__init__()
41 44 self.daemon = True
42 45 filelike = False
43 46 self.bytes = bytes()
44 47 if type(source) in (type(''), bytes, bytearray): # string-like
45 48 self.bytes = bytes(source)
46 49 else: # can be either file pointer or file-like
47 50 if type(source) in (int, long): # file pointer it is
48 51 # converting file descriptor (int) stdin into file-like
49 52 try:
50 53 source = os.fdopen(source, 'rb', 16384)
51 54 except Exception:
52 55 pass
53 56 # let's see if source is file-like by now
54 57 try:
55 58 filelike = source.read
56 59 except Exception:
57 60 pass
58 61 if not filelike and not self.bytes:
59 62 raise TypeError("StreamFeeder's source object must be a readable "
60 63 "file-like, a file descriptor, or a string-like.")
61 64 self.source = source
62 65 self.readiface, self.writeiface = os.pipe()
63 66
64 67 def run(self):
65 68 t = self.writeiface
66 69 if self.bytes:
67 70 os.write(t, self.bytes)
68 71 else:
69 72 s = self.source
70 73 b = s.read(4096)
71 74 while b:
72 75 os.write(t, b)
73 76 b = s.read(4096)
74 77 os.close(t)
75 78
76 79 @property
77 80 def output(self):
78 81 return self.readiface
79 82
80 83
81 84 class InputStreamChunker(Thread):
82 85 def __init__(self, source, target, buffer_size, chunk_size):
83 86
84 87 super(InputStreamChunker, self).__init__()
85 88
86 89 self.daemon = True # die die die.
87 90
88 91 self.source = source
89 92 self.target = target
90 93 self.chunk_count_max = int(buffer_size / chunk_size) + 1
91 94 self.chunk_size = chunk_size
92 95
93 96 self.data_added = Event()
94 97 self.data_added.clear()
95 98
96 99 self.keep_reading = Event()
97 100 self.keep_reading.set()
98 101
99 102 self.EOF = Event()
100 103 self.EOF.clear()
101 104
102 105 self.go = Event()
103 106 self.go.set()
104 107
105 108 def stop(self):
106 109 self.go.clear()
107 110 self.EOF.set()
108 111 try:
109 112 # this is not proper, but is done to force the reader thread let
110 113 # go of the input because, if successful, .close() will send EOF
111 114 # down the pipe.
112 115 self.source.close()
113 116 except:
114 117 pass
115 118
116 119 def run(self):
117 120 s = self.source
118 121 t = self.target
119 122 cs = self.chunk_size
120 ccm = self.chunk_count_max
123 chunk_count_max = self.chunk_count_max
121 124 keep_reading = self.keep_reading
122 125 da = self.data_added
123 126 go = self.go
124 127
125 128 try:
126 129 b = s.read(cs)
127 130 except ValueError:
128 131 b = ''
129 132
133 timeout_input = 20
130 134 while b and go.is_set():
131 if len(t) > ccm:
135 if len(t) > chunk_count_max:
132 136 keep_reading.clear()
133 keep_reading.wait(2)
134
135 if not keep_reading.wait(10):
136 raise Exception(
137 "Timed out while waiting for input to be read.")
137 keep_reading.wait(timeout_input)
138 if len(t) > chunk_count_max + timeout_input:
139 log.error("Timed out while waiting for input from subprocess.")
140 os._exit(-1) # this will cause the worker to recycle itself
138 141
139 142 t.append(b)
140 143 da.set()
141 144 b = s.read(cs)
142 145 self.EOF.set()
143 146 da.set() # for cases when done but there was no input.
144 147
145 148
146 149 class BufferedGenerator(object):
147 150 """
148 151 Class behaves as a non-blocking, buffered pipe reader.
149 152 Reads chunks of data (through a thread)
150 153 from a blocking pipe, and attaches these to an array (Deque) of chunks.
151 154 Reading is halted in the thread when max chunks is internally buffered.
152 155 The .next() may operate in blocking or non-blocking fashion by yielding
153 156 '' if no data is ready
154 157 to be sent or by not returning until there is some data to send
155 158 When we get EOF from underlying source pipe we raise the marker to raise
156 159 StopIteration after the last chunk of data is yielded.
157 160 """
158 161
159 162 def __init__(self, source, buffer_size=65536, chunk_size=4096,
160 163 starting_values=None, bottomless=False):
161 164 starting_values = starting_values or []
162 165
163 166 if bottomless:
164 167 maxlen = int(buffer_size / chunk_size)
165 168 else:
166 169 maxlen = None
167 170
168 171 self.data = deque(starting_values, maxlen)
169 172 self.worker = InputStreamChunker(source, self.data, buffer_size,
170 173 chunk_size)
171 174 if starting_values:
172 175 self.worker.data_added.set()
173 176 self.worker.start()
174 177
175 178 ####################
176 179 # Generator's methods
177 180 ####################
178 181
179 182 def __iter__(self):
180 183 return self
181 184
182 185 def next(self):
183 186 while not len(self.data) and not self.worker.EOF.is_set():
184 187 self.worker.data_added.clear()
185 188 self.worker.data_added.wait(0.2)
186 189 if len(self.data):
187 190 self.worker.keep_reading.set()
188 191 return bytes(self.data.popleft())
189 192 elif self.worker.EOF.is_set():
190 193 raise StopIteration
191 194
192 195 def throw(self, exc_type, value=None, traceback=None):
193 196 if not self.worker.EOF.is_set():
194 197 raise exc_type(value)
195 198
196 199 def start(self):
197 200 self.worker.start()
198 201
199 202 def stop(self):
200 203 self.worker.stop()
201 204
202 205 def close(self):
203 206 try:
204 207 self.worker.stop()
205 208 self.throw(GeneratorExit)
206 209 except (GeneratorExit, StopIteration):
207 210 pass
208 211
209 212 def __del__(self):
210 213 self.close()
211 214
212 215 ####################
213 216 # Threaded reader's infrastructure.
214 217 ####################
215 218 @property
216 219 def input(self):
217 220 return self.worker.w
218 221
219 222 @property
220 223 def data_added_event(self):
221 224 return self.worker.data_added
222 225
223 226 @property
224 227 def data_added(self):
225 228 return self.worker.data_added.is_set()
226 229
227 230 @property
228 231 def reading_paused(self):
229 232 return not self.worker.keep_reading.is_set()
230 233
231 234 @property
232 235 def done_reading_event(self):
233 236 """
234 237 Done_reding does not mean that the iterator's buffer is empty.
235 238 Iterator might have done reading from underlying source, but the read
236 239 chunks might still be available for serving through .next() method.
237 240
238 241 :returns: An Event class instance.
239 242 """
240 243 return self.worker.EOF
241 244
242 245 @property
243 246 def done_reading(self):
244 247 """
245 248 Done_reding does not mean that the iterator's buffer is empty.
246 249 Iterator might have done reading from underlying source, but the read
247 250 chunks might still be available for serving through .next() method.
248 251
249 252 :returns: An Bool value.
250 253 """
251 254 return self.worker.EOF.is_set()
252 255
253 256 @property
254 257 def length(self):
255 258 """
256 259 returns int.
257 260
258 261 This is the lenght of the que of chunks, not the length of
259 262 the combined contents in those chunks.
260 263
261 264 __len__() cannot be meaningfully implemented because this
262 265 reader is just flying throuh a bottomless pit content and
263 266 can only know the lenght of what it already saw.
264 267
265 268 If __len__() on WSGI server per PEP 3333 returns a value,
266 269 the responce's length will be set to that. In order not to
267 270 confuse WSGI PEP3333 servers, we will not implement __len__
268 271 at all.
269 272 """
270 273 return len(self.data)
271 274
272 275 def prepend(self, x):
273 276 self.data.appendleft(x)
274 277
275 278 def append(self, x):
276 279 self.data.append(x)
277 280
278 281 def extend(self, o):
279 282 self.data.extend(o)
280 283
281 284 def __getitem__(self, i):
282 285 return self.data[i]
283 286
284 287
285 288 class SubprocessIOChunker(object):
286 289 """
287 290 Processor class wrapping handling of subprocess IO.
288 291
289 292 .. important::
290 293
291 294 Watch out for the method `__del__` on this class. If this object
292 295 is deleted, it will kill the subprocess, so avoid to
293 296 return the `output` attribute or usage of it like in the following
294 297 example::
295 298
296 299 # `args` expected to run a program that produces a lot of output
297 300 output = ''.join(SubprocessIOChunker(
298 301 args, shell=False, inputstream=inputstream, env=environ).output)
299 302
300 303 # `output` will not contain all the data, because the __del__ method
301 304 # has already killed the subprocess in this case before all output
302 305 # has been consumed.
303 306
304 307
305 308
306 309 In a way, this is a "communicate()" replacement with a twist.
307 310
308 311 - We are multithreaded. Writing in and reading out, err are all sep threads.
309 312 - We support concurrent (in and out) stream processing.
310 313 - The output is not a stream. It's a queue of read string (bytes, not unicode)
311 314 chunks. The object behaves as an iterable. You can "for chunk in obj:" us.
312 315 - We are non-blocking in more respects than communicate()
313 316 (reading from subprocess out pauses when internal buffer is full, but
314 317 does not block the parent calling code. On the flip side, reading from
315 318 slow-yielding subprocess may block the iteration until data shows up. This
316 319 does not block the parallel inpipe reading occurring parallel thread.)
317 320
318 321 The purpose of the object is to allow us to wrap subprocess interactions into
319 322 and interable that can be passed to a WSGI server as the application's return
320 323 value. Because of stream-processing-ability, WSGI does not have to read ALL
321 324 of the subprocess's output and buffer it, before handing it to WSGI server for
322 325 HTTP response. Instead, the class initializer reads just a bit of the stream
323 326 to figure out if error ocurred or likely to occur and if not, just hands the
324 327 further iteration over subprocess output to the server for completion of HTTP
325 328 response.
326 329
327 330 The real or perceived subprocess error is trapped and raised as one of
328 331 EnvironmentError family of exceptions
329 332
330 333 Example usage:
331 334 # try:
332 335 # answer = SubprocessIOChunker(
333 336 # cmd,
334 337 # input,
335 338 # buffer_size = 65536,
336 339 # chunk_size = 4096
337 340 # )
338 341 # except (EnvironmentError) as e:
339 342 # print str(e)
340 343 # raise e
341 344 #
342 345 # return answer
343 346
344 347
345 348 """
346 349
347 350 # TODO: johbo: This is used to make sure that the open end of the PIPE
348 351 # is closed in the end. It would be way better to wrap this into an
349 352 # object, so that it is closed automatically once it is consumed or
350 353 # something similar.
351 354 _close_input_fd = None
352 355
353 356 _closed = False
354 357
355 358 def __init__(self, cmd, inputstream=None, buffer_size=65536,
356 359 chunk_size=4096, starting_values=None, fail_on_stderr=True,
357 360 fail_on_return_code=True, **kwargs):
358 361 """
359 362 Initializes SubprocessIOChunker
360 363
361 364 :param cmd: A Subprocess.Popen style "cmd". Can be string or array of strings
362 365 :param inputstream: (Default: None) A file-like, string, or file pointer.
363 366 :param buffer_size: (Default: 65536) A size of total buffer per stream in bytes.
364 367 :param chunk_size: (Default: 4096) A max size of a chunk. Actual chunk may be smaller.
365 368 :param starting_values: (Default: []) An array of strings to put in front of output que.
366 369 :param fail_on_stderr: (Default: True) Whether to raise an exception in
367 370 case something is written to stderr.
368 371 :param fail_on_return_code: (Default: True) Whether to raise an
369 372 exception if the return code is not 0.
370 373 """
371 374
372 375 starting_values = starting_values or []
373 376 if inputstream:
374 377 input_streamer = StreamFeeder(inputstream)
375 378 input_streamer.start()
376 379 inputstream = input_streamer.output
377 380 self._close_input_fd = inputstream
378 381
379 382 self._fail_on_stderr = fail_on_stderr
380 383 self._fail_on_return_code = fail_on_return_code
381 384
382 385 _shell = kwargs.get('shell', True)
383 386 kwargs['shell'] = _shell
384 387
385 388 _p = subprocess.Popen(cmd, bufsize=-1,
386 389 stdin=inputstream,
387 390 stdout=subprocess.PIPE,
388 391 stderr=subprocess.PIPE,
389 392 **kwargs)
390 393
391 394 bg_out = BufferedGenerator(_p.stdout, buffer_size, chunk_size,
392 395 starting_values)
393 396 bg_err = BufferedGenerator(_p.stderr, 16000, 1, bottomless=True)
394 397
395 398 while not bg_out.done_reading and not bg_out.reading_paused and not bg_err.length:
396 399 # doing this until we reach either end of file, or end of buffer.
397 400 bg_out.data_added_event.wait(1)
398 401 bg_out.data_added_event.clear()
399 402
400 403 # at this point it's still ambiguous if we are done reading or just full buffer.
401 404 # Either way, if error (returned by ended process, or implied based on
402 405 # presence of stuff in stderr output) we error out.
403 406 # Else, we are happy.
404 407 _returncode = _p.poll()
405 408
406 409 if ((_returncode and fail_on_return_code) or
407 410 (fail_on_stderr and _returncode is None and bg_err.length)):
408 411 try:
409 412 _p.terminate()
410 413 except Exception:
411 414 pass
412 415 bg_out.stop()
413 416 bg_err.stop()
414 417 if fail_on_stderr:
415 418 err = ''.join(bg_err)
416 419 raise EnvironmentError(
417 420 "Subprocess exited due to an error:\n" + err)
418 421 if _returncode and fail_on_return_code:
419 422 err = ''.join(bg_err)
420 423 if not err:
421 424 # maybe get empty stderr, try stdout instead
422 425 # in many cases git reports the errors on stdout too
423 426 err = ''.join(bg_out)
424 427 raise EnvironmentError(
425 428 "Subprocess exited with non 0 ret code:%s: stderr:%s" % (
426 429 _returncode, err))
427 430
428 431 self.process = _p
429 432 self.output = bg_out
430 433 self.error = bg_err
431 434
432 435 def __iter__(self):
433 436 return self
434 437
435 438 def next(self):
436 439 # Note: mikhail: We need to be sure that we are checking the return
437 440 # code after the stdout stream is closed. Some processes, e.g. git
438 441 # are doing some magic in between closing stdout and terminating the
439 442 # process and, as a result, we are not getting return code on "slow"
440 443 # systems.
441 444 result = None
442 445 stop_iteration = None
443 446 try:
444 447 result = self.output.next()
445 448 except StopIteration as e:
446 449 stop_iteration = e
447 450
448 451 if self.process.poll() and self._fail_on_return_code:
449 452 err = '%s' % ''.join(self.error)
450 453 raise EnvironmentError(
451 454 "Subprocess exited due to an error:\n" + err)
452 455
453 456 if stop_iteration:
454 457 raise stop_iteration
455 458 return result
456 459
457 460 def throw(self, type, value=None, traceback=None):
458 461 if self.output.length or not self.output.done_reading:
459 462 raise type(value)
460 463
461 464 def close(self):
462 465 if self._closed:
463 466 return
464 467 self._closed = True
465 468 try:
466 469 self.process.terminate()
467 470 except:
468 471 pass
469 472 if self._close_input_fd:
470 473 os.close(self._close_input_fd)
471 474 try:
472 475 self.output.close()
473 476 except:
474 477 pass
475 478 try:
476 479 self.error.close()
477 480 except:
478 481 pass
479 482
480 483 def __del__(self):
481 484 self.close()
General Comments 0
You need to be logged in to leave comments. Login now