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