##// END OF EJS Templates
jupyter-rendering: add required packaging to handle rendering of jupyter notebooks....
marcink -
r1488:0c731082 default
parent child Browse files
Show More
@@ -1,261 +1,268 b''
1 # Overrides for the generated python-packages.nix
1 # Overrides for the generated python-packages.nix
2 #
2 #
3 # This function is intended to be used as an extension to the generated file
3 # This function is intended to be used as an extension to the generated file
4 # python-packages.nix. The main objective is to add needed dependencies of C
4 # python-packages.nix. The main objective is to add needed dependencies of C
5 # libraries and tweak the build instructions where needed.
5 # libraries and tweak the build instructions where needed.
6
6
7 { pkgs, basePythonPackages }:
7 { pkgs, basePythonPackages }:
8
8
9 let
9 let
10 sed = "sed -i";
10 sed = "sed -i";
11 localLicenses = {
11 localLicenses = {
12 repoze = {
12 repoze = {
13 fullName = "Repoze License";
13 fullName = "Repoze License";
14 url = http://www.repoze.org/LICENSE.txt;
14 url = http://www.repoze.org/LICENSE.txt;
15 };
15 };
16 };
16 };
17
17
18 in
18 in
19
19
20 self: super: {
20 self: super: {
21
21
22 appenlight-client = super.appenlight-client.override (attrs: {
22 appenlight-client = super.appenlight-client.override (attrs: {
23 meta = {
23 meta = {
24 license = [ pkgs.lib.licenses.bsdOriginal ];
24 license = [ pkgs.lib.licenses.bsdOriginal ];
25 };
25 };
26 });
26 });
27
27
28 future = super.future.override (attrs: {
28 future = super.future.override (attrs: {
29 meta = {
29 meta = {
30 license = [ pkgs.lib.licenses.mit ];
30 license = [ pkgs.lib.licenses.mit ];
31 };
31 };
32 });
32 });
33
33
34 gnureadline = super.gnureadline.override (attrs: {
34 gnureadline = super.gnureadline.override (attrs: {
35 buildInputs = attrs.buildInputs ++ [
35 buildInputs = attrs.buildInputs ++ [
36 pkgs.ncurses
36 pkgs.ncurses
37 ];
37 ];
38 patchPhase = ''
38 patchPhase = ''
39 substituteInPlace setup.py --replace "/bin/bash" "${pkgs.bash}/bin/bash"
39 substituteInPlace setup.py --replace "/bin/bash" "${pkgs.bash}/bin/bash"
40 '';
40 '';
41 });
41 });
42
42
43 gunicorn = super.gunicorn.override (attrs: {
43 gunicorn = super.gunicorn.override (attrs: {
44 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
44 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
45 # johbo: futures is needed as long as we are on Python 2, otherwise
45 # johbo: futures is needed as long as we are on Python 2, otherwise
46 # gunicorn explodes if used with multiple threads per worker.
46 # gunicorn explodes if used with multiple threads per worker.
47 self.futures
47 self.futures
48 ];
48 ];
49 });
49 });
50
50
51 nbconvert = super.nbconvert.override (attrs: {
52 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
53 # marcink: plug in jupyter-client for notebook rendering
54 self.jupyter-client
55 ];
56 });
57
51 ipython = super.ipython.override (attrs: {
58 ipython = super.ipython.override (attrs: {
52 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
59 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
53 self.gnureadline
60 self.gnureadline
54 ];
61 ];
55 });
62 });
56
63
57 kombu = super.kombu.override (attrs: {
64 kombu = super.kombu.override (attrs: {
58 # The current version of kombu needs some patching to work with the
65 # The current version of kombu needs some patching to work with the
59 # other libs. Should be removed once we update celery and kombu.
66 # other libs. Should be removed once we update celery and kombu.
60 patches = [
67 patches = [
61 ./patch-kombu-py-2-7-11.diff
68 ./patch-kombu-py-2-7-11.diff
62 ./patch-kombu-msgpack.diff
69 ./patch-kombu-msgpack.diff
63 ];
70 ];
64 });
71 });
65
72
66 lxml = super.lxml.override (attrs: {
73 lxml = super.lxml.override (attrs: {
67 # johbo: On 16.09 we need this to compile on darwin, otherwise compilation
74 # johbo: On 16.09 we need this to compile on darwin, otherwise compilation
68 # fails on Darwin.
75 # fails on Darwin.
69 hardeningDisable = if pkgs.stdenv.isDarwin then [ "format" ] else null;
76 hardeningDisable = if pkgs.stdenv.isDarwin then [ "format" ] else null;
70 buildInputs = with self; [
77 buildInputs = with self; [
71 pkgs.libxml2
78 pkgs.libxml2
72 pkgs.libxslt
79 pkgs.libxslt
73 ];
80 ];
74 });
81 });
75
82
76 MySQL-python = super.MySQL-python.override (attrs: {
83 MySQL-python = super.MySQL-python.override (attrs: {
77 buildInputs = attrs.buildInputs ++ [
84 buildInputs = attrs.buildInputs ++ [
78 pkgs.openssl
85 pkgs.openssl
79 ];
86 ];
80 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
87 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
81 pkgs.mysql.lib
88 pkgs.mysql.lib
82 pkgs.zlib
89 pkgs.zlib
83 ];
90 ];
84 });
91 });
85
92
86 psutil = super.psutil.override (attrs: {
93 psutil = super.psutil.override (attrs: {
87 buildInputs = attrs.buildInputs ++
94 buildInputs = attrs.buildInputs ++
88 pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.darwin.IOKit;
95 pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.darwin.IOKit;
89 });
96 });
90
97
91 psycopg2 = super.psycopg2.override (attrs: {
98 psycopg2 = super.psycopg2.override (attrs: {
92 buildInputs = attrs.buildInputs ++
99 buildInputs = attrs.buildInputs ++
93 pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.openssl;
100 pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.openssl;
94 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
101 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
95 pkgs.postgresql
102 pkgs.postgresql
96 ];
103 ];
97 meta = {
104 meta = {
98 license = pkgs.lib.licenses.lgpl3Plus;
105 license = pkgs.lib.licenses.lgpl3Plus;
99 };
106 };
100 });
107 });
101
108
102 py-gfm = super.py-gfm.override {
109 py-gfm = super.py-gfm.override {
103 name = "py-gfm-0.1.3.rhodecode-upstream1";
110 name = "py-gfm-0.1.3.rhodecode-upstream1";
104 };
111 };
105
112
106 pycurl = super.pycurl.override (attrs: {
113 pycurl = super.pycurl.override (attrs: {
107 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
114 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
108 pkgs.curl
115 pkgs.curl
109 pkgs.openssl
116 pkgs.openssl
110 ];
117 ];
111 preConfigure = ''
118 preConfigure = ''
112 substituteInPlace setup.py --replace '--static-libs' '--libs'
119 substituteInPlace setup.py --replace '--static-libs' '--libs'
113 export PYCURL_SSL_LIBRARY=openssl
120 export PYCURL_SSL_LIBRARY=openssl
114 '';
121 '';
115 meta = {
122 meta = {
116 # TODO: It is LGPL and MIT
123 # TODO: It is LGPL and MIT
117 license = pkgs.lib.licenses.mit;
124 license = pkgs.lib.licenses.mit;
118 };
125 };
119 });
126 });
120
127
121 Pylons = super.Pylons.override (attrs: {
128 Pylons = super.Pylons.override (attrs: {
122 name = "Pylons-1.0.2.rhodecode-patch1";
129 name = "Pylons-1.0.2.rhodecode-patch1";
123 });
130 });
124
131
125 pyramid = super.pyramid.override (attrs: {
132 pyramid = super.pyramid.override (attrs: {
126 postFixup = ''
133 postFixup = ''
127 wrapPythonPrograms
134 wrapPythonPrograms
128 # TODO: johbo: "wrapPython" adds this magic line which
135 # TODO: johbo: "wrapPython" adds this magic line which
129 # confuses pserve.
136 # confuses pserve.
130 ${sed} '/import sys; sys.argv/d' $out/bin/.pserve-wrapped
137 ${sed} '/import sys; sys.argv/d' $out/bin/.pserve-wrapped
131 '';
138 '';
132 meta = {
139 meta = {
133 license = localLicenses.repoze;
140 license = localLicenses.repoze;
134 };
141 };
135 });
142 });
136
143
137 pyramid-debugtoolbar = super.pyramid-debugtoolbar.override (attrs: {
144 pyramid-debugtoolbar = super.pyramid-debugtoolbar.override (attrs: {
138 meta = {
145 meta = {
139 license = [ pkgs.lib.licenses.bsdOriginal localLicenses.repoze ];
146 license = [ pkgs.lib.licenses.bsdOriginal localLicenses.repoze ];
140 };
147 };
141 });
148 });
142
149
143 pysqlite = super.pysqlite.override (attrs: {
150 pysqlite = super.pysqlite.override (attrs: {
144 propagatedBuildInputs = [
151 propagatedBuildInputs = [
145 pkgs.sqlite
152 pkgs.sqlite
146 ];
153 ];
147 meta = {
154 meta = {
148 license = [ pkgs.lib.licenses.zlib pkgs.lib.licenses.libpng ];
155 license = [ pkgs.lib.licenses.zlib pkgs.lib.licenses.libpng ];
149 };
156 };
150 });
157 });
151
158
152 pytest-runner = super.pytest-runner.override (attrs: {
159 pytest-runner = super.pytest-runner.override (attrs: {
153 propagatedBuildInputs = [
160 propagatedBuildInputs = [
154 self.setuptools-scm
161 self.setuptools-scm
155 ];
162 ];
156 });
163 });
157
164
158 python-ldap = super.python-ldap.override (attrs: {
165 python-ldap = super.python-ldap.override (attrs: {
159 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
166 propagatedBuildInputs = attrs.propagatedBuildInputs ++ [
160 pkgs.cyrus_sasl
167 pkgs.cyrus_sasl
161 pkgs.openldap
168 pkgs.openldap
162 pkgs.openssl
169 pkgs.openssl
163 ];
170 ];
164 # TODO: johbo: Remove the "or" once we drop 16.03 support.
171 # TODO: johbo: Remove the "or" once we drop 16.03 support.
165 NIX_CFLAGS_COMPILE = "-I${pkgs.cyrus_sasl.dev or pkgs.cyrus_sasl}/include/sasl";
172 NIX_CFLAGS_COMPILE = "-I${pkgs.cyrus_sasl.dev or pkgs.cyrus_sasl}/include/sasl";
166 });
173 });
167
174
168 python-pam = super.python-pam.override (attrs:
175 python-pam = super.python-pam.override (attrs:
169 let
176 let
170 includeLibPam = pkgs.stdenv.isLinux;
177 includeLibPam = pkgs.stdenv.isLinux;
171 in {
178 in {
172 # TODO: johbo: Move the option up into the default.nix, we should
179 # TODO: johbo: Move the option up into the default.nix, we should
173 # include python-pam only on supported platforms.
180 # include python-pam only on supported platforms.
174 propagatedBuildInputs = attrs.propagatedBuildInputs ++
181 propagatedBuildInputs = attrs.propagatedBuildInputs ++
175 pkgs.lib.optional includeLibPam [
182 pkgs.lib.optional includeLibPam [
176 pkgs.pam
183 pkgs.pam
177 ];
184 ];
178 # TODO: johbo: Check if this can be avoided, or transform into
185 # TODO: johbo: Check if this can be avoided, or transform into
179 # a real patch
186 # a real patch
180 patchPhase = pkgs.lib.optionals includeLibPam ''
187 patchPhase = pkgs.lib.optionals includeLibPam ''
181 substituteInPlace pam.py \
188 substituteInPlace pam.py \
182 --replace 'find_library("pam")' '"${pkgs.pam}/lib/libpam.so.0"'
189 --replace 'find_library("pam")' '"${pkgs.pam}/lib/libpam.so.0"'
183 '';
190 '';
184 });
191 });
185
192
186 URLObject = super.URLObject.override (attrs: {
193 URLObject = super.URLObject.override (attrs: {
187 meta = {
194 meta = {
188 license = {
195 license = {
189 spdxId = "Unlicense";
196 spdxId = "Unlicense";
190 fullName = "The Unlicense";
197 fullName = "The Unlicense";
191 url = http://unlicense.org/;
198 url = http://unlicense.org/;
192 };
199 };
193 };
200 };
194 });
201 });
195
202
196 amqplib = super.amqplib.override (attrs: {
203 amqplib = super.amqplib.override (attrs: {
197 meta = {
204 meta = {
198 license = pkgs.lib.licenses.lgpl3;
205 license = pkgs.lib.licenses.lgpl3;
199 };
206 };
200 });
207 });
201
208
202 docutils = super.docutils.override (attrs: {
209 docutils = super.docutils.override (attrs: {
203 meta = {
210 meta = {
204 license = pkgs.lib.licenses.bsd2;
211 license = pkgs.lib.licenses.bsd2;
205 };
212 };
206 });
213 });
207
214
208 colander = super.colander.override (attrs: {
215 colander = super.colander.override (attrs: {
209 meta = {
216 meta = {
210 license = localLicenses.repoze;
217 license = localLicenses.repoze;
211 };
218 };
212 });
219 });
213
220
214 pyramid-beaker = super.pyramid-beaker.override (attrs: {
221 pyramid-beaker = super.pyramid-beaker.override (attrs: {
215 meta = {
222 meta = {
216 license = localLicenses.repoze;
223 license = localLicenses.repoze;
217 };
224 };
218 });
225 });
219
226
220 pyramid-mako = super.pyramid-mako.override (attrs: {
227 pyramid-mako = super.pyramid-mako.override (attrs: {
221 meta = {
228 meta = {
222 license = localLicenses.repoze;
229 license = localLicenses.repoze;
223 };
230 };
224 });
231 });
225
232
226 repoze.lru = super.repoze.lru.override (attrs: {
233 repoze.lru = super.repoze.lru.override (attrs: {
227 meta = {
234 meta = {
228 license = localLicenses.repoze;
235 license = localLicenses.repoze;
229 };
236 };
230 });
237 });
231
238
232 recaptcha-client = super.recaptcha-client.override (attrs: {
239 recaptcha-client = super.recaptcha-client.override (attrs: {
233 meta = {
240 meta = {
234 # TODO: It is MIT/X11
241 # TODO: It is MIT/X11
235 license = pkgs.lib.licenses.mit;
242 license = pkgs.lib.licenses.mit;
236 };
243 };
237 });
244 });
238
245
239 python-editor = super.python-editor.override (attrs: {
246 python-editor = super.python-editor.override (attrs: {
240 meta = {
247 meta = {
241 license = pkgs.lib.licenses.asl20;
248 license = pkgs.lib.licenses.asl20;
242 };
249 };
243 });
250 });
244
251
245 translationstring = super.translationstring.override (attrs: {
252 translationstring = super.translationstring.override (attrs: {
246 meta = {
253 meta = {
247 license = localLicenses.repoze;
254 license = localLicenses.repoze;
248 };
255 };
249 });
256 });
250
257
251 venusian = super.venusian.override (attrs: {
258 venusian = super.venusian.override (attrs: {
252 meta = {
259 meta = {
253 license = localLicenses.repoze;
260 license = localLicenses.repoze;
254 };
261 };
255 });
262 });
256
263
257 # Avoid that setuptools is replaced, this leads to trouble
264 # Avoid that setuptools is replaced, this leads to trouble
258 # with buildPythonPackage.
265 # with buildPythonPackage.
259 setuptools = basePythonPackages.setuptools;
266 setuptools = basePythonPackages.setuptools;
260
267
261 }
268 }
@@ -1,1826 +1,1995 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 Babel = super.buildPythonPackage {
5 Babel = super.buildPythonPackage {
6 name = "Babel-1.3";
6 name = "Babel-1.3";
7 buildInputs = with self; [];
7 buildInputs = with self; [];
8 doCheck = false;
8 doCheck = false;
9 propagatedBuildInputs = with self; [pytz];
9 propagatedBuildInputs = with self; [pytz];
10 src = fetchurl {
10 src = fetchurl {
11 url = "https://pypi.python.org/packages/33/27/e3978243a03a76398c384c83f7ca879bc6e8f1511233a621fcada135606e/Babel-1.3.tar.gz";
11 url = "https://pypi.python.org/packages/33/27/e3978243a03a76398c384c83f7ca879bc6e8f1511233a621fcada135606e/Babel-1.3.tar.gz";
12 md5 = "5264ceb02717843cbc9ffce8e6e06bdb";
12 md5 = "5264ceb02717843cbc9ffce8e6e06bdb";
13 };
13 };
14 meta = {
14 meta = {
15 license = [ pkgs.lib.licenses.bsdOriginal ];
15 license = [ pkgs.lib.licenses.bsdOriginal ];
16 };
16 };
17 };
17 };
18 Beaker = super.buildPythonPackage {
18 Beaker = super.buildPythonPackage {
19 name = "Beaker-1.7.0";
19 name = "Beaker-1.7.0";
20 buildInputs = with self; [];
20 buildInputs = with self; [];
21 doCheck = false;
21 doCheck = false;
22 propagatedBuildInputs = with self; [];
22 propagatedBuildInputs = with self; [];
23 src = fetchurl {
23 src = fetchurl {
24 url = "https://pypi.python.org/packages/97/8e/409d2e7c009b8aa803dc9e6f239f1db7c3cdf578249087a404e7c27a505d/Beaker-1.7.0.tar.gz";
24 url = "https://pypi.python.org/packages/97/8e/409d2e7c009b8aa803dc9e6f239f1db7c3cdf578249087a404e7c27a505d/Beaker-1.7.0.tar.gz";
25 md5 = "386be3f7fe427358881eee4622b428b3";
25 md5 = "386be3f7fe427358881eee4622b428b3";
26 };
26 };
27 meta = {
27 meta = {
28 license = [ pkgs.lib.licenses.bsdOriginal ];
28 license = [ pkgs.lib.licenses.bsdOriginal ];
29 };
29 };
30 };
30 };
31 CProfileV = super.buildPythonPackage {
31 CProfileV = super.buildPythonPackage {
32 name = "CProfileV-1.0.6";
32 name = "CProfileV-1.0.6";
33 buildInputs = with self; [];
33 buildInputs = with self; [];
34 doCheck = false;
34 doCheck = false;
35 propagatedBuildInputs = with self; [bottle];
35 propagatedBuildInputs = with self; [bottle];
36 src = fetchurl {
36 src = fetchurl {
37 url = "https://pypi.python.org/packages/eb/df/983a0b6cfd3ac94abf023f5011cb04f33613ace196e33f53c86cf91850d5/CProfileV-1.0.6.tar.gz";
37 url = "https://pypi.python.org/packages/eb/df/983a0b6cfd3ac94abf023f5011cb04f33613ace196e33f53c86cf91850d5/CProfileV-1.0.6.tar.gz";
38 md5 = "08c7c242b6e64237bc53c5d13537e03d";
38 md5 = "08c7c242b6e64237bc53c5d13537e03d";
39 };
39 };
40 meta = {
40 meta = {
41 license = [ pkgs.lib.licenses.mit ];
41 license = [ pkgs.lib.licenses.mit ];
42 };
42 };
43 };
43 };
44 Chameleon = super.buildPythonPackage {
44 Chameleon = super.buildPythonPackage {
45 name = "Chameleon-2.24";
45 name = "Chameleon-2.24";
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/5a/9e/637379ffa13c5172b5c0e704833ffea6bf51cec7567f93fd6e903d53ed74/Chameleon-2.24.tar.gz";
50 url = "https://pypi.python.org/packages/5a/9e/637379ffa13c5172b5c0e704833ffea6bf51cec7567f93fd6e903d53ed74/Chameleon-2.24.tar.gz";
51 md5 = "1b01f1f6533a8a11d0d2f2366dec5342";
51 md5 = "1b01f1f6533a8a11d0d2f2366dec5342";
52 };
52 };
53 meta = {
53 meta = {
54 license = [ { fullName = "BSD-like (http://repoze.org/license.html)"; } ];
54 license = [ { fullName = "BSD-like (http://repoze.org/license.html)"; } ];
55 };
55 };
56 };
56 };
57 FormEncode = super.buildPythonPackage {
57 FormEncode = super.buildPythonPackage {
58 name = "FormEncode-1.2.4";
58 name = "FormEncode-1.2.4";
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/8e/59/0174271a6f004512e0201188593e6d319db139d14cb7490e488bbb078015/FormEncode-1.2.4.tar.gz";
63 url = "https://pypi.python.org/packages/8e/59/0174271a6f004512e0201188593e6d319db139d14cb7490e488bbb078015/FormEncode-1.2.4.tar.gz";
64 md5 = "6bc17fb9aed8aea198975e888e2077f4";
64 md5 = "6bc17fb9aed8aea198975e888e2077f4";
65 };
65 };
66 meta = {
66 meta = {
67 license = [ pkgs.lib.licenses.psfl ];
67 license = [ pkgs.lib.licenses.psfl ];
68 };
68 };
69 };
69 };
70 Jinja2 = super.buildPythonPackage {
70 Jinja2 = super.buildPythonPackage {
71 name = "Jinja2-2.7.3";
71 name = "Jinja2-2.7.3";
72 buildInputs = with self; [];
72 buildInputs = with self; [];
73 doCheck = false;
73 doCheck = false;
74 propagatedBuildInputs = with self; [MarkupSafe];
74 propagatedBuildInputs = with self; [MarkupSafe];
75 src = fetchurl {
75 src = fetchurl {
76 url = "https://pypi.python.org/packages/b0/73/eab0bca302d6d6a0b5c402f47ad1760dc9cb2dd14bbc1873ad48db258e4d/Jinja2-2.7.3.tar.gz";
76 url = "https://pypi.python.org/packages/b0/73/eab0bca302d6d6a0b5c402f47ad1760dc9cb2dd14bbc1873ad48db258e4d/Jinja2-2.7.3.tar.gz";
77 md5 = "b9dffd2f3b43d673802fe857c8445b1a";
77 md5 = "b9dffd2f3b43d673802fe857c8445b1a";
78 };
78 };
79 meta = {
79 meta = {
80 license = [ pkgs.lib.licenses.bsdOriginal ];
80 license = [ pkgs.lib.licenses.bsdOriginal ];
81 };
81 };
82 };
82 };
83 Mako = super.buildPythonPackage {
83 Mako = super.buildPythonPackage {
84 name = "Mako-1.0.6";
84 name = "Mako-1.0.6";
85 buildInputs = with self; [];
85 buildInputs = with self; [];
86 doCheck = false;
86 doCheck = false;
87 propagatedBuildInputs = with self; [MarkupSafe];
87 propagatedBuildInputs = with self; [MarkupSafe];
88 src = fetchurl {
88 src = fetchurl {
89 url = "https://pypi.python.org/packages/56/4b/cb75836863a6382199aefb3d3809937e21fa4cb0db15a4f4ba0ecc2e7e8e/Mako-1.0.6.tar.gz";
89 url = "https://pypi.python.org/packages/56/4b/cb75836863a6382199aefb3d3809937e21fa4cb0db15a4f4ba0ecc2e7e8e/Mako-1.0.6.tar.gz";
90 md5 = "a28e22a339080316b2acc352b9ee631c";
90 md5 = "a28e22a339080316b2acc352b9ee631c";
91 };
91 };
92 meta = {
92 meta = {
93 license = [ pkgs.lib.licenses.mit ];
93 license = [ pkgs.lib.licenses.mit ];
94 };
94 };
95 };
95 };
96 Markdown = super.buildPythonPackage {
96 Markdown = super.buildPythonPackage {
97 name = "Markdown-2.6.7";
97 name = "Markdown-2.6.7";
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/48/a4/fc6b002789c2239ac620ca963694c95b8f74e4747769cdf6021276939e74/Markdown-2.6.7.zip";
102 url = "https://pypi.python.org/packages/48/a4/fc6b002789c2239ac620ca963694c95b8f74e4747769cdf6021276939e74/Markdown-2.6.7.zip";
103 md5 = "632710a7474bbb74a82084392251061f";
103 md5 = "632710a7474bbb74a82084392251061f";
104 };
104 };
105 meta = {
105 meta = {
106 license = [ pkgs.lib.licenses.bsdOriginal ];
106 license = [ pkgs.lib.licenses.bsdOriginal ];
107 };
107 };
108 };
108 };
109 MarkupSafe = super.buildPythonPackage {
109 MarkupSafe = super.buildPythonPackage {
110 name = "MarkupSafe-0.23";
110 name = "MarkupSafe-0.23";
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/c0/41/bae1254e0396c0cc8cf1751cb7d9afc90a602353695af5952530482c963f/MarkupSafe-0.23.tar.gz";
115 url = "https://pypi.python.org/packages/c0/41/bae1254e0396c0cc8cf1751cb7d9afc90a602353695af5952530482c963f/MarkupSafe-0.23.tar.gz";
116 md5 = "f5ab3deee4c37cd6a922fb81e730da6e";
116 md5 = "f5ab3deee4c37cd6a922fb81e730da6e";
117 };
117 };
118 meta = {
118 meta = {
119 license = [ pkgs.lib.licenses.bsdOriginal ];
119 license = [ pkgs.lib.licenses.bsdOriginal ];
120 };
120 };
121 };
121 };
122 MySQL-python = super.buildPythonPackage {
122 MySQL-python = super.buildPythonPackage {
123 name = "MySQL-python-1.2.5";
123 name = "MySQL-python-1.2.5";
124 buildInputs = with self; [];
124 buildInputs = with self; [];
125 doCheck = false;
125 doCheck = false;
126 propagatedBuildInputs = with self; [];
126 propagatedBuildInputs = with self; [];
127 src = fetchurl {
127 src = fetchurl {
128 url = "https://pypi.python.org/packages/a5/e9/51b544da85a36a68debe7a7091f068d802fc515a3a202652828c73453cad/MySQL-python-1.2.5.zip";
128 url = "https://pypi.python.org/packages/a5/e9/51b544da85a36a68debe7a7091f068d802fc515a3a202652828c73453cad/MySQL-python-1.2.5.zip";
129 md5 = "654f75b302db6ed8dc5a898c625e030c";
129 md5 = "654f75b302db6ed8dc5a898c625e030c";
130 };
130 };
131 meta = {
131 meta = {
132 license = [ pkgs.lib.licenses.gpl1 ];
132 license = [ pkgs.lib.licenses.gpl1 ];
133 };
133 };
134 };
134 };
135 Paste = super.buildPythonPackage {
135 Paste = super.buildPythonPackage {
136 name = "Paste-2.0.3";
136 name = "Paste-2.0.3";
137 buildInputs = with self; [];
137 buildInputs = with self; [];
138 doCheck = false;
138 doCheck = false;
139 propagatedBuildInputs = with self; [six];
139 propagatedBuildInputs = with self; [six];
140 src = fetchurl {
140 src = fetchurl {
141 url = "https://pypi.python.org/packages/30/c3/5c2f7c7a02e4f58d4454353fa1c32c94f79fa4e36d07a67c0ac295ea369e/Paste-2.0.3.tar.gz";
141 url = "https://pypi.python.org/packages/30/c3/5c2f7c7a02e4f58d4454353fa1c32c94f79fa4e36d07a67c0ac295ea369e/Paste-2.0.3.tar.gz";
142 md5 = "1231e14eae62fa7ed76e9130b04bc61e";
142 md5 = "1231e14eae62fa7ed76e9130b04bc61e";
143 };
143 };
144 meta = {
144 meta = {
145 license = [ pkgs.lib.licenses.mit ];
145 license = [ pkgs.lib.licenses.mit ];
146 };
146 };
147 };
147 };
148 PasteDeploy = super.buildPythonPackage {
148 PasteDeploy = super.buildPythonPackage {
149 name = "PasteDeploy-1.5.2";
149 name = "PasteDeploy-1.5.2";
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/0f/90/8e20cdae206c543ea10793cbf4136eb9a8b3f417e04e40a29d72d9922cbd/PasteDeploy-1.5.2.tar.gz";
154 url = "https://pypi.python.org/packages/0f/90/8e20cdae206c543ea10793cbf4136eb9a8b3f417e04e40a29d72d9922cbd/PasteDeploy-1.5.2.tar.gz";
155 md5 = "352b7205c78c8de4987578d19431af3b";
155 md5 = "352b7205c78c8de4987578d19431af3b";
156 };
156 };
157 meta = {
157 meta = {
158 license = [ pkgs.lib.licenses.mit ];
158 license = [ pkgs.lib.licenses.mit ];
159 };
159 };
160 };
160 };
161 PasteScript = super.buildPythonPackage {
161 PasteScript = super.buildPythonPackage {
162 name = "PasteScript-1.7.5";
162 name = "PasteScript-1.7.5";
163 buildInputs = with self; [];
163 buildInputs = with self; [];
164 doCheck = false;
164 doCheck = false;
165 propagatedBuildInputs = with self; [Paste PasteDeploy];
165 propagatedBuildInputs = with self; [Paste PasteDeploy];
166 src = fetchurl {
166 src = fetchurl {
167 url = "https://pypi.python.org/packages/a5/05/fc60efa7c2f17a1dbaeccb2a903a1e90902d92b9d00eebabe3095829d806/PasteScript-1.7.5.tar.gz";
167 url = "https://pypi.python.org/packages/a5/05/fc60efa7c2f17a1dbaeccb2a903a1e90902d92b9d00eebabe3095829d806/PasteScript-1.7.5.tar.gz";
168 md5 = "4c72d78dcb6bb993f30536842c16af4d";
168 md5 = "4c72d78dcb6bb993f30536842c16af4d";
169 };
169 };
170 meta = {
170 meta = {
171 license = [ pkgs.lib.licenses.mit ];
171 license = [ pkgs.lib.licenses.mit ];
172 };
172 };
173 };
173 };
174 Pygments = super.buildPythonPackage {
174 Pygments = super.buildPythonPackage {
175 name = "Pygments-2.2.0";
175 name = "Pygments-2.2.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/71/2a/2e4e77803a8bd6408a2903340ac498cb0a2181811af7c9ec92cb70b0308a/Pygments-2.2.0.tar.gz";
180 url = "https://pypi.python.org/packages/71/2a/2e4e77803a8bd6408a2903340ac498cb0a2181811af7c9ec92cb70b0308a/Pygments-2.2.0.tar.gz";
181 md5 = "13037baca42f16917cbd5ad2fab50844";
181 md5 = "13037baca42f16917cbd5ad2fab50844";
182 };
182 };
183 meta = {
183 meta = {
184 license = [ pkgs.lib.licenses.bsdOriginal ];
184 license = [ pkgs.lib.licenses.bsdOriginal ];
185 };
185 };
186 };
186 };
187 Pylons = super.buildPythonPackage {
187 Pylons = super.buildPythonPackage {
188 name = "Pylons-1.0.2.dev20170205";
188 name = "Pylons-1.0.2.dev20170205";
189 buildInputs = with self; [];
189 buildInputs = with self; [];
190 doCheck = false;
190 doCheck = false;
191 propagatedBuildInputs = with self; [Routes WebHelpers Beaker Paste PasteDeploy PasteScript FormEncode simplejson decorator nose Mako WebError WebTest Tempita MarkupSafe WebOb];
191 propagatedBuildInputs = with self; [Routes WebHelpers Beaker Paste PasteDeploy PasteScript FormEncode simplejson decorator nose Mako WebError WebTest Tempita MarkupSafe WebOb];
192 src = fetchurl {
192 src = fetchurl {
193 url = "https://code.rhodecode.com/upstream/pylons/archive/707354ee4261b9c10450404fc9852ccea4fd667d.tar.gz?md5=f26633726fa2cd3a340316ee6a5d218f";
193 url = "https://code.rhodecode.com/upstream/pylons/archive/707354ee4261b9c10450404fc9852ccea4fd667d.tar.gz?md5=f26633726fa2cd3a340316ee6a5d218f";
194 md5 = "f26633726fa2cd3a340316ee6a5d218f";
194 md5 = "f26633726fa2cd3a340316ee6a5d218f";
195 };
195 };
196 meta = {
196 meta = {
197 license = [ pkgs.lib.licenses.bsdOriginal ];
197 license = [ pkgs.lib.licenses.bsdOriginal ];
198 };
198 };
199 };
199 };
200 Routes = super.buildPythonPackage {
200 Routes = super.buildPythonPackage {
201 name = "Routes-1.13";
201 name = "Routes-1.13";
202 buildInputs = with self; [];
202 buildInputs = with self; [];
203 doCheck = false;
203 doCheck = false;
204 propagatedBuildInputs = with self; [repoze.lru];
204 propagatedBuildInputs = with self; [repoze.lru];
205 src = fetchurl {
205 src = fetchurl {
206 url = "https://pypi.python.org/packages/88/d3/259c3b3cde8837eb9441ab5f574a660e8a4acea8f54a078441d4d2acac1c/Routes-1.13.tar.gz";
206 url = "https://pypi.python.org/packages/88/d3/259c3b3cde8837eb9441ab5f574a660e8a4acea8f54a078441d4d2acac1c/Routes-1.13.tar.gz";
207 md5 = "d527b0ab7dd9172b1275a41f97448783";
207 md5 = "d527b0ab7dd9172b1275a41f97448783";
208 };
208 };
209 meta = {
209 meta = {
210 license = [ pkgs.lib.licenses.bsdOriginal ];
210 license = [ pkgs.lib.licenses.bsdOriginal ];
211 };
211 };
212 };
212 };
213 SQLAlchemy = super.buildPythonPackage {
213 SQLAlchemy = super.buildPythonPackage {
214 name = "SQLAlchemy-0.9.9";
214 name = "SQLAlchemy-0.9.9";
215 buildInputs = with self; [];
215 buildInputs = with self; [];
216 doCheck = false;
216 doCheck = false;
217 propagatedBuildInputs = with self; [];
217 propagatedBuildInputs = with self; [];
218 src = fetchurl {
218 src = fetchurl {
219 url = "https://pypi.python.org/packages/28/f7/1bbfd0d8597e8c358d5e15a166a486ad82fc5579b4e67b6ef7c05b1d182b/SQLAlchemy-0.9.9.tar.gz";
219 url = "https://pypi.python.org/packages/28/f7/1bbfd0d8597e8c358d5e15a166a486ad82fc5579b4e67b6ef7c05b1d182b/SQLAlchemy-0.9.9.tar.gz";
220 md5 = "8a10a9bd13ed3336ef7333ac2cc679ff";
220 md5 = "8a10a9bd13ed3336ef7333ac2cc679ff";
221 };
221 };
222 meta = {
222 meta = {
223 license = [ pkgs.lib.licenses.mit ];
223 license = [ pkgs.lib.licenses.mit ];
224 };
224 };
225 };
225 };
226 Sphinx = super.buildPythonPackage {
226 Sphinx = super.buildPythonPackage {
227 name = "Sphinx-1.2.2";
227 name = "Sphinx-1.2.2";
228 buildInputs = with self; [];
228 buildInputs = with self; [];
229 doCheck = false;
229 doCheck = false;
230 propagatedBuildInputs = with self; [Pygments docutils Jinja2];
230 propagatedBuildInputs = with self; [Pygments docutils Jinja2];
231 src = fetchurl {
231 src = fetchurl {
232 url = "https://pypi.python.org/packages/0a/50/34017e6efcd372893a416aba14b84a1a149fc7074537b0e9cb6ca7b7abe9/Sphinx-1.2.2.tar.gz";
232 url = "https://pypi.python.org/packages/0a/50/34017e6efcd372893a416aba14b84a1a149fc7074537b0e9cb6ca7b7abe9/Sphinx-1.2.2.tar.gz";
233 md5 = "3dc73ccaa8d0bfb2d62fb671b1f7e8a4";
233 md5 = "3dc73ccaa8d0bfb2d62fb671b1f7e8a4";
234 };
234 };
235 meta = {
235 meta = {
236 license = [ pkgs.lib.licenses.bsdOriginal ];
236 license = [ pkgs.lib.licenses.bsdOriginal ];
237 };
237 };
238 };
238 };
239 Tempita = super.buildPythonPackage {
239 Tempita = super.buildPythonPackage {
240 name = "Tempita-0.5.2";
240 name = "Tempita-0.5.2";
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/56/c8/8ed6eee83dbddf7b0fc64dd5d4454bc05e6ccaafff47991f73f2894d9ff4/Tempita-0.5.2.tar.gz";
245 url = "https://pypi.python.org/packages/56/c8/8ed6eee83dbddf7b0fc64dd5d4454bc05e6ccaafff47991f73f2894d9ff4/Tempita-0.5.2.tar.gz";
246 md5 = "4c2f17bb9d481821c41b6fbee904cea1";
246 md5 = "4c2f17bb9d481821c41b6fbee904cea1";
247 };
247 };
248 meta = {
248 meta = {
249 license = [ pkgs.lib.licenses.mit ];
249 license = [ pkgs.lib.licenses.mit ];
250 };
250 };
251 };
251 };
252 URLObject = super.buildPythonPackage {
252 URLObject = super.buildPythonPackage {
253 name = "URLObject-2.4.0";
253 name = "URLObject-2.4.0";
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/cb/b6/e25e58500f9caef85d664bec71ec67c116897bfebf8622c32cb75d1ca199/URLObject-2.4.0.tar.gz";
258 url = "https://pypi.python.org/packages/cb/b6/e25e58500f9caef85d664bec71ec67c116897bfebf8622c32cb75d1ca199/URLObject-2.4.0.tar.gz";
259 md5 = "2ed819738a9f0a3051f31dc9924e3065";
259 md5 = "2ed819738a9f0a3051f31dc9924e3065";
260 };
260 };
261 meta = {
261 meta = {
262 license = [ ];
262 license = [ ];
263 };
263 };
264 };
264 };
265 WebError = super.buildPythonPackage {
265 WebError = super.buildPythonPackage {
266 name = "WebError-0.10.3";
266 name = "WebError-0.10.3";
267 buildInputs = with self; [];
267 buildInputs = with self; [];
268 doCheck = false;
268 doCheck = false;
269 propagatedBuildInputs = with self; [WebOb Tempita Pygments Paste];
269 propagatedBuildInputs = with self; [WebOb Tempita Pygments Paste];
270 src = fetchurl {
270 src = fetchurl {
271 url = "https://pypi.python.org/packages/35/76/e7e5c2ce7e9c7f31b54c1ff295a495886d1279a002557d74dd8957346a79/WebError-0.10.3.tar.gz";
271 url = "https://pypi.python.org/packages/35/76/e7e5c2ce7e9c7f31b54c1ff295a495886d1279a002557d74dd8957346a79/WebError-0.10.3.tar.gz";
272 md5 = "84b9990b0baae6fd440b1e60cdd06f9a";
272 md5 = "84b9990b0baae6fd440b1e60cdd06f9a";
273 };
273 };
274 meta = {
274 meta = {
275 license = [ pkgs.lib.licenses.mit ];
275 license = [ pkgs.lib.licenses.mit ];
276 };
276 };
277 };
277 };
278 WebHelpers = super.buildPythonPackage {
278 WebHelpers = super.buildPythonPackage {
279 name = "WebHelpers-1.3";
279 name = "WebHelpers-1.3";
280 buildInputs = with self; [];
280 buildInputs = with self; [];
281 doCheck = false;
281 doCheck = false;
282 propagatedBuildInputs = with self; [MarkupSafe];
282 propagatedBuildInputs = with self; [MarkupSafe];
283 src = fetchurl {
283 src = fetchurl {
284 url = "https://pypi.python.org/packages/ee/68/4d07672821d514184357f1552f2dad923324f597e722de3b016ca4f7844f/WebHelpers-1.3.tar.gz";
284 url = "https://pypi.python.org/packages/ee/68/4d07672821d514184357f1552f2dad923324f597e722de3b016ca4f7844f/WebHelpers-1.3.tar.gz";
285 md5 = "32749ffadfc40fea51075a7def32588b";
285 md5 = "32749ffadfc40fea51075a7def32588b";
286 };
286 };
287 meta = {
287 meta = {
288 license = [ pkgs.lib.licenses.bsdOriginal ];
288 license = [ pkgs.lib.licenses.bsdOriginal ];
289 };
289 };
290 };
290 };
291 WebHelpers2 = super.buildPythonPackage {
291 WebHelpers2 = super.buildPythonPackage {
292 name = "WebHelpers2-2.0";
292 name = "WebHelpers2-2.0";
293 buildInputs = with self; [];
293 buildInputs = with self; [];
294 doCheck = false;
294 doCheck = false;
295 propagatedBuildInputs = with self; [MarkupSafe six];
295 propagatedBuildInputs = with self; [MarkupSafe six];
296 src = fetchurl {
296 src = fetchurl {
297 url = "https://pypi.python.org/packages/ff/30/56342c6ea522439e3662427c8d7b5e5b390dff4ff2dc92d8afcb8ab68b75/WebHelpers2-2.0.tar.gz";
297 url = "https://pypi.python.org/packages/ff/30/56342c6ea522439e3662427c8d7b5e5b390dff4ff2dc92d8afcb8ab68b75/WebHelpers2-2.0.tar.gz";
298 md5 = "0f6b68d70c12ee0aed48c00b24da13d3";
298 md5 = "0f6b68d70c12ee0aed48c00b24da13d3";
299 };
299 };
300 meta = {
300 meta = {
301 license = [ pkgs.lib.licenses.mit ];
301 license = [ pkgs.lib.licenses.mit ];
302 };
302 };
303 };
303 };
304 WebOb = super.buildPythonPackage {
304 WebOb = super.buildPythonPackage {
305 name = "WebOb-1.3.1";
305 name = "WebOb-1.3.1";
306 buildInputs = with self; [];
306 buildInputs = with self; [];
307 doCheck = false;
307 doCheck = false;
308 propagatedBuildInputs = with self; [];
308 propagatedBuildInputs = with self; [];
309 src = fetchurl {
309 src = fetchurl {
310 url = "https://pypi.python.org/packages/16/78/adfc0380b8a0d75b2d543fa7085ba98a573b1ae486d9def88d172b81b9fa/WebOb-1.3.1.tar.gz";
310 url = "https://pypi.python.org/packages/16/78/adfc0380b8a0d75b2d543fa7085ba98a573b1ae486d9def88d172b81b9fa/WebOb-1.3.1.tar.gz";
311 md5 = "20918251c5726956ba8fef22d1556177";
311 md5 = "20918251c5726956ba8fef22d1556177";
312 };
312 };
313 meta = {
313 meta = {
314 license = [ pkgs.lib.licenses.mit ];
314 license = [ pkgs.lib.licenses.mit ];
315 };
315 };
316 };
316 };
317 WebTest = super.buildPythonPackage {
317 WebTest = super.buildPythonPackage {
318 name = "WebTest-1.4.3";
318 name = "WebTest-1.4.3";
319 buildInputs = with self; [];
319 buildInputs = with self; [];
320 doCheck = false;
320 doCheck = false;
321 propagatedBuildInputs = with self; [WebOb];
321 propagatedBuildInputs = with self; [WebOb];
322 src = fetchurl {
322 src = fetchurl {
323 url = "https://pypi.python.org/packages/51/3d/84fd0f628df10b30c7db87895f56d0158e5411206b721ca903cb51bfd948/WebTest-1.4.3.zip";
323 url = "https://pypi.python.org/packages/51/3d/84fd0f628df10b30c7db87895f56d0158e5411206b721ca903cb51bfd948/WebTest-1.4.3.zip";
324 md5 = "631ce728bed92c681a4020a36adbc353";
324 md5 = "631ce728bed92c681a4020a36adbc353";
325 };
325 };
326 meta = {
326 meta = {
327 license = [ pkgs.lib.licenses.mit ];
327 license = [ pkgs.lib.licenses.mit ];
328 };
328 };
329 };
329 };
330 Whoosh = super.buildPythonPackage {
330 Whoosh = super.buildPythonPackage {
331 name = "Whoosh-2.7.4";
331 name = "Whoosh-2.7.4";
332 buildInputs = with self; [];
332 buildInputs = with self; [];
333 doCheck = false;
333 doCheck = false;
334 propagatedBuildInputs = with self; [];
334 propagatedBuildInputs = with self; [];
335 src = fetchurl {
335 src = fetchurl {
336 url = "https://pypi.python.org/packages/25/2b/6beed2107b148edc1321da0d489afc4617b9ed317ef7b72d4993cad9b684/Whoosh-2.7.4.tar.gz";
336 url = "https://pypi.python.org/packages/25/2b/6beed2107b148edc1321da0d489afc4617b9ed317ef7b72d4993cad9b684/Whoosh-2.7.4.tar.gz";
337 md5 = "c2710105f20b3e29936bd2357383c325";
337 md5 = "c2710105f20b3e29936bd2357383c325";
338 };
338 };
339 meta = {
339 meta = {
340 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.bsd2 ];
340 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.bsd2 ];
341 };
341 };
342 };
342 };
343 alembic = super.buildPythonPackage {
343 alembic = super.buildPythonPackage {
344 name = "alembic-0.8.4";
344 name = "alembic-0.8.4";
345 buildInputs = with self; [];
345 buildInputs = with self; [];
346 doCheck = false;
346 doCheck = false;
347 propagatedBuildInputs = with self; [SQLAlchemy Mako python-editor];
347 propagatedBuildInputs = with self; [SQLAlchemy Mako python-editor];
348 src = fetchurl {
348 src = fetchurl {
349 url = "https://pypi.python.org/packages/ca/7e/299b4499b5c75e5a38c5845145ad24755bebfb8eec07a2e1c366b7181eeb/alembic-0.8.4.tar.gz";
349 url = "https://pypi.python.org/packages/ca/7e/299b4499b5c75e5a38c5845145ad24755bebfb8eec07a2e1c366b7181eeb/alembic-0.8.4.tar.gz";
350 md5 = "5f95d8ee62b443f9b37eb5bee76c582d";
350 md5 = "5f95d8ee62b443f9b37eb5bee76c582d";
351 };
351 };
352 meta = {
352 meta = {
353 license = [ pkgs.lib.licenses.mit ];
353 license = [ pkgs.lib.licenses.mit ];
354 };
354 };
355 };
355 };
356 amqplib = super.buildPythonPackage {
356 amqplib = super.buildPythonPackage {
357 name = "amqplib-1.0.2";
357 name = "amqplib-1.0.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/75/b7/8c2429bf8d92354a0118614f9a4d15e53bc69ebedce534284111de5a0102/amqplib-1.0.2.tgz";
362 url = "https://pypi.python.org/packages/75/b7/8c2429bf8d92354a0118614f9a4d15e53bc69ebedce534284111de5a0102/amqplib-1.0.2.tgz";
363 md5 = "5c92f17fbedd99b2b4a836d4352d1e2f";
363 md5 = "5c92f17fbedd99b2b4a836d4352d1e2f";
364 };
364 };
365 meta = {
365 meta = {
366 license = [ { fullName = "LGPL"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
366 license = [ { fullName = "LGPL"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
367 };
367 };
368 };
368 };
369 anyjson = super.buildPythonPackage {
369 anyjson = super.buildPythonPackage {
370 name = "anyjson-0.3.3";
370 name = "anyjson-0.3.3";
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/c3/4d/d4089e1a3dd25b46bebdb55a992b0797cff657b4477bc32ce28038fdecbc/anyjson-0.3.3.tar.gz";
375 url = "https://pypi.python.org/packages/c3/4d/d4089e1a3dd25b46bebdb55a992b0797cff657b4477bc32ce28038fdecbc/anyjson-0.3.3.tar.gz";
376 md5 = "2ea28d6ec311aeeebaf993cb3008b27c";
376 md5 = "2ea28d6ec311aeeebaf993cb3008b27c";
377 };
377 };
378 meta = {
378 meta = {
379 license = [ pkgs.lib.licenses.bsdOriginal ];
379 license = [ pkgs.lib.licenses.bsdOriginal ];
380 };
380 };
381 };
381 };
382 appenlight-client = super.buildPythonPackage {
382 appenlight-client = super.buildPythonPackage {
383 name = "appenlight-client-0.6.14";
383 name = "appenlight-client-0.6.14";
384 buildInputs = with self; [];
384 buildInputs = with self; [];
385 doCheck = false;
385 doCheck = false;
386 propagatedBuildInputs = with self; [WebOb requests];
386 propagatedBuildInputs = with self; [WebOb requests];
387 src = fetchurl {
387 src = fetchurl {
388 url = "https://pypi.python.org/packages/4d/e0/23fee3ebada8143f707e65c06bcb82992040ee64ea8355e044ed55ebf0c1/appenlight_client-0.6.14.tar.gz";
388 url = "https://pypi.python.org/packages/4d/e0/23fee3ebada8143f707e65c06bcb82992040ee64ea8355e044ed55ebf0c1/appenlight_client-0.6.14.tar.gz";
389 md5 = "578c69b09f4356d898fff1199b98a95c";
389 md5 = "578c69b09f4356d898fff1199b98a95c";
390 };
390 };
391 meta = {
391 meta = {
392 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "DFSG approved"; } ];
392 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "DFSG approved"; } ];
393 };
393 };
394 };
394 };
395 authomatic = super.buildPythonPackage {
395 authomatic = super.buildPythonPackage {
396 name = "authomatic-0.1.0.post1";
396 name = "authomatic-0.1.0.post1";
397 buildInputs = with self; [];
397 buildInputs = with self; [];
398 doCheck = false;
398 doCheck = false;
399 propagatedBuildInputs = with self; [];
399 propagatedBuildInputs = with self; [];
400 src = fetchurl {
400 src = fetchurl {
401 url = "https://pypi.python.org/packages/08/1a/8a930461e604c2d5a7a871e1ac59fa82ccf994c32e807230c8d2fb07815a/Authomatic-0.1.0.post1.tar.gz";
401 url = "https://pypi.python.org/packages/08/1a/8a930461e604c2d5a7a871e1ac59fa82ccf994c32e807230c8d2fb07815a/Authomatic-0.1.0.post1.tar.gz";
402 md5 = "be3f3ce08747d776aae6d6cc8dcb49a9";
402 md5 = "be3f3ce08747d776aae6d6cc8dcb49a9";
403 };
403 };
404 meta = {
404 meta = {
405 license = [ pkgs.lib.licenses.mit ];
405 license = [ pkgs.lib.licenses.mit ];
406 };
406 };
407 };
407 };
408 backport-ipaddress = super.buildPythonPackage {
408 backport-ipaddress = super.buildPythonPackage {
409 name = "backport-ipaddress-0.1";
409 name = "backport-ipaddress-0.1";
410 buildInputs = with self; [];
410 buildInputs = with self; [];
411 doCheck = false;
411 doCheck = false;
412 propagatedBuildInputs = with self; [];
412 propagatedBuildInputs = with self; [];
413 src = fetchurl {
413 src = fetchurl {
414 url = "https://pypi.python.org/packages/d3/30/54c6dab05a4dec44db25ff309f1fbb6b7a8bde3f2bade38bb9da67bbab8f/backport_ipaddress-0.1.tar.gz";
414 url = "https://pypi.python.org/packages/d3/30/54c6dab05a4dec44db25ff309f1fbb6b7a8bde3f2bade38bb9da67bbab8f/backport_ipaddress-0.1.tar.gz";
415 md5 = "9c1f45f4361f71b124d7293a60006c05";
415 md5 = "9c1f45f4361f71b124d7293a60006c05";
416 };
416 };
417 meta = {
417 meta = {
418 license = [ pkgs.lib.licenses.psfl ];
418 license = [ pkgs.lib.licenses.psfl ];
419 };
419 };
420 };
420 };
421 backports.shutil-get-terminal-size = super.buildPythonPackage {
421 backports.shutil-get-terminal-size = super.buildPythonPackage {
422 name = "backports.shutil-get-terminal-size-1.0.0";
422 name = "backports.shutil-get-terminal-size-1.0.0";
423 buildInputs = with self; [];
423 buildInputs = with self; [];
424 doCheck = false;
424 doCheck = false;
425 propagatedBuildInputs = with self; [];
425 propagatedBuildInputs = with self; [];
426 src = fetchurl {
426 src = fetchurl {
427 url = "https://pypi.python.org/packages/ec/9c/368086faa9c016efce5da3e0e13ba392c9db79e3ab740b763fe28620b18b/backports.shutil_get_terminal_size-1.0.0.tar.gz";
427 url = "https://pypi.python.org/packages/ec/9c/368086faa9c016efce5da3e0e13ba392c9db79e3ab740b763fe28620b18b/backports.shutil_get_terminal_size-1.0.0.tar.gz";
428 md5 = "03267762480bd86b50580dc19dff3c66";
428 md5 = "03267762480bd86b50580dc19dff3c66";
429 };
429 };
430 meta = {
430 meta = {
431 license = [ pkgs.lib.licenses.mit ];
431 license = [ pkgs.lib.licenses.mit ];
432 };
432 };
433 };
433 };
434 bleach = super.buildPythonPackage {
435 name = "bleach-1.5.0";
436 buildInputs = with self; [];
437 doCheck = false;
438 propagatedBuildInputs = with self; [six html5lib];
439 src = fetchurl {
440 url = "https://pypi.python.org/packages/99/00/25a8fce4de102bf6e3cc76bc4ea60685b2fee33bde1b34830c70cacc26a7/bleach-1.5.0.tar.gz";
441 md5 = "b663300efdf421b3b727b19d7be9c7e7";
442 };
443 meta = {
444 license = [ pkgs.lib.licenses.asl20 ];
445 };
446 };
434 bottle = super.buildPythonPackage {
447 bottle = super.buildPythonPackage {
435 name = "bottle-0.12.8";
448 name = "bottle-0.12.8";
436 buildInputs = with self; [];
449 buildInputs = with self; [];
437 doCheck = false;
450 doCheck = false;
438 propagatedBuildInputs = with self; [];
451 propagatedBuildInputs = with self; [];
439 src = fetchurl {
452 src = fetchurl {
440 url = "https://pypi.python.org/packages/52/df/e4a408f3a7af396d186d4ecd3b389dd764f0f943b4fa8d257bfe7b49d343/bottle-0.12.8.tar.gz";
453 url = "https://pypi.python.org/packages/52/df/e4a408f3a7af396d186d4ecd3b389dd764f0f943b4fa8d257bfe7b49d343/bottle-0.12.8.tar.gz";
441 md5 = "13132c0a8f607bf860810a6ee9064c5b";
454 md5 = "13132c0a8f607bf860810a6ee9064c5b";
442 };
455 };
443 meta = {
456 meta = {
444 license = [ pkgs.lib.licenses.mit ];
457 license = [ pkgs.lib.licenses.mit ];
445 };
458 };
446 };
459 };
447 bumpversion = super.buildPythonPackage {
460 bumpversion = super.buildPythonPackage {
448 name = "bumpversion-0.5.3";
461 name = "bumpversion-0.5.3";
449 buildInputs = with self; [];
462 buildInputs = with self; [];
450 doCheck = false;
463 doCheck = false;
451 propagatedBuildInputs = with self; [];
464 propagatedBuildInputs = with self; [];
452 src = fetchurl {
465 src = fetchurl {
453 url = "https://pypi.python.org/packages/14/41/8c9da3549f8e00c84f0432c3a8cf8ed6898374714676aab91501d48760db/bumpversion-0.5.3.tar.gz";
466 url = "https://pypi.python.org/packages/14/41/8c9da3549f8e00c84f0432c3a8cf8ed6898374714676aab91501d48760db/bumpversion-0.5.3.tar.gz";
454 md5 = "c66a3492eafcf5ad4b024be9fca29820";
467 md5 = "c66a3492eafcf5ad4b024be9fca29820";
455 };
468 };
456 meta = {
469 meta = {
457 license = [ pkgs.lib.licenses.mit ];
470 license = [ pkgs.lib.licenses.mit ];
458 };
471 };
459 };
472 };
460 celery = super.buildPythonPackage {
473 celery = super.buildPythonPackage {
461 name = "celery-2.2.10";
474 name = "celery-2.2.10";
462 buildInputs = with self; [];
475 buildInputs = with self; [];
463 doCheck = false;
476 doCheck = false;
464 propagatedBuildInputs = with self; [python-dateutil anyjson kombu pyparsing];
477 propagatedBuildInputs = with self; [python-dateutil anyjson kombu pyparsing];
465 src = fetchurl {
478 src = fetchurl {
466 url = "https://pypi.python.org/packages/b1/64/860fd50e45844c83442e7953effcddeff66b2851d90b2d784f7201c111b8/celery-2.2.10.tar.gz";
479 url = "https://pypi.python.org/packages/b1/64/860fd50e45844c83442e7953effcddeff66b2851d90b2d784f7201c111b8/celery-2.2.10.tar.gz";
467 md5 = "898bc87e54f278055b561316ba73e222";
480 md5 = "898bc87e54f278055b561316ba73e222";
468 };
481 };
469 meta = {
482 meta = {
470 license = [ pkgs.lib.licenses.bsdOriginal ];
483 license = [ pkgs.lib.licenses.bsdOriginal ];
471 };
484 };
472 };
485 };
473 channelstream = super.buildPythonPackage {
486 channelstream = super.buildPythonPackage {
474 name = "channelstream-0.5.2";
487 name = "channelstream-0.5.2";
475 buildInputs = with self; [];
488 buildInputs = with self; [];
476 doCheck = false;
489 doCheck = false;
477 propagatedBuildInputs = with self; [gevent ws4py pyramid pyramid-jinja2 itsdangerous requests six];
490 propagatedBuildInputs = with self; [gevent ws4py pyramid pyramid-jinja2 itsdangerous requests six];
478 src = fetchurl {
491 src = fetchurl {
479 url = "https://pypi.python.org/packages/2b/31/29a8e085cf5bf97fa88e7b947adabfc581a18a3463adf77fb6dada34a65f/channelstream-0.5.2.tar.gz";
492 url = "https://pypi.python.org/packages/2b/31/29a8e085cf5bf97fa88e7b947adabfc581a18a3463adf77fb6dada34a65f/channelstream-0.5.2.tar.gz";
480 md5 = "1c5eb2a8a405be6f1073da94da6d81d3";
493 md5 = "1c5eb2a8a405be6f1073da94da6d81d3";
481 };
494 };
482 meta = {
495 meta = {
483 license = [ pkgs.lib.licenses.bsdOriginal ];
496 license = [ pkgs.lib.licenses.bsdOriginal ];
484 };
497 };
485 };
498 };
486 click = super.buildPythonPackage {
499 click = super.buildPythonPackage {
487 name = "click-5.1";
500 name = "click-5.1";
488 buildInputs = with self; [];
501 buildInputs = with self; [];
489 doCheck = false;
502 doCheck = false;
490 propagatedBuildInputs = with self; [];
503 propagatedBuildInputs = with self; [];
491 src = fetchurl {
504 src = fetchurl {
492 url = "https://pypi.python.org/packages/b7/34/a496632c4fb6c1ee76efedf77bb8d28b29363d839953d95095b12defe791/click-5.1.tar.gz";
505 url = "https://pypi.python.org/packages/b7/34/a496632c4fb6c1ee76efedf77bb8d28b29363d839953d95095b12defe791/click-5.1.tar.gz";
493 md5 = "9c5323008cccfe232a8b161fc8196d41";
506 md5 = "9c5323008cccfe232a8b161fc8196d41";
494 };
507 };
495 meta = {
508 meta = {
496 license = [ pkgs.lib.licenses.bsdOriginal ];
509 license = [ pkgs.lib.licenses.bsdOriginal ];
497 };
510 };
498 };
511 };
499 colander = super.buildPythonPackage {
512 colander = super.buildPythonPackage {
500 name = "colander-1.2";
513 name = "colander-1.2";
501 buildInputs = with self; [];
514 buildInputs = with self; [];
502 doCheck = false;
515 doCheck = false;
503 propagatedBuildInputs = with self; [translationstring iso8601];
516 propagatedBuildInputs = with self; [translationstring iso8601];
504 src = fetchurl {
517 src = fetchurl {
505 url = "https://pypi.python.org/packages/14/23/c9ceba07a6a1dc0eefbb215fc0dc64aabc2b22ee756bc0f0c13278fa0887/colander-1.2.tar.gz";
518 url = "https://pypi.python.org/packages/14/23/c9ceba07a6a1dc0eefbb215fc0dc64aabc2b22ee756bc0f0c13278fa0887/colander-1.2.tar.gz";
506 md5 = "83db21b07936a0726e588dae1914b9ed";
519 md5 = "83db21b07936a0726e588dae1914b9ed";
507 };
520 };
508 meta = {
521 meta = {
509 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
522 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
510 };
523 };
511 };
524 };
512 configobj = super.buildPythonPackage {
525 configobj = super.buildPythonPackage {
513 name = "configobj-5.0.6";
526 name = "configobj-5.0.6";
514 buildInputs = with self; [];
527 buildInputs = with self; [];
515 doCheck = false;
528 doCheck = false;
516 propagatedBuildInputs = with self; [six];
529 propagatedBuildInputs = with self; [six];
517 src = fetchurl {
530 src = fetchurl {
518 url = "https://pypi.python.org/packages/64/61/079eb60459c44929e684fa7d9e2fdca403f67d64dd9dbac27296be2e0fab/configobj-5.0.6.tar.gz";
531 url = "https://pypi.python.org/packages/64/61/079eb60459c44929e684fa7d9e2fdca403f67d64dd9dbac27296be2e0fab/configobj-5.0.6.tar.gz";
519 md5 = "e472a3a1c2a67bb0ec9b5d54c13a47d6";
532 md5 = "e472a3a1c2a67bb0ec9b5d54c13a47d6";
520 };
533 };
521 meta = {
534 meta = {
522 license = [ pkgs.lib.licenses.bsdOriginal ];
535 license = [ pkgs.lib.licenses.bsdOriginal ];
523 };
536 };
524 };
537 };
538 configparser = super.buildPythonPackage {
539 name = "configparser-3.5.0";
540 buildInputs = with self; [];
541 doCheck = false;
542 propagatedBuildInputs = with self; [];
543 src = fetchurl {
544 url = "https://pypi.python.org/packages/7c/69/c2ce7e91c89dc073eb1aa74c0621c3eefbffe8216b3f9af9d3885265c01c/configparser-3.5.0.tar.gz";
545 md5 = "cfdd915a5b7a6c09917a64a573140538";
546 };
547 meta = {
548 license = [ pkgs.lib.licenses.mit ];
549 };
550 };
525 cov-core = super.buildPythonPackage {
551 cov-core = super.buildPythonPackage {
526 name = "cov-core-1.15.0";
552 name = "cov-core-1.15.0";
527 buildInputs = with self; [];
553 buildInputs = with self; [];
528 doCheck = false;
554 doCheck = false;
529 propagatedBuildInputs = with self; [coverage];
555 propagatedBuildInputs = with self; [coverage];
530 src = fetchurl {
556 src = fetchurl {
531 url = "https://pypi.python.org/packages/4b/87/13e75a47b4ba1be06f29f6d807ca99638bedc6b57fa491cd3de891ca2923/cov-core-1.15.0.tar.gz";
557 url = "https://pypi.python.org/packages/4b/87/13e75a47b4ba1be06f29f6d807ca99638bedc6b57fa491cd3de891ca2923/cov-core-1.15.0.tar.gz";
532 md5 = "f519d4cb4c4e52856afb14af52919fe6";
558 md5 = "f519d4cb4c4e52856afb14af52919fe6";
533 };
559 };
534 meta = {
560 meta = {
535 license = [ pkgs.lib.licenses.mit ];
561 license = [ pkgs.lib.licenses.mit ];
536 };
562 };
537 };
563 };
538 coverage = super.buildPythonPackage {
564 coverage = super.buildPythonPackage {
539 name = "coverage-3.7.1";
565 name = "coverage-3.7.1";
540 buildInputs = with self; [];
566 buildInputs = with self; [];
541 doCheck = false;
567 doCheck = false;
542 propagatedBuildInputs = with self; [];
568 propagatedBuildInputs = with self; [];
543 src = fetchurl {
569 src = fetchurl {
544 url = "https://pypi.python.org/packages/09/4f/89b06c7fdc09687bca507dc411c342556ef9c5a3b26756137a4878ff19bf/coverage-3.7.1.tar.gz";
570 url = "https://pypi.python.org/packages/09/4f/89b06c7fdc09687bca507dc411c342556ef9c5a3b26756137a4878ff19bf/coverage-3.7.1.tar.gz";
545 md5 = "c47b36ceb17eaff3ecfab3bcd347d0df";
571 md5 = "c47b36ceb17eaff3ecfab3bcd347d0df";
546 };
572 };
547 meta = {
573 meta = {
548 license = [ pkgs.lib.licenses.bsdOriginal ];
574 license = [ pkgs.lib.licenses.bsdOriginal ];
549 };
575 };
550 };
576 };
551 cssselect = super.buildPythonPackage {
577 cssselect = super.buildPythonPackage {
552 name = "cssselect-0.9.1";
578 name = "cssselect-0.9.1";
553 buildInputs = with self; [];
579 buildInputs = with self; [];
554 doCheck = false;
580 doCheck = false;
555 propagatedBuildInputs = with self; [];
581 propagatedBuildInputs = with self; [];
556 src = fetchurl {
582 src = fetchurl {
557 url = "https://pypi.python.org/packages/aa/e5/9ee1460d485b94a6d55732eb7ad5b6c084caf73dd6f9cb0bb7d2a78fafe8/cssselect-0.9.1.tar.gz";
583 url = "https://pypi.python.org/packages/aa/e5/9ee1460d485b94a6d55732eb7ad5b6c084caf73dd6f9cb0bb7d2a78fafe8/cssselect-0.9.1.tar.gz";
558 md5 = "c74f45966277dc7a0f768b9b0f3522ac";
584 md5 = "c74f45966277dc7a0f768b9b0f3522ac";
559 };
585 };
560 meta = {
586 meta = {
561 license = [ pkgs.lib.licenses.bsdOriginal ];
587 license = [ pkgs.lib.licenses.bsdOriginal ];
562 };
588 };
563 };
589 };
564 decorator = super.buildPythonPackage {
590 decorator = super.buildPythonPackage {
565 name = "decorator-3.4.2";
591 name = "decorator-3.4.2";
566 buildInputs = with self; [];
592 buildInputs = with self; [];
567 doCheck = false;
593 doCheck = false;
568 propagatedBuildInputs = with self; [];
594 propagatedBuildInputs = with self; [];
569 src = fetchurl {
595 src = fetchurl {
570 url = "https://pypi.python.org/packages/35/3a/42566eb7a2cbac774399871af04e11d7ae3fc2579e7dae85213b8d1d1c57/decorator-3.4.2.tar.gz";
596 url = "https://pypi.python.org/packages/35/3a/42566eb7a2cbac774399871af04e11d7ae3fc2579e7dae85213b8d1d1c57/decorator-3.4.2.tar.gz";
571 md5 = "9e0536870d2b83ae27d58dbf22582f4d";
597 md5 = "9e0536870d2b83ae27d58dbf22582f4d";
572 };
598 };
573 meta = {
599 meta = {
574 license = [ pkgs.lib.licenses.bsdOriginal ];
600 license = [ pkgs.lib.licenses.bsdOriginal ];
575 };
601 };
576 };
602 };
577 deform = super.buildPythonPackage {
603 deform = super.buildPythonPackage {
578 name = "deform-2.0a2";
604 name = "deform-2.0a2";
579 buildInputs = with self; [];
605 buildInputs = with self; [];
580 doCheck = false;
606 doCheck = false;
581 propagatedBuildInputs = with self; [Chameleon colander peppercorn translationstring zope.deprecation];
607 propagatedBuildInputs = with self; [Chameleon colander peppercorn translationstring zope.deprecation];
582 src = fetchurl {
608 src = fetchurl {
583 url = "https://pypi.python.org/packages/8d/b3/aab57e81da974a806dc9c5fa024a6404720f890a6dcf2e80885e3cb4609a/deform-2.0a2.tar.gz";
609 url = "https://pypi.python.org/packages/8d/b3/aab57e81da974a806dc9c5fa024a6404720f890a6dcf2e80885e3cb4609a/deform-2.0a2.tar.gz";
584 md5 = "7a90d41f7fbc18002ce74f39bd90a5e4";
610 md5 = "7a90d41f7fbc18002ce74f39bd90a5e4";
585 };
611 };
586 meta = {
612 meta = {
587 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
613 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
588 };
614 };
589 };
615 };
590 docutils = super.buildPythonPackage {
616 docutils = super.buildPythonPackage {
591 name = "docutils-0.12";
617 name = "docutils-0.12";
592 buildInputs = with self; [];
618 buildInputs = with self; [];
593 doCheck = false;
619 doCheck = false;
594 propagatedBuildInputs = with self; [];
620 propagatedBuildInputs = with self; [];
595 src = fetchurl {
621 src = fetchurl {
596 url = "https://pypi.python.org/packages/37/38/ceda70135b9144d84884ae2fc5886c6baac4edea39550f28bcd144c1234d/docutils-0.12.tar.gz";
622 url = "https://pypi.python.org/packages/37/38/ceda70135b9144d84884ae2fc5886c6baac4edea39550f28bcd144c1234d/docutils-0.12.tar.gz";
597 md5 = "4622263b62c5c771c03502afa3157768";
623 md5 = "4622263b62c5c771c03502afa3157768";
598 };
624 };
599 meta = {
625 meta = {
600 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.publicDomain pkgs.lib.licenses.gpl1 { fullName = "public domain, Python, 2-Clause BSD, GPL 3 (see COPYING.txt)"; } pkgs.lib.licenses.psfl ];
626 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.publicDomain pkgs.lib.licenses.gpl1 { fullName = "public domain, Python, 2-Clause BSD, GPL 3 (see COPYING.txt)"; } pkgs.lib.licenses.psfl ];
601 };
627 };
602 };
628 };
603 dogpile.cache = super.buildPythonPackage {
629 dogpile.cache = super.buildPythonPackage {
604 name = "dogpile.cache-0.6.1";
630 name = "dogpile.cache-0.6.1";
605 buildInputs = with self; [];
631 buildInputs = with self; [];
606 doCheck = false;
632 doCheck = false;
607 propagatedBuildInputs = with self; [];
633 propagatedBuildInputs = with self; [];
608 src = fetchurl {
634 src = fetchurl {
609 url = "https://pypi.python.org/packages/f6/a0/6f2142c58c6588d17c734265b103ae1cd0741e1681dd9483a63f22033375/dogpile.cache-0.6.1.tar.gz";
635 url = "https://pypi.python.org/packages/f6/a0/6f2142c58c6588d17c734265b103ae1cd0741e1681dd9483a63f22033375/dogpile.cache-0.6.1.tar.gz";
610 md5 = "35d7fb30f22bbd0685763d894dd079a9";
636 md5 = "35d7fb30f22bbd0685763d894dd079a9";
611 };
637 };
612 meta = {
638 meta = {
613 license = [ pkgs.lib.licenses.bsdOriginal ];
639 license = [ pkgs.lib.licenses.bsdOriginal ];
614 };
640 };
615 };
641 };
616 dogpile.core = super.buildPythonPackage {
642 dogpile.core = super.buildPythonPackage {
617 name = "dogpile.core-0.4.1";
643 name = "dogpile.core-0.4.1";
618 buildInputs = with self; [];
644 buildInputs = with self; [];
619 doCheck = false;
645 doCheck = false;
620 propagatedBuildInputs = with self; [];
646 propagatedBuildInputs = with self; [];
621 src = fetchurl {
647 src = fetchurl {
622 url = "https://pypi.python.org/packages/0e/77/e72abc04c22aedf874301861e5c1e761231c288b5de369c18be8f4b5c9bb/dogpile.core-0.4.1.tar.gz";
648 url = "https://pypi.python.org/packages/0e/77/e72abc04c22aedf874301861e5c1e761231c288b5de369c18be8f4b5c9bb/dogpile.core-0.4.1.tar.gz";
623 md5 = "01cb19f52bba3e95c9b560f39341f045";
649 md5 = "01cb19f52bba3e95c9b560f39341f045";
624 };
650 };
625 meta = {
651 meta = {
626 license = [ pkgs.lib.licenses.bsdOriginal ];
652 license = [ pkgs.lib.licenses.bsdOriginal ];
627 };
653 };
628 };
654 };
629 ecdsa = super.buildPythonPackage {
655 ecdsa = super.buildPythonPackage {
630 name = "ecdsa-0.11";
656 name = "ecdsa-0.11";
631 buildInputs = with self; [];
657 buildInputs = with self; [];
632 doCheck = false;
658 doCheck = false;
633 propagatedBuildInputs = with self; [];
659 propagatedBuildInputs = with self; [];
634 src = fetchurl {
660 src = fetchurl {
635 url = "https://pypi.python.org/packages/6c/3f/92fe5dcdcaa7bd117be21e5520c9a54375112b66ec000d209e9e9519fad1/ecdsa-0.11.tar.gz";
661 url = "https://pypi.python.org/packages/6c/3f/92fe5dcdcaa7bd117be21e5520c9a54375112b66ec000d209e9e9519fad1/ecdsa-0.11.tar.gz";
636 md5 = "8ef586fe4dbb156697d756900cb41d7c";
662 md5 = "8ef586fe4dbb156697d756900cb41d7c";
637 };
663 };
638 meta = {
664 meta = {
639 license = [ pkgs.lib.licenses.mit ];
665 license = [ pkgs.lib.licenses.mit ];
640 };
666 };
641 };
667 };
642 elasticsearch = super.buildPythonPackage {
668 elasticsearch = super.buildPythonPackage {
643 name = "elasticsearch-2.3.0";
669 name = "elasticsearch-2.3.0";
644 buildInputs = with self; [];
670 buildInputs = with self; [];
645 doCheck = false;
671 doCheck = false;
646 propagatedBuildInputs = with self; [urllib3];
672 propagatedBuildInputs = with self; [urllib3];
647 src = fetchurl {
673 src = fetchurl {
648 url = "https://pypi.python.org/packages/10/35/5fd52c5f0b0ee405ed4b5195e8bce44c5e041787680dc7b94b8071cac600/elasticsearch-2.3.0.tar.gz";
674 url = "https://pypi.python.org/packages/10/35/5fd52c5f0b0ee405ed4b5195e8bce44c5e041787680dc7b94b8071cac600/elasticsearch-2.3.0.tar.gz";
649 md5 = "2550f3b51629cf1ef9636608af92c340";
675 md5 = "2550f3b51629cf1ef9636608af92c340";
650 };
676 };
651 meta = {
677 meta = {
652 license = [ pkgs.lib.licenses.asl20 ];
678 license = [ pkgs.lib.licenses.asl20 ];
653 };
679 };
654 };
680 };
655 elasticsearch-dsl = super.buildPythonPackage {
681 elasticsearch-dsl = super.buildPythonPackage {
656 name = "elasticsearch-dsl-2.2.0";
682 name = "elasticsearch-dsl-2.2.0";
657 buildInputs = with self; [];
683 buildInputs = with self; [];
658 doCheck = false;
684 doCheck = false;
659 propagatedBuildInputs = with self; [six python-dateutil elasticsearch];
685 propagatedBuildInputs = with self; [six python-dateutil elasticsearch];
660 src = fetchurl {
686 src = fetchurl {
661 url = "https://pypi.python.org/packages/66/2f/52a086968788e58461641570f45c3207a52d46ebbe9b77dc22b6a8ffda66/elasticsearch-dsl-2.2.0.tar.gz";
687 url = "https://pypi.python.org/packages/66/2f/52a086968788e58461641570f45c3207a52d46ebbe9b77dc22b6a8ffda66/elasticsearch-dsl-2.2.0.tar.gz";
662 md5 = "fa6bd3c87ea3caa8f0f051bc37c53221";
688 md5 = "fa6bd3c87ea3caa8f0f051bc37c53221";
663 };
689 };
664 meta = {
690 meta = {
665 license = [ pkgs.lib.licenses.asl20 ];
691 license = [ pkgs.lib.licenses.asl20 ];
666 };
692 };
667 };
693 };
694 entrypoints = super.buildPythonPackage {
695 name = "entrypoints-0.2.2";
696 buildInputs = with self; [];
697 doCheck = false;
698 propagatedBuildInputs = with self; [configparser];
699 src = fetchurl {
700 url = "https://code.rhodecode.com/upstream/entrypoints/archive/96e6d645684e1af3d7df5b5272f3fe85a546b233.tar.gz?md5=7db37771aea9ac9fefe093e5d6987313";
701 md5 = "7db37771aea9ac9fefe093e5d6987313";
702 };
703 meta = {
704 license = [ pkgs.lib.licenses.mit ];
705 };
706 };
668 enum34 = super.buildPythonPackage {
707 enum34 = super.buildPythonPackage {
669 name = "enum34-1.1.6";
708 name = "enum34-1.1.6";
670 buildInputs = with self; [];
709 buildInputs = with self; [];
671 doCheck = false;
710 doCheck = false;
672 propagatedBuildInputs = with self; [];
711 propagatedBuildInputs = with self; [];
673 src = fetchurl {
712 src = fetchurl {
674 url = "https://pypi.python.org/packages/bf/3e/31d502c25302814a7c2f1d3959d2a3b3f78e509002ba91aea64993936876/enum34-1.1.6.tar.gz";
713 url = "https://pypi.python.org/packages/bf/3e/31d502c25302814a7c2f1d3959d2a3b3f78e509002ba91aea64993936876/enum34-1.1.6.tar.gz";
675 md5 = "5f13a0841a61f7fc295c514490d120d0";
714 md5 = "5f13a0841a61f7fc295c514490d120d0";
676 };
715 };
677 meta = {
716 meta = {
678 license = [ pkgs.lib.licenses.bsdOriginal ];
717 license = [ pkgs.lib.licenses.bsdOriginal ];
679 };
718 };
680 };
719 };
720 functools32 = super.buildPythonPackage {
721 name = "functools32-3.2.3.post2";
722 buildInputs = with self; [];
723 doCheck = false;
724 propagatedBuildInputs = with self; [];
725 src = fetchurl {
726 url = "https://pypi.python.org/packages/5e/1a/0aa2c8195a204a9f51284018562dea77e25511f02fe924fac202fc012172/functools32-3.2.3-2.zip";
727 md5 = "d55232eb132ec779e6893c902a0bc5ad";
728 };
729 meta = {
730 license = [ pkgs.lib.licenses.psfl ];
731 };
732 };
681 future = super.buildPythonPackage {
733 future = super.buildPythonPackage {
682 name = "future-0.14.3";
734 name = "future-0.14.3";
683 buildInputs = with self; [];
735 buildInputs = with self; [];
684 doCheck = false;
736 doCheck = false;
685 propagatedBuildInputs = with self; [];
737 propagatedBuildInputs = with self; [];
686 src = fetchurl {
738 src = fetchurl {
687 url = "https://pypi.python.org/packages/83/80/8ef3a11a15f8eaafafa0937b20c1b3f73527e69ab6b3fa1cf94a5a96aabb/future-0.14.3.tar.gz";
739 url = "https://pypi.python.org/packages/83/80/8ef3a11a15f8eaafafa0937b20c1b3f73527e69ab6b3fa1cf94a5a96aabb/future-0.14.3.tar.gz";
688 md5 = "e94079b0bd1fc054929e8769fc0f6083";
740 md5 = "e94079b0bd1fc054929e8769fc0f6083";
689 };
741 };
690 meta = {
742 meta = {
691 license = [ { fullName = "OSI Approved"; } pkgs.lib.licenses.mit ];
743 license = [ { fullName = "OSI Approved"; } pkgs.lib.licenses.mit ];
692 };
744 };
693 };
745 };
694 futures = super.buildPythonPackage {
746 futures = super.buildPythonPackage {
695 name = "futures-3.0.2";
747 name = "futures-3.0.2";
696 buildInputs = with self; [];
748 buildInputs = with self; [];
697 doCheck = false;
749 doCheck = false;
698 propagatedBuildInputs = with self; [];
750 propagatedBuildInputs = with self; [];
699 src = fetchurl {
751 src = fetchurl {
700 url = "https://pypi.python.org/packages/f8/e7/fc0fcbeb9193ba2d4de00b065e7fd5aecd0679e93ce95a07322b2b1434f4/futures-3.0.2.tar.gz";
752 url = "https://pypi.python.org/packages/f8/e7/fc0fcbeb9193ba2d4de00b065e7fd5aecd0679e93ce95a07322b2b1434f4/futures-3.0.2.tar.gz";
701 md5 = "42aaf1e4de48d6e871d77dc1f9d96d5a";
753 md5 = "42aaf1e4de48d6e871d77dc1f9d96d5a";
702 };
754 };
703 meta = {
755 meta = {
704 license = [ pkgs.lib.licenses.bsdOriginal ];
756 license = [ pkgs.lib.licenses.bsdOriginal ];
705 };
757 };
706 };
758 };
707 gevent = super.buildPythonPackage {
759 gevent = super.buildPythonPackage {
708 name = "gevent-1.1.2";
760 name = "gevent-1.1.2";
709 buildInputs = with self; [];
761 buildInputs = with self; [];
710 doCheck = false;
762 doCheck = false;
711 propagatedBuildInputs = with self; [greenlet];
763 propagatedBuildInputs = with self; [greenlet];
712 src = fetchurl {
764 src = fetchurl {
713 url = "https://pypi.python.org/packages/43/8f/cb3224a0e6ab663547f45c10d0651cfd52633fde4283bf68d627084df8cc/gevent-1.1.2.tar.gz";
765 url = "https://pypi.python.org/packages/43/8f/cb3224a0e6ab663547f45c10d0651cfd52633fde4283bf68d627084df8cc/gevent-1.1.2.tar.gz";
714 md5 = "bb32a2f852a4997138014d5007215c6e";
766 md5 = "bb32a2f852a4997138014d5007215c6e";
715 };
767 };
716 meta = {
768 meta = {
717 license = [ pkgs.lib.licenses.mit ];
769 license = [ pkgs.lib.licenses.mit ];
718 };
770 };
719 };
771 };
720 gnureadline = super.buildPythonPackage {
772 gnureadline = super.buildPythonPackage {
721 name = "gnureadline-6.3.3";
773 name = "gnureadline-6.3.3";
722 buildInputs = with self; [];
774 buildInputs = with self; [];
723 doCheck = false;
775 doCheck = false;
724 propagatedBuildInputs = with self; [];
776 propagatedBuildInputs = with self; [];
725 src = fetchurl {
777 src = fetchurl {
726 url = "https://pypi.python.org/packages/3a/ee/2c3f568b0a74974791ac590ec742ef6133e2fbd287a074ba72a53fa5e97c/gnureadline-6.3.3.tar.gz";
778 url = "https://pypi.python.org/packages/3a/ee/2c3f568b0a74974791ac590ec742ef6133e2fbd287a074ba72a53fa5e97c/gnureadline-6.3.3.tar.gz";
727 md5 = "c4af83c9a3fbeac8f2da9b5a7c60e51c";
779 md5 = "c4af83c9a3fbeac8f2da9b5a7c60e51c";
728 };
780 };
729 meta = {
781 meta = {
730 license = [ pkgs.lib.licenses.gpl1 ];
782 license = [ pkgs.lib.licenses.gpl1 ];
731 };
783 };
732 };
784 };
733 gprof2dot = super.buildPythonPackage {
785 gprof2dot = super.buildPythonPackage {
734 name = "gprof2dot-2016.10.13";
786 name = "gprof2dot-2016.10.13";
735 buildInputs = with self; [];
787 buildInputs = with self; [];
736 doCheck = false;
788 doCheck = false;
737 propagatedBuildInputs = with self; [];
789 propagatedBuildInputs = with self; [];
738 src = fetchurl {
790 src = fetchurl {
739 url = "https://pypi.python.org/packages/a0/e0/73c71baed306f0402a00a94ffc7b2be94ad1296dfcb8b46912655b93154c/gprof2dot-2016.10.13.tar.gz";
791 url = "https://pypi.python.org/packages/a0/e0/73c71baed306f0402a00a94ffc7b2be94ad1296dfcb8b46912655b93154c/gprof2dot-2016.10.13.tar.gz";
740 md5 = "0125401f15fd2afe1df686a76c64a4fd";
792 md5 = "0125401f15fd2afe1df686a76c64a4fd";
741 };
793 };
742 meta = {
794 meta = {
743 license = [ { fullName = "LGPL"; } ];
795 license = [ { fullName = "LGPL"; } ];
744 };
796 };
745 };
797 };
746 greenlet = super.buildPythonPackage {
798 greenlet = super.buildPythonPackage {
747 name = "greenlet-0.4.10";
799 name = "greenlet-0.4.10";
748 buildInputs = with self; [];
800 buildInputs = with self; [];
749 doCheck = false;
801 doCheck = false;
750 propagatedBuildInputs = with self; [];
802 propagatedBuildInputs = with self; [];
751 src = fetchurl {
803 src = fetchurl {
752 url = "https://pypi.python.org/packages/67/62/ca2a95648666eaa2ffeb6a9b3964f21d419ae27f82f2e66b53da5b943fc4/greenlet-0.4.10.zip";
804 url = "https://pypi.python.org/packages/67/62/ca2a95648666eaa2ffeb6a9b3964f21d419ae27f82f2e66b53da5b943fc4/greenlet-0.4.10.zip";
753 md5 = "bed0c4b3b896702131f4d5c72f87c41d";
805 md5 = "bed0c4b3b896702131f4d5c72f87c41d";
754 };
806 };
755 meta = {
807 meta = {
756 license = [ pkgs.lib.licenses.mit ];
808 license = [ pkgs.lib.licenses.mit ];
757 };
809 };
758 };
810 };
759 gunicorn = super.buildPythonPackage {
811 gunicorn = super.buildPythonPackage {
760 name = "gunicorn-19.6.0";
812 name = "gunicorn-19.6.0";
761 buildInputs = with self; [];
813 buildInputs = with self; [];
762 doCheck = false;
814 doCheck = false;
763 propagatedBuildInputs = with self; [];
815 propagatedBuildInputs = with self; [];
764 src = fetchurl {
816 src = fetchurl {
765 url = "https://pypi.python.org/packages/84/ce/7ea5396efad1cef682bbc4068e72a0276341d9d9d0f501da609fab9fcb80/gunicorn-19.6.0.tar.gz";
817 url = "https://pypi.python.org/packages/84/ce/7ea5396efad1cef682bbc4068e72a0276341d9d9d0f501da609fab9fcb80/gunicorn-19.6.0.tar.gz";
766 md5 = "338e5e8a83ea0f0625f768dba4597530";
818 md5 = "338e5e8a83ea0f0625f768dba4597530";
767 };
819 };
768 meta = {
820 meta = {
769 license = [ pkgs.lib.licenses.mit ];
821 license = [ pkgs.lib.licenses.mit ];
770 };
822 };
771 };
823 };
824 html5lib = super.buildPythonPackage {
825 name = "html5lib-0.9999999";
826 buildInputs = with self; [];
827 doCheck = false;
828 propagatedBuildInputs = with self; [six];
829 src = fetchurl {
830 url = "https://pypi.python.org/packages/ae/ae/bcb60402c60932b32dfaf19bb53870b29eda2cd17551ba5639219fb5ebf9/html5lib-0.9999999.tar.gz";
831 md5 = "ef43cb05e9e799f25d65d1135838a96f";
832 };
833 meta = {
834 license = [ pkgs.lib.licenses.mit ];
835 };
836 };
772 infrae.cache = super.buildPythonPackage {
837 infrae.cache = super.buildPythonPackage {
773 name = "infrae.cache-1.0.1";
838 name = "infrae.cache-1.0.1";
774 buildInputs = with self; [];
839 buildInputs = with self; [];
775 doCheck = false;
840 doCheck = false;
776 propagatedBuildInputs = with self; [Beaker repoze.lru];
841 propagatedBuildInputs = with self; [Beaker repoze.lru];
777 src = fetchurl {
842 src = fetchurl {
778 url = "https://pypi.python.org/packages/bb/f0/e7d5e984cf6592fd2807dc7bc44a93f9d18e04e6a61f87fdfb2622422d74/infrae.cache-1.0.1.tar.gz";
843 url = "https://pypi.python.org/packages/bb/f0/e7d5e984cf6592fd2807dc7bc44a93f9d18e04e6a61f87fdfb2622422d74/infrae.cache-1.0.1.tar.gz";
779 md5 = "b09076a766747e6ed2a755cc62088e32";
844 md5 = "b09076a766747e6ed2a755cc62088e32";
780 };
845 };
781 meta = {
846 meta = {
782 license = [ pkgs.lib.licenses.zpt21 ];
847 license = [ pkgs.lib.licenses.zpt21 ];
783 };
848 };
784 };
849 };
785 invoke = super.buildPythonPackage {
850 invoke = super.buildPythonPackage {
786 name = "invoke-0.13.0";
851 name = "invoke-0.13.0";
787 buildInputs = with self; [];
852 buildInputs = with self; [];
788 doCheck = false;
853 doCheck = false;
789 propagatedBuildInputs = with self; [];
854 propagatedBuildInputs = with self; [];
790 src = fetchurl {
855 src = fetchurl {
791 url = "https://pypi.python.org/packages/47/bf/d07ef52fa1ac645468858bbac7cb95b246a972a045e821493d17d89c81be/invoke-0.13.0.tar.gz";
856 url = "https://pypi.python.org/packages/47/bf/d07ef52fa1ac645468858bbac7cb95b246a972a045e821493d17d89c81be/invoke-0.13.0.tar.gz";
792 md5 = "c0d1ed4bfb34eaab551662d8cfee6540";
857 md5 = "c0d1ed4bfb34eaab551662d8cfee6540";
793 };
858 };
794 meta = {
859 meta = {
795 license = [ pkgs.lib.licenses.bsdOriginal ];
860 license = [ pkgs.lib.licenses.bsdOriginal ];
796 };
861 };
797 };
862 };
798 ipdb = super.buildPythonPackage {
863 ipdb = super.buildPythonPackage {
799 name = "ipdb-0.10.1";
864 name = "ipdb-0.10.1";
800 buildInputs = with self; [];
865 buildInputs = with self; [];
801 doCheck = false;
866 doCheck = false;
802 propagatedBuildInputs = with self; [ipython setuptools];
867 propagatedBuildInputs = with self; [ipython setuptools];
803 src = fetchurl {
868 src = fetchurl {
804 url = "https://pypi.python.org/packages/eb/0a/0a37dc19572580336ad3813792c0d18c8d7117c2d66fc63c501f13a7a8f8/ipdb-0.10.1.tar.gz";
869 url = "https://pypi.python.org/packages/eb/0a/0a37dc19572580336ad3813792c0d18c8d7117c2d66fc63c501f13a7a8f8/ipdb-0.10.1.tar.gz";
805 md5 = "4aeab65f633ddc98ebdb5eebf08dc713";
870 md5 = "4aeab65f633ddc98ebdb5eebf08dc713";
806 };
871 };
807 meta = {
872 meta = {
808 license = [ pkgs.lib.licenses.bsdOriginal ];
873 license = [ pkgs.lib.licenses.bsdOriginal ];
809 };
874 };
810 };
875 };
811 ipython = super.buildPythonPackage {
876 ipython = super.buildPythonPackage {
812 name = "ipython-5.1.0";
877 name = "ipython-5.1.0";
813 buildInputs = with self; [];
878 buildInputs = with self; [];
814 doCheck = false;
879 doCheck = false;
815 propagatedBuildInputs = with self; [setuptools decorator pickleshare simplegeneric traitlets prompt-toolkit Pygments pexpect backports.shutil-get-terminal-size pathlib2 pexpect];
880 propagatedBuildInputs = with self; [setuptools decorator pickleshare simplegeneric traitlets prompt-toolkit Pygments pexpect backports.shutil-get-terminal-size pathlib2 pexpect];
816 src = fetchurl {
881 src = fetchurl {
817 url = "https://pypi.python.org/packages/89/63/a9292f7cd9d0090a0f995e1167f3f17d5889dcbc9a175261719c513b9848/ipython-5.1.0.tar.gz";
882 url = "https://pypi.python.org/packages/89/63/a9292f7cd9d0090a0f995e1167f3f17d5889dcbc9a175261719c513b9848/ipython-5.1.0.tar.gz";
818 md5 = "47c8122420f65b58784cb4b9b4af35e3";
883 md5 = "47c8122420f65b58784cb4b9b4af35e3";
819 };
884 };
820 meta = {
885 meta = {
821 license = [ pkgs.lib.licenses.bsdOriginal ];
886 license = [ pkgs.lib.licenses.bsdOriginal ];
822 };
887 };
823 };
888 };
824 ipython-genutils = super.buildPythonPackage {
889 ipython-genutils = super.buildPythonPackage {
825 name = "ipython-genutils-0.1.0";
890 name = "ipython-genutils-0.1.0";
826 buildInputs = with self; [];
891 buildInputs = with self; [];
827 doCheck = false;
892 doCheck = false;
828 propagatedBuildInputs = with self; [];
893 propagatedBuildInputs = with self; [];
829 src = fetchurl {
894 src = fetchurl {
830 url = "https://pypi.python.org/packages/71/b7/a64c71578521606edbbce15151358598f3dfb72a3431763edc2baf19e71f/ipython_genutils-0.1.0.tar.gz";
895 url = "https://pypi.python.org/packages/71/b7/a64c71578521606edbbce15151358598f3dfb72a3431763edc2baf19e71f/ipython_genutils-0.1.0.tar.gz";
831 md5 = "9a8afbe0978adbcbfcb3b35b2d015a56";
896 md5 = "9a8afbe0978adbcbfcb3b35b2d015a56";
832 };
897 };
833 meta = {
898 meta = {
834 license = [ pkgs.lib.licenses.bsdOriginal ];
899 license = [ pkgs.lib.licenses.bsdOriginal ];
835 };
900 };
836 };
901 };
837 iso8601 = super.buildPythonPackage {
902 iso8601 = super.buildPythonPackage {
838 name = "iso8601-0.1.11";
903 name = "iso8601-0.1.11";
839 buildInputs = with self; [];
904 buildInputs = with self; [];
840 doCheck = false;
905 doCheck = false;
841 propagatedBuildInputs = with self; [];
906 propagatedBuildInputs = with self; [];
842 src = fetchurl {
907 src = fetchurl {
843 url = "https://pypi.python.org/packages/c0/75/c9209ee4d1b5975eb8c2cba4428bde6b61bd55664a98290dd015cdb18e98/iso8601-0.1.11.tar.gz";
908 url = "https://pypi.python.org/packages/c0/75/c9209ee4d1b5975eb8c2cba4428bde6b61bd55664a98290dd015cdb18e98/iso8601-0.1.11.tar.gz";
844 md5 = "b06d11cd14a64096f907086044f0fe38";
909 md5 = "b06d11cd14a64096f907086044f0fe38";
845 };
910 };
846 meta = {
911 meta = {
847 license = [ pkgs.lib.licenses.mit ];
912 license = [ pkgs.lib.licenses.mit ];
848 };
913 };
849 };
914 };
850 itsdangerous = super.buildPythonPackage {
915 itsdangerous = super.buildPythonPackage {
851 name = "itsdangerous-0.24";
916 name = "itsdangerous-0.24";
852 buildInputs = with self; [];
917 buildInputs = with self; [];
853 doCheck = false;
918 doCheck = false;
854 propagatedBuildInputs = with self; [];
919 propagatedBuildInputs = with self; [];
855 src = fetchurl {
920 src = fetchurl {
856 url = "https://pypi.python.org/packages/dc/b4/a60bcdba945c00f6d608d8975131ab3f25b22f2bcfe1dab221165194b2d4/itsdangerous-0.24.tar.gz";
921 url = "https://pypi.python.org/packages/dc/b4/a60bcdba945c00f6d608d8975131ab3f25b22f2bcfe1dab221165194b2d4/itsdangerous-0.24.tar.gz";
857 md5 = "a3d55aa79369aef5345c036a8a26307f";
922 md5 = "a3d55aa79369aef5345c036a8a26307f";
858 };
923 };
859 meta = {
924 meta = {
860 license = [ pkgs.lib.licenses.bsdOriginal ];
925 license = [ pkgs.lib.licenses.bsdOriginal ];
861 };
926 };
862 };
927 };
928 jsonschema = super.buildPythonPackage {
929 name = "jsonschema-2.6.0";
930 buildInputs = with self; [];
931 doCheck = false;
932 propagatedBuildInputs = with self; [functools32];
933 src = fetchurl {
934 url = "https://pypi.python.org/packages/58/b9/171dbb07e18c6346090a37f03c7e74410a1a56123f847efed59af260a298/jsonschema-2.6.0.tar.gz";
935 md5 = "50c6b69a373a8b55ff1e0ec6e78f13f4";
936 };
937 meta = {
938 license = [ pkgs.lib.licenses.mit ];
939 };
940 };
941 jupyter-client = super.buildPythonPackage {
942 name = "jupyter-client-5.0.0";
943 buildInputs = with self; [];
944 doCheck = false;
945 propagatedBuildInputs = with self; [traitlets jupyter-core pyzmq python-dateutil];
946 src = fetchurl {
947 url = "https://pypi.python.org/packages/e5/6f/65412ed462202b90134b7e761b0b7e7f949e07a549c1755475333727b3d0/jupyter_client-5.0.0.tar.gz";
948 md5 = "1acd331b5c9fb4d79dae9939e79f2426";
949 };
950 meta = {
951 license = [ pkgs.lib.licenses.bsdOriginal ];
952 };
953 };
954 jupyter-core = super.buildPythonPackage {
955 name = "jupyter-core-4.3.0";
956 buildInputs = with self; [];
957 doCheck = false;
958 propagatedBuildInputs = with self; [traitlets];
959 src = fetchurl {
960 url = "https://pypi.python.org/packages/2f/39/5138f975100ce14d150938df48a83cd852a3fd8e24b1244f4113848e69e2/jupyter_core-4.3.0.tar.gz";
961 md5 = "18819511a809afdeed9a995a9c27bcfb";
962 };
963 meta = {
964 license = [ pkgs.lib.licenses.bsdOriginal ];
965 };
966 };
863 kombu = super.buildPythonPackage {
967 kombu = super.buildPythonPackage {
864 name = "kombu-1.5.1";
968 name = "kombu-1.5.1";
865 buildInputs = with self; [];
969 buildInputs = with self; [];
866 doCheck = false;
970 doCheck = false;
867 propagatedBuildInputs = with self; [anyjson amqplib];
971 propagatedBuildInputs = with self; [anyjson amqplib];
868 src = fetchurl {
972 src = fetchurl {
869 url = "https://pypi.python.org/packages/19/53/74bf2a624644b45f0850a638752514fc10a8e1cbd738f10804951a6df3f5/kombu-1.5.1.tar.gz";
973 url = "https://pypi.python.org/packages/19/53/74bf2a624644b45f0850a638752514fc10a8e1cbd738f10804951a6df3f5/kombu-1.5.1.tar.gz";
870 md5 = "50662f3c7e9395b3d0721fb75d100b63";
974 md5 = "50662f3c7e9395b3d0721fb75d100b63";
871 };
975 };
872 meta = {
976 meta = {
873 license = [ pkgs.lib.licenses.bsdOriginal ];
977 license = [ pkgs.lib.licenses.bsdOriginal ];
874 };
978 };
875 };
979 };
876 lxml = super.buildPythonPackage {
980 lxml = super.buildPythonPackage {
877 name = "lxml-3.4.4";
981 name = "lxml-3.4.4";
878 buildInputs = with self; [];
982 buildInputs = with self; [];
879 doCheck = false;
983 doCheck = false;
880 propagatedBuildInputs = with self; [];
984 propagatedBuildInputs = with self; [];
881 src = fetchurl {
985 src = fetchurl {
882 url = "https://pypi.python.org/packages/63/c7/4f2a2a4ad6c6fa99b14be6b3c1cece9142e2d915aa7c43c908677afc8fa4/lxml-3.4.4.tar.gz";
986 url = "https://pypi.python.org/packages/63/c7/4f2a2a4ad6c6fa99b14be6b3c1cece9142e2d915aa7c43c908677afc8fa4/lxml-3.4.4.tar.gz";
883 md5 = "a9a65972afc173ec7a39c585f4eea69c";
987 md5 = "a9a65972afc173ec7a39c585f4eea69c";
884 };
988 };
885 meta = {
989 meta = {
886 license = [ pkgs.lib.licenses.bsdOriginal ];
990 license = [ pkgs.lib.licenses.bsdOriginal ];
887 };
991 };
888 };
992 };
889 meld3 = super.buildPythonPackage {
993 meld3 = super.buildPythonPackage {
890 name = "meld3-1.0.2";
994 name = "meld3-1.0.2";
891 buildInputs = with self; [];
995 buildInputs = with self; [];
892 doCheck = false;
996 doCheck = false;
893 propagatedBuildInputs = with self; [];
997 propagatedBuildInputs = with self; [];
894 src = fetchurl {
998 src = fetchurl {
895 url = "https://pypi.python.org/packages/45/a0/317c6422b26c12fe0161e936fc35f36552069ba8e6f7ecbd99bbffe32a5f/meld3-1.0.2.tar.gz";
999 url = "https://pypi.python.org/packages/45/a0/317c6422b26c12fe0161e936fc35f36552069ba8e6f7ecbd99bbffe32a5f/meld3-1.0.2.tar.gz";
896 md5 = "3ccc78cd79cffd63a751ad7684c02c91";
1000 md5 = "3ccc78cd79cffd63a751ad7684c02c91";
897 };
1001 };
898 meta = {
1002 meta = {
899 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1003 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
900 };
1004 };
901 };
1005 };
1006 mistune = super.buildPythonPackage {
1007 name = "mistune-0.7.3";
1008 buildInputs = with self; [];
1009 doCheck = false;
1010 propagatedBuildInputs = with self; [];
1011 src = fetchurl {
1012 url = "https://pypi.python.org/packages/88/1e/be99791262b3a794332fda598a07c2749a433b9378586361ba9d8e824607/mistune-0.7.3.tar.gz";
1013 md5 = "4eba50bd121b83716fa4be6a4049004b";
1014 };
1015 meta = {
1016 license = [ pkgs.lib.licenses.bsdOriginal ];
1017 };
1018 };
902 mock = super.buildPythonPackage {
1019 mock = super.buildPythonPackage {
903 name = "mock-1.0.1";
1020 name = "mock-1.0.1";
904 buildInputs = with self; [];
1021 buildInputs = with self; [];
905 doCheck = false;
1022 doCheck = false;
906 propagatedBuildInputs = with self; [];
1023 propagatedBuildInputs = with self; [];
907 src = fetchurl {
1024 src = fetchurl {
908 url = "https://pypi.python.org/packages/15/45/30273ee91feb60dabb8fbb2da7868520525f02cf910279b3047182feed80/mock-1.0.1.zip";
1025 url = "https://pypi.python.org/packages/15/45/30273ee91feb60dabb8fbb2da7868520525f02cf910279b3047182feed80/mock-1.0.1.zip";
909 md5 = "869f08d003c289a97c1a6610faf5e913";
1026 md5 = "869f08d003c289a97c1a6610faf5e913";
910 };
1027 };
911 meta = {
1028 meta = {
912 license = [ pkgs.lib.licenses.bsdOriginal ];
1029 license = [ pkgs.lib.licenses.bsdOriginal ];
913 };
1030 };
914 };
1031 };
915 msgpack-python = super.buildPythonPackage {
1032 msgpack-python = super.buildPythonPackage {
916 name = "msgpack-python-0.4.8";
1033 name = "msgpack-python-0.4.8";
917 buildInputs = with self; [];
1034 buildInputs = with self; [];
918 doCheck = false;
1035 doCheck = false;
919 propagatedBuildInputs = with self; [];
1036 propagatedBuildInputs = with self; [];
920 src = fetchurl {
1037 src = fetchurl {
921 url = "https://pypi.python.org/packages/21/27/8a1d82041c7a2a51fcc73675875a5f9ea06c2663e02fcfeb708be1d081a0/msgpack-python-0.4.8.tar.gz";
1038 url = "https://pypi.python.org/packages/21/27/8a1d82041c7a2a51fcc73675875a5f9ea06c2663e02fcfeb708be1d081a0/msgpack-python-0.4.8.tar.gz";
922 md5 = "dcd854fb41ee7584ebbf35e049e6be98";
1039 md5 = "dcd854fb41ee7584ebbf35e049e6be98";
923 };
1040 };
924 meta = {
1041 meta = {
925 license = [ pkgs.lib.licenses.asl20 ];
1042 license = [ pkgs.lib.licenses.asl20 ];
926 };
1043 };
927 };
1044 };
1045 nbconvert = super.buildPythonPackage {
1046 name = "nbconvert-5.1.1";
1047 buildInputs = with self; [];
1048 doCheck = false;
1049 propagatedBuildInputs = with self; [mistune Jinja2 Pygments traitlets jupyter-core nbformat entrypoints bleach pandocfilters testpath];
1050 src = fetchurl {
1051 url = "https://pypi.python.org/packages/95/58/df1c91f1658ee5df19097f915a1e71c91fc824a708d82d2b2e35f8b80e9a/nbconvert-5.1.1.tar.gz";
1052 md5 = "d0263fb03a44db2f94eea09a608ed813";
1053 };
1054 meta = {
1055 license = [ pkgs.lib.licenses.bsdOriginal ];
1056 };
1057 };
1058 nbformat = super.buildPythonPackage {
1059 name = "nbformat-4.3.0";
1060 buildInputs = with self; [];
1061 doCheck = false;
1062 propagatedBuildInputs = with self; [ipython-genutils traitlets jsonschema jupyter-core];
1063 src = fetchurl {
1064 url = "https://pypi.python.org/packages/f9/c5/89df4abf906f766727f976e170caa85b4f1c1d1feb1f45d716016e68e19f/nbformat-4.3.0.tar.gz";
1065 md5 = "9a00d20425914cd5ba5f97769d9963ca";
1066 };
1067 meta = {
1068 license = [ pkgs.lib.licenses.bsdOriginal ];
1069 };
1070 };
928 nose = super.buildPythonPackage {
1071 nose = super.buildPythonPackage {
929 name = "nose-1.3.6";
1072 name = "nose-1.3.6";
930 buildInputs = with self; [];
1073 buildInputs = with self; [];
931 doCheck = false;
1074 doCheck = false;
932 propagatedBuildInputs = with self; [];
1075 propagatedBuildInputs = with self; [];
933 src = fetchurl {
1076 src = fetchurl {
934 url = "https://pypi.python.org/packages/70/c7/469e68148d17a0d3db5ed49150242fd70a74a8147b8f3f8b87776e028d99/nose-1.3.6.tar.gz";
1077 url = "https://pypi.python.org/packages/70/c7/469e68148d17a0d3db5ed49150242fd70a74a8147b8f3f8b87776e028d99/nose-1.3.6.tar.gz";
935 md5 = "0ca546d81ca8309080fc80cb389e7a16";
1078 md5 = "0ca546d81ca8309080fc80cb389e7a16";
936 };
1079 };
937 meta = {
1080 meta = {
938 license = [ { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "GNU LGPL"; } ];
1081 license = [ { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "GNU LGPL"; } ];
939 };
1082 };
940 };
1083 };
941 objgraph = super.buildPythonPackage {
1084 objgraph = super.buildPythonPackage {
942 name = "objgraph-2.0.0";
1085 name = "objgraph-2.0.0";
943 buildInputs = with self; [];
1086 buildInputs = with self; [];
944 doCheck = false;
1087 doCheck = false;
945 propagatedBuildInputs = with self; [];
1088 propagatedBuildInputs = with self; [];
946 src = fetchurl {
1089 src = fetchurl {
947 url = "https://pypi.python.org/packages/d7/33/ace750b59247496ed769b170586c5def7202683f3d98e737b75b767ff29e/objgraph-2.0.0.tar.gz";
1090 url = "https://pypi.python.org/packages/d7/33/ace750b59247496ed769b170586c5def7202683f3d98e737b75b767ff29e/objgraph-2.0.0.tar.gz";
948 md5 = "25b0d5e5adc74aa63ead15699614159c";
1091 md5 = "25b0d5e5adc74aa63ead15699614159c";
949 };
1092 };
950 meta = {
1093 meta = {
951 license = [ pkgs.lib.licenses.mit ];
1094 license = [ pkgs.lib.licenses.mit ];
952 };
1095 };
953 };
1096 };
954 packaging = super.buildPythonPackage {
1097 packaging = super.buildPythonPackage {
955 name = "packaging-15.2";
1098 name = "packaging-15.2";
956 buildInputs = with self; [];
1099 buildInputs = with self; [];
957 doCheck = false;
1100 doCheck = false;
958 propagatedBuildInputs = with self; [];
1101 propagatedBuildInputs = with self; [];
959 src = fetchurl {
1102 src = fetchurl {
960 url = "https://pypi.python.org/packages/24/c4/185da1304f07047dc9e0c46c31db75c0351bd73458ac3efad7da3dbcfbe1/packaging-15.2.tar.gz";
1103 url = "https://pypi.python.org/packages/24/c4/185da1304f07047dc9e0c46c31db75c0351bd73458ac3efad7da3dbcfbe1/packaging-15.2.tar.gz";
961 md5 = "c16093476f6ced42128bf610e5db3784";
1104 md5 = "c16093476f6ced42128bf610e5db3784";
962 };
1105 };
963 meta = {
1106 meta = {
964 license = [ pkgs.lib.licenses.asl20 ];
1107 license = [ pkgs.lib.licenses.asl20 ];
965 };
1108 };
966 };
1109 };
1110 pandocfilters = super.buildPythonPackage {
1111 name = "pandocfilters-1.4.1";
1112 buildInputs = with self; [];
1113 doCheck = false;
1114 propagatedBuildInputs = with self; [];
1115 src = fetchurl {
1116 url = "https://pypi.python.org/packages/e3/1f/21d1b7e8ca571e80b796c758d361fdf5554335ff138158654684bc5401d8/pandocfilters-1.4.1.tar.gz";
1117 md5 = "7680d9f9ec07397dd17f380ee3818b9d";
1118 };
1119 meta = {
1120 license = [ pkgs.lib.licenses.bsdOriginal ];
1121 };
1122 };
967 paramiko = super.buildPythonPackage {
1123 paramiko = super.buildPythonPackage {
968 name = "paramiko-1.15.1";
1124 name = "paramiko-1.15.1";
969 buildInputs = with self; [];
1125 buildInputs = with self; [];
970 doCheck = false;
1126 doCheck = false;
971 propagatedBuildInputs = with self; [pycrypto ecdsa];
1127 propagatedBuildInputs = with self; [pycrypto ecdsa];
972 src = fetchurl {
1128 src = fetchurl {
973 url = "https://pypi.python.org/packages/04/2b/a22d2a560c1951abbbf95a0628e245945565f70dc082d9e784666887222c/paramiko-1.15.1.tar.gz";
1129 url = "https://pypi.python.org/packages/04/2b/a22d2a560c1951abbbf95a0628e245945565f70dc082d9e784666887222c/paramiko-1.15.1.tar.gz";
974 md5 = "48c274c3f9b1282932567b21f6acf3b5";
1130 md5 = "48c274c3f9b1282932567b21f6acf3b5";
975 };
1131 };
976 meta = {
1132 meta = {
977 license = [ { fullName = "LGPL"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
1133 license = [ { fullName = "LGPL"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
978 };
1134 };
979 };
1135 };
980 pathlib2 = super.buildPythonPackage {
1136 pathlib2 = super.buildPythonPackage {
981 name = "pathlib2-2.1.0";
1137 name = "pathlib2-2.1.0";
982 buildInputs = with self; [];
1138 buildInputs = with self; [];
983 doCheck = false;
1139 doCheck = false;
984 propagatedBuildInputs = with self; [six];
1140 propagatedBuildInputs = with self; [six];
985 src = fetchurl {
1141 src = fetchurl {
986 url = "https://pypi.python.org/packages/c9/27/8448b10d8440c08efeff0794adf7d0ed27adb98372c70c7b38f3947d4749/pathlib2-2.1.0.tar.gz";
1142 url = "https://pypi.python.org/packages/c9/27/8448b10d8440c08efeff0794adf7d0ed27adb98372c70c7b38f3947d4749/pathlib2-2.1.0.tar.gz";
987 md5 = "38e4f58b4d69dfcb9edb49a54a8b28d2";
1143 md5 = "38e4f58b4d69dfcb9edb49a54a8b28d2";
988 };
1144 };
989 meta = {
1145 meta = {
990 license = [ pkgs.lib.licenses.mit ];
1146 license = [ pkgs.lib.licenses.mit ];
991 };
1147 };
992 };
1148 };
993 peppercorn = super.buildPythonPackage {
1149 peppercorn = super.buildPythonPackage {
994 name = "peppercorn-0.5";
1150 name = "peppercorn-0.5";
995 buildInputs = with self; [];
1151 buildInputs = with self; [];
996 doCheck = false;
1152 doCheck = false;
997 propagatedBuildInputs = with self; [];
1153 propagatedBuildInputs = with self; [];
998 src = fetchurl {
1154 src = fetchurl {
999 url = "https://pypi.python.org/packages/45/ec/a62ec317d1324a01567c5221b420742f094f05ee48097e5157d32be3755c/peppercorn-0.5.tar.gz";
1155 url = "https://pypi.python.org/packages/45/ec/a62ec317d1324a01567c5221b420742f094f05ee48097e5157d32be3755c/peppercorn-0.5.tar.gz";
1000 md5 = "f08efbca5790019ab45d76b7244abd40";
1156 md5 = "f08efbca5790019ab45d76b7244abd40";
1001 };
1157 };
1002 meta = {
1158 meta = {
1003 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1159 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1004 };
1160 };
1005 };
1161 };
1006 pexpect = super.buildPythonPackage {
1162 pexpect = super.buildPythonPackage {
1007 name = "pexpect-4.2.1";
1163 name = "pexpect-4.2.1";
1008 buildInputs = with self; [];
1164 buildInputs = with self; [];
1009 doCheck = false;
1165 doCheck = false;
1010 propagatedBuildInputs = with self; [ptyprocess];
1166 propagatedBuildInputs = with self; [ptyprocess];
1011 src = fetchurl {
1167 src = fetchurl {
1012 url = "https://pypi.python.org/packages/e8/13/d0b0599099d6cd23663043a2a0bb7c61e58c6ba359b2656e6fb000ef5b98/pexpect-4.2.1.tar.gz";
1168 url = "https://pypi.python.org/packages/e8/13/d0b0599099d6cd23663043a2a0bb7c61e58c6ba359b2656e6fb000ef5b98/pexpect-4.2.1.tar.gz";
1013 md5 = "3694410001a99dff83f0b500a1ca1c95";
1169 md5 = "3694410001a99dff83f0b500a1ca1c95";
1014 };
1170 };
1015 meta = {
1171 meta = {
1016 license = [ pkgs.lib.licenses.isc { fullName = "ISC License (ISCL)"; } ];
1172 license = [ pkgs.lib.licenses.isc { fullName = "ISC License (ISCL)"; } ];
1017 };
1173 };
1018 };
1174 };
1019 pickleshare = super.buildPythonPackage {
1175 pickleshare = super.buildPythonPackage {
1020 name = "pickleshare-0.7.4";
1176 name = "pickleshare-0.7.4";
1021 buildInputs = with self; [];
1177 buildInputs = with self; [];
1022 doCheck = false;
1178 doCheck = false;
1023 propagatedBuildInputs = with self; [pathlib2];
1179 propagatedBuildInputs = with self; [pathlib2];
1024 src = fetchurl {
1180 src = fetchurl {
1025 url = "https://pypi.python.org/packages/69/fe/dd137d84daa0fd13a709e448138e310d9ea93070620c9db5454e234af525/pickleshare-0.7.4.tar.gz";
1181 url = "https://pypi.python.org/packages/69/fe/dd137d84daa0fd13a709e448138e310d9ea93070620c9db5454e234af525/pickleshare-0.7.4.tar.gz";
1026 md5 = "6a9e5dd8dfc023031f6b7b3f824cab12";
1182 md5 = "6a9e5dd8dfc023031f6b7b3f824cab12";
1027 };
1183 };
1028 meta = {
1184 meta = {
1029 license = [ pkgs.lib.licenses.mit ];
1185 license = [ pkgs.lib.licenses.mit ];
1030 };
1186 };
1031 };
1187 };
1032 prompt-toolkit = super.buildPythonPackage {
1188 prompt-toolkit = super.buildPythonPackage {
1033 name = "prompt-toolkit-1.0.9";
1189 name = "prompt-toolkit-1.0.13";
1034 buildInputs = with self; [];
1190 buildInputs = with self; [];
1035 doCheck = false;
1191 doCheck = false;
1036 propagatedBuildInputs = with self; [six wcwidth];
1192 propagatedBuildInputs = with self; [six wcwidth];
1037 src = fetchurl {
1193 src = fetchurl {
1038 url = "https://pypi.python.org/packages/83/14/5ac258da6c530eca02852ee25c7a9ff3ca78287bb4c198d0d0055845d856/prompt_toolkit-1.0.9.tar.gz";
1194 url = "https://pypi.python.org/packages/23/be/4876b52d5cc159cbd4b0ff6e7aa419a26470849a43a8f647857a4a24467b/prompt_toolkit-1.0.13.tar.gz";
1039 md5 = "a39f91a54308fb7446b1a421c11f227c";
1195 md5 = "427b496d2c147bd3819bc3a7f6e0d493";
1040 };
1196 };
1041 meta = {
1197 meta = {
1042 license = [ pkgs.lib.licenses.bsdOriginal ];
1198 license = [ pkgs.lib.licenses.bsdOriginal ];
1043 };
1199 };
1044 };
1200 };
1045 psutil = super.buildPythonPackage {
1201 psutil = super.buildPythonPackage {
1046 name = "psutil-4.3.1";
1202 name = "psutil-4.3.1";
1047 buildInputs = with self; [];
1203 buildInputs = with self; [];
1048 doCheck = false;
1204 doCheck = false;
1049 propagatedBuildInputs = with self; [];
1205 propagatedBuildInputs = with self; [];
1050 src = fetchurl {
1206 src = fetchurl {
1051 url = "https://pypi.python.org/packages/78/cc/f267a1371f229bf16db6a4e604428c3b032b823b83155bd33cef45e49a53/psutil-4.3.1.tar.gz";
1207 url = "https://pypi.python.org/packages/78/cc/f267a1371f229bf16db6a4e604428c3b032b823b83155bd33cef45e49a53/psutil-4.3.1.tar.gz";
1052 md5 = "199a366dba829c88bddaf5b41d19ddc0";
1208 md5 = "199a366dba829c88bddaf5b41d19ddc0";
1053 };
1209 };
1054 meta = {
1210 meta = {
1055 license = [ pkgs.lib.licenses.bsdOriginal ];
1211 license = [ pkgs.lib.licenses.bsdOriginal ];
1056 };
1212 };
1057 };
1213 };
1058 psycopg2 = super.buildPythonPackage {
1214 psycopg2 = super.buildPythonPackage {
1059 name = "psycopg2-2.6.1";
1215 name = "psycopg2-2.6.1";
1060 buildInputs = with self; [];
1216 buildInputs = with self; [];
1061 doCheck = false;
1217 doCheck = false;
1062 propagatedBuildInputs = with self; [];
1218 propagatedBuildInputs = with self; [];
1063 src = fetchurl {
1219 src = fetchurl {
1064 url = "https://pypi.python.org/packages/86/fd/cc8315be63a41fe000cce20482a917e874cdc1151e62cb0141f5e55f711e/psycopg2-2.6.1.tar.gz";
1220 url = "https://pypi.python.org/packages/86/fd/cc8315be63a41fe000cce20482a917e874cdc1151e62cb0141f5e55f711e/psycopg2-2.6.1.tar.gz";
1065 md5 = "842b44f8c95517ed5b792081a2370da1";
1221 md5 = "842b44f8c95517ed5b792081a2370da1";
1066 };
1222 };
1067 meta = {
1223 meta = {
1068 license = [ pkgs.lib.licenses.zpt21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ];
1224 license = [ pkgs.lib.licenses.zpt21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ];
1069 };
1225 };
1070 };
1226 };
1071 ptyprocess = super.buildPythonPackage {
1227 ptyprocess = super.buildPythonPackage {
1072 name = "ptyprocess-0.5.1";
1228 name = "ptyprocess-0.5.1";
1073 buildInputs = with self; [];
1229 buildInputs = with self; [];
1074 doCheck = false;
1230 doCheck = false;
1075 propagatedBuildInputs = with self; [];
1231 propagatedBuildInputs = with self; [];
1076 src = fetchurl {
1232 src = fetchurl {
1077 url = "https://pypi.python.org/packages/db/d7/b465161910f3d1cef593c5e002bff67e0384898f597f1a7fdc8db4c02bf6/ptyprocess-0.5.1.tar.gz";
1233 url = "https://pypi.python.org/packages/db/d7/b465161910f3d1cef593c5e002bff67e0384898f597f1a7fdc8db4c02bf6/ptyprocess-0.5.1.tar.gz";
1078 md5 = "94e537122914cc9ec9c1eadcd36e73a1";
1234 md5 = "94e537122914cc9ec9c1eadcd36e73a1";
1079 };
1235 };
1080 meta = {
1236 meta = {
1081 license = [ ];
1237 license = [ ];
1082 };
1238 };
1083 };
1239 };
1084 py = super.buildPythonPackage {
1240 py = super.buildPythonPackage {
1085 name = "py-1.4.31";
1241 name = "py-1.4.31";
1086 buildInputs = with self; [];
1242 buildInputs = with self; [];
1087 doCheck = false;
1243 doCheck = false;
1088 propagatedBuildInputs = with self; [];
1244 propagatedBuildInputs = with self; [];
1089 src = fetchurl {
1245 src = fetchurl {
1090 url = "https://pypi.python.org/packages/f4/9a/8dfda23f36600dd701c6722316ba8a3ab4b990261f83e7d3ffc6dfedf7ef/py-1.4.31.tar.gz";
1246 url = "https://pypi.python.org/packages/f4/9a/8dfda23f36600dd701c6722316ba8a3ab4b990261f83e7d3ffc6dfedf7ef/py-1.4.31.tar.gz";
1091 md5 = "5d2c63c56dc3f2115ec35c066ecd582b";
1247 md5 = "5d2c63c56dc3f2115ec35c066ecd582b";
1092 };
1248 };
1093 meta = {
1249 meta = {
1094 license = [ pkgs.lib.licenses.mit ];
1250 license = [ pkgs.lib.licenses.mit ];
1095 };
1251 };
1096 };
1252 };
1097 py-bcrypt = super.buildPythonPackage {
1253 py-bcrypt = super.buildPythonPackage {
1098 name = "py-bcrypt-0.4";
1254 name = "py-bcrypt-0.4";
1099 buildInputs = with self; [];
1255 buildInputs = with self; [];
1100 doCheck = false;
1256 doCheck = false;
1101 propagatedBuildInputs = with self; [];
1257 propagatedBuildInputs = with self; [];
1102 src = fetchurl {
1258 src = fetchurl {
1103 url = "https://pypi.python.org/packages/68/b1/1c3068c5c4d2e35c48b38dcc865301ebfdf45f54507086ac65ced1fd3b3d/py-bcrypt-0.4.tar.gz";
1259 url = "https://pypi.python.org/packages/68/b1/1c3068c5c4d2e35c48b38dcc865301ebfdf45f54507086ac65ced1fd3b3d/py-bcrypt-0.4.tar.gz";
1104 md5 = "dd8b367d6b716a2ea2e72392525f4e36";
1260 md5 = "dd8b367d6b716a2ea2e72392525f4e36";
1105 };
1261 };
1106 meta = {
1262 meta = {
1107 license = [ pkgs.lib.licenses.bsdOriginal ];
1263 license = [ pkgs.lib.licenses.bsdOriginal ];
1108 };
1264 };
1109 };
1265 };
1110 py-gfm = super.buildPythonPackage {
1266 py-gfm = super.buildPythonPackage {
1111 name = "py-gfm-0.1.3";
1267 name = "py-gfm-0.1.3";
1112 buildInputs = with self; [];
1268 buildInputs = with self; [];
1113 doCheck = false;
1269 doCheck = false;
1114 propagatedBuildInputs = with self; [setuptools Markdown];
1270 propagatedBuildInputs = with self; [setuptools Markdown];
1115 src = fetchurl {
1271 src = fetchurl {
1116 url = "https://code.rhodecode.com/upstream/py-gfm/archive/0d66a19bc16e3d49de273c0f797d4e4781e8c0f2.tar.gz?md5=0d0d5385bfb629eea636a80b9c2bfd16";
1272 url = "https://code.rhodecode.com/upstream/py-gfm/archive/0d66a19bc16e3d49de273c0f797d4e4781e8c0f2.tar.gz?md5=0d0d5385bfb629eea636a80b9c2bfd16";
1117 md5 = "0d0d5385bfb629eea636a80b9c2bfd16";
1273 md5 = "0d0d5385bfb629eea636a80b9c2bfd16";
1118 };
1274 };
1119 meta = {
1275 meta = {
1120 license = [ pkgs.lib.licenses.bsdOriginal ];
1276 license = [ pkgs.lib.licenses.bsdOriginal ];
1121 };
1277 };
1122 };
1278 };
1123 pycrypto = super.buildPythonPackage {
1279 pycrypto = super.buildPythonPackage {
1124 name = "pycrypto-2.6.1";
1280 name = "pycrypto-2.6.1";
1125 buildInputs = with self; [];
1281 buildInputs = with self; [];
1126 doCheck = false;
1282 doCheck = false;
1127 propagatedBuildInputs = with self; [];
1283 propagatedBuildInputs = with self; [];
1128 src = fetchurl {
1284 src = fetchurl {
1129 url = "https://pypi.python.org/packages/60/db/645aa9af249f059cc3a368b118de33889219e0362141e75d4eaf6f80f163/pycrypto-2.6.1.tar.gz";
1285 url = "https://pypi.python.org/packages/60/db/645aa9af249f059cc3a368b118de33889219e0362141e75d4eaf6f80f163/pycrypto-2.6.1.tar.gz";
1130 md5 = "55a61a054aa66812daf5161a0d5d7eda";
1286 md5 = "55a61a054aa66812daf5161a0d5d7eda";
1131 };
1287 };
1132 meta = {
1288 meta = {
1133 license = [ pkgs.lib.licenses.publicDomain ];
1289 license = [ pkgs.lib.licenses.publicDomain ];
1134 };
1290 };
1135 };
1291 };
1136 pycurl = super.buildPythonPackage {
1292 pycurl = super.buildPythonPackage {
1137 name = "pycurl-7.19.5";
1293 name = "pycurl-7.19.5";
1138 buildInputs = with self; [];
1294 buildInputs = with self; [];
1139 doCheck = false;
1295 doCheck = false;
1140 propagatedBuildInputs = with self; [];
1296 propagatedBuildInputs = with self; [];
1141 src = fetchurl {
1297 src = fetchurl {
1142 url = "https://pypi.python.org/packages/6c/48/13bad289ef6f4869b1d8fc11ae54de8cfb3cc4a2eb9f7419c506f763be46/pycurl-7.19.5.tar.gz";
1298 url = "https://pypi.python.org/packages/6c/48/13bad289ef6f4869b1d8fc11ae54de8cfb3cc4a2eb9f7419c506f763be46/pycurl-7.19.5.tar.gz";
1143 md5 = "47b4eac84118e2606658122104e62072";
1299 md5 = "47b4eac84118e2606658122104e62072";
1144 };
1300 };
1145 meta = {
1301 meta = {
1146 license = [ pkgs.lib.licenses.mit { fullName = "LGPL/MIT"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
1302 license = [ pkgs.lib.licenses.mit { fullName = "LGPL/MIT"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
1147 };
1303 };
1148 };
1304 };
1149 pyflakes = super.buildPythonPackage {
1305 pyflakes = super.buildPythonPackage {
1150 name = "pyflakes-0.8.1";
1306 name = "pyflakes-0.8.1";
1151 buildInputs = with self; [];
1307 buildInputs = with self; [];
1152 doCheck = false;
1308 doCheck = false;
1153 propagatedBuildInputs = with self; [];
1309 propagatedBuildInputs = with self; [];
1154 src = fetchurl {
1310 src = fetchurl {
1155 url = "https://pypi.python.org/packages/75/22/a90ec0252f4f87f3ffb6336504de71fe16a49d69c4538dae2f12b9360a38/pyflakes-0.8.1.tar.gz";
1311 url = "https://pypi.python.org/packages/75/22/a90ec0252f4f87f3ffb6336504de71fe16a49d69c4538dae2f12b9360a38/pyflakes-0.8.1.tar.gz";
1156 md5 = "905fe91ad14b912807e8fdc2ac2e2c23";
1312 md5 = "905fe91ad14b912807e8fdc2ac2e2c23";
1157 };
1313 };
1158 meta = {
1314 meta = {
1159 license = [ pkgs.lib.licenses.mit ];
1315 license = [ pkgs.lib.licenses.mit ];
1160 };
1316 };
1161 };
1317 };
1162 pygments-markdown-lexer = super.buildPythonPackage {
1318 pygments-markdown-lexer = super.buildPythonPackage {
1163 name = "pygments-markdown-lexer-0.1.0.dev39";
1319 name = "pygments-markdown-lexer-0.1.0.dev39";
1164 buildInputs = with self; [];
1320 buildInputs = with self; [];
1165 doCheck = false;
1321 doCheck = false;
1166 propagatedBuildInputs = with self; [Pygments];
1322 propagatedBuildInputs = with self; [Pygments];
1167 src = fetchurl {
1323 src = fetchurl {
1168 url = "https://pypi.python.org/packages/c3/12/674cdee66635d638cedb2c5d9c85ce507b7b2f91bdba29e482f1b1160ff6/pygments-markdown-lexer-0.1.0.dev39.zip";
1324 url = "https://pypi.python.org/packages/c3/12/674cdee66635d638cedb2c5d9c85ce507b7b2f91bdba29e482f1b1160ff6/pygments-markdown-lexer-0.1.0.dev39.zip";
1169 md5 = "6360fe0f6d1f896e35b7a0142ce6459c";
1325 md5 = "6360fe0f6d1f896e35b7a0142ce6459c";
1170 };
1326 };
1171 meta = {
1327 meta = {
1172 license = [ pkgs.lib.licenses.asl20 ];
1328 license = [ pkgs.lib.licenses.asl20 ];
1173 };
1329 };
1174 };
1330 };
1175 pyparsing = super.buildPythonPackage {
1331 pyparsing = super.buildPythonPackage {
1176 name = "pyparsing-1.5.7";
1332 name = "pyparsing-1.5.7";
1177 buildInputs = with self; [];
1333 buildInputs = with self; [];
1178 doCheck = false;
1334 doCheck = false;
1179 propagatedBuildInputs = with self; [];
1335 propagatedBuildInputs = with self; [];
1180 src = fetchurl {
1336 src = fetchurl {
1181 url = "https://pypi.python.org/packages/2e/26/e8fb5b4256a5f5036be7ce115ef8db8d06bc537becfbdc46c6af008314ee/pyparsing-1.5.7.zip";
1337 url = "https://pypi.python.org/packages/2e/26/e8fb5b4256a5f5036be7ce115ef8db8d06bc537becfbdc46c6af008314ee/pyparsing-1.5.7.zip";
1182 md5 = "b86854857a368d6ccb4d5b6e76d0637f";
1338 md5 = "b86854857a368d6ccb4d5b6e76d0637f";
1183 };
1339 };
1184 meta = {
1340 meta = {
1185 license = [ pkgs.lib.licenses.mit ];
1341 license = [ pkgs.lib.licenses.mit ];
1186 };
1342 };
1187 };
1343 };
1188 pyramid = super.buildPythonPackage {
1344 pyramid = super.buildPythonPackage {
1189 name = "pyramid-1.7.4";
1345 name = "pyramid-1.7.4";
1190 buildInputs = with self; [];
1346 buildInputs = with self; [];
1191 doCheck = false;
1347 doCheck = false;
1192 propagatedBuildInputs = with self; [setuptools WebOb repoze.lru zope.interface zope.deprecation venusian translationstring PasteDeploy];
1348 propagatedBuildInputs = with self; [setuptools WebOb repoze.lru zope.interface zope.deprecation venusian translationstring PasteDeploy];
1193 src = fetchurl {
1349 src = fetchurl {
1194 url = "https://pypi.python.org/packages/33/91/55f5c661f8923902cd1f68d75f2b937c45e7682857356cf18f0be5493899/pyramid-1.7.4.tar.gz";
1350 url = "https://pypi.python.org/packages/33/91/55f5c661f8923902cd1f68d75f2b937c45e7682857356cf18f0be5493899/pyramid-1.7.4.tar.gz";
1195 md5 = "6ef1dfdcff9136d04490410757c4c446";
1351 md5 = "6ef1dfdcff9136d04490410757c4c446";
1196 };
1352 };
1197 meta = {
1353 meta = {
1198 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1354 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1199 };
1355 };
1200 };
1356 };
1201 pyramid-beaker = super.buildPythonPackage {
1357 pyramid-beaker = super.buildPythonPackage {
1202 name = "pyramid-beaker-0.8";
1358 name = "pyramid-beaker-0.8";
1203 buildInputs = with self; [];
1359 buildInputs = with self; [];
1204 doCheck = false;
1360 doCheck = false;
1205 propagatedBuildInputs = with self; [pyramid Beaker];
1361 propagatedBuildInputs = with self; [pyramid Beaker];
1206 src = fetchurl {
1362 src = fetchurl {
1207 url = "https://pypi.python.org/packages/d9/6e/b85426e00fd3d57f4545f74e1c3828552d8700f13ededeef9233f7bca8be/pyramid_beaker-0.8.tar.gz";
1363 url = "https://pypi.python.org/packages/d9/6e/b85426e00fd3d57f4545f74e1c3828552d8700f13ededeef9233f7bca8be/pyramid_beaker-0.8.tar.gz";
1208 md5 = "22f14be31b06549f80890e2c63a93834";
1364 md5 = "22f14be31b06549f80890e2c63a93834";
1209 };
1365 };
1210 meta = {
1366 meta = {
1211 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1367 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1212 };
1368 };
1213 };
1369 };
1214 pyramid-debugtoolbar = super.buildPythonPackage {
1370 pyramid-debugtoolbar = super.buildPythonPackage {
1215 name = "pyramid-debugtoolbar-3.0.5";
1371 name = "pyramid-debugtoolbar-3.0.5";
1216 buildInputs = with self; [];
1372 buildInputs = with self; [];
1217 doCheck = false;
1373 doCheck = false;
1218 propagatedBuildInputs = with self; [pyramid pyramid-mako repoze.lru Pygments];
1374 propagatedBuildInputs = with self; [pyramid pyramid-mako repoze.lru Pygments];
1219 src = fetchurl {
1375 src = fetchurl {
1220 url = "https://pypi.python.org/packages/64/0e/df00bfb55605900e7a2f7e4a18dd83575a6651688e297d5a0aa4c208fd7d/pyramid_debugtoolbar-3.0.5.tar.gz";
1376 url = "https://pypi.python.org/packages/64/0e/df00bfb55605900e7a2f7e4a18dd83575a6651688e297d5a0aa4c208fd7d/pyramid_debugtoolbar-3.0.5.tar.gz";
1221 md5 = "aebab8c3bfdc6f89e4d3adc1d126538e";
1377 md5 = "aebab8c3bfdc6f89e4d3adc1d126538e";
1222 };
1378 };
1223 meta = {
1379 meta = {
1224 license = [ { fullName = "Repoze Public License"; } pkgs.lib.licenses.bsdOriginal ];
1380 license = [ { fullName = "Repoze Public License"; } pkgs.lib.licenses.bsdOriginal ];
1225 };
1381 };
1226 };
1382 };
1227 pyramid-jinja2 = super.buildPythonPackage {
1383 pyramid-jinja2 = super.buildPythonPackage {
1228 name = "pyramid-jinja2-2.5";
1384 name = "pyramid-jinja2-2.5";
1229 buildInputs = with self; [];
1385 buildInputs = with self; [];
1230 doCheck = false;
1386 doCheck = false;
1231 propagatedBuildInputs = with self; [pyramid zope.deprecation Jinja2 MarkupSafe];
1387 propagatedBuildInputs = with self; [pyramid zope.deprecation Jinja2 MarkupSafe];
1232 src = fetchurl {
1388 src = fetchurl {
1233 url = "https://pypi.python.org/packages/a1/80/595e26ffab7deba7208676b6936b7e5a721875710f982e59899013cae1ed/pyramid_jinja2-2.5.tar.gz";
1389 url = "https://pypi.python.org/packages/a1/80/595e26ffab7deba7208676b6936b7e5a721875710f982e59899013cae1ed/pyramid_jinja2-2.5.tar.gz";
1234 md5 = "07cb6547204ac5e6f0b22a954ccee928";
1390 md5 = "07cb6547204ac5e6f0b22a954ccee928";
1235 };
1391 };
1236 meta = {
1392 meta = {
1237 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1393 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1238 };
1394 };
1239 };
1395 };
1240 pyramid-mako = super.buildPythonPackage {
1396 pyramid-mako = super.buildPythonPackage {
1241 name = "pyramid-mako-1.0.2";
1397 name = "pyramid-mako-1.0.2";
1242 buildInputs = with self; [];
1398 buildInputs = with self; [];
1243 doCheck = false;
1399 doCheck = false;
1244 propagatedBuildInputs = with self; [pyramid Mako];
1400 propagatedBuildInputs = with self; [pyramid Mako];
1245 src = fetchurl {
1401 src = fetchurl {
1246 url = "https://pypi.python.org/packages/f1/92/7e69bcf09676d286a71cb3bbb887b16595b96f9ba7adbdc239ffdd4b1eb9/pyramid_mako-1.0.2.tar.gz";
1402 url = "https://pypi.python.org/packages/f1/92/7e69bcf09676d286a71cb3bbb887b16595b96f9ba7adbdc239ffdd4b1eb9/pyramid_mako-1.0.2.tar.gz";
1247 md5 = "ee25343a97eb76bd90abdc2a774eb48a";
1403 md5 = "ee25343a97eb76bd90abdc2a774eb48a";
1248 };
1404 };
1249 meta = {
1405 meta = {
1250 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1406 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1251 };
1407 };
1252 };
1408 };
1253 pysqlite = super.buildPythonPackage {
1409 pysqlite = super.buildPythonPackage {
1254 name = "pysqlite-2.6.3";
1410 name = "pysqlite-2.6.3";
1255 buildInputs = with self; [];
1411 buildInputs = with self; [];
1256 doCheck = false;
1412 doCheck = false;
1257 propagatedBuildInputs = with self; [];
1413 propagatedBuildInputs = with self; [];
1258 src = fetchurl {
1414 src = fetchurl {
1259 url = "https://pypi.python.org/packages/5c/a6/1c429cd4c8069cf4bfbd0eb4d592b3f4042155a8202df83d7e9b93aa3dc2/pysqlite-2.6.3.tar.gz";
1415 url = "https://pypi.python.org/packages/5c/a6/1c429cd4c8069cf4bfbd0eb4d592b3f4042155a8202df83d7e9b93aa3dc2/pysqlite-2.6.3.tar.gz";
1260 md5 = "7ff1cedee74646b50117acff87aa1cfa";
1416 md5 = "7ff1cedee74646b50117acff87aa1cfa";
1261 };
1417 };
1262 meta = {
1418 meta = {
1263 license = [ { fullName = "zlib/libpng License"; } { fullName = "zlib/libpng license"; } ];
1419 license = [ { fullName = "zlib/libpng License"; } { fullName = "zlib/libpng license"; } ];
1264 };
1420 };
1265 };
1421 };
1266 pytest = super.buildPythonPackage {
1422 pytest = super.buildPythonPackage {
1267 name = "pytest-3.0.5";
1423 name = "pytest-3.0.5";
1268 buildInputs = with self; [];
1424 buildInputs = with self; [];
1269 doCheck = false;
1425 doCheck = false;
1270 propagatedBuildInputs = with self; [py];
1426 propagatedBuildInputs = with self; [py];
1271 src = fetchurl {
1427 src = fetchurl {
1272 url = "https://pypi.python.org/packages/a8/87/b7ca49efe52d2b4169f2bfc49aa5e384173c4619ea8e635f123a0dac5b75/pytest-3.0.5.tar.gz";
1428 url = "https://pypi.python.org/packages/a8/87/b7ca49efe52d2b4169f2bfc49aa5e384173c4619ea8e635f123a0dac5b75/pytest-3.0.5.tar.gz";
1273 md5 = "cefd527b59332688bf5db4a10aa8a7cb";
1429 md5 = "cefd527b59332688bf5db4a10aa8a7cb";
1274 };
1430 };
1275 meta = {
1431 meta = {
1276 license = [ pkgs.lib.licenses.mit ];
1432 license = [ pkgs.lib.licenses.mit ];
1277 };
1433 };
1278 };
1434 };
1279 pytest-catchlog = super.buildPythonPackage {
1435 pytest-catchlog = super.buildPythonPackage {
1280 name = "pytest-catchlog-1.2.2";
1436 name = "pytest-catchlog-1.2.2";
1281 buildInputs = with self; [];
1437 buildInputs = with self; [];
1282 doCheck = false;
1438 doCheck = false;
1283 propagatedBuildInputs = with self; [py pytest];
1439 propagatedBuildInputs = with self; [py pytest];
1284 src = fetchurl {
1440 src = fetchurl {
1285 url = "https://pypi.python.org/packages/f2/2b/2faccdb1a978fab9dd0bf31cca9f6847fbe9184a0bdcc3011ac41dd44191/pytest-catchlog-1.2.2.zip";
1441 url = "https://pypi.python.org/packages/f2/2b/2faccdb1a978fab9dd0bf31cca9f6847fbe9184a0bdcc3011ac41dd44191/pytest-catchlog-1.2.2.zip";
1286 md5 = "09d890c54c7456c818102b7ff8c182c8";
1442 md5 = "09d890c54c7456c818102b7ff8c182c8";
1287 };
1443 };
1288 meta = {
1444 meta = {
1289 license = [ pkgs.lib.licenses.mit ];
1445 license = [ pkgs.lib.licenses.mit ];
1290 };
1446 };
1291 };
1447 };
1292 pytest-cov = super.buildPythonPackage {
1448 pytest-cov = super.buildPythonPackage {
1293 name = "pytest-cov-2.4.0";
1449 name = "pytest-cov-2.4.0";
1294 buildInputs = with self; [];
1450 buildInputs = with self; [];
1295 doCheck = false;
1451 doCheck = false;
1296 propagatedBuildInputs = with self; [pytest coverage];
1452 propagatedBuildInputs = with self; [pytest coverage];
1297 src = fetchurl {
1453 src = fetchurl {
1298 url = "https://pypi.python.org/packages/00/c0/2bfd1fcdb9d407b8ac8185b1cb5ff458105c6b207a9a7f0e13032de9828f/pytest-cov-2.4.0.tar.gz";
1454 url = "https://pypi.python.org/packages/00/c0/2bfd1fcdb9d407b8ac8185b1cb5ff458105c6b207a9a7f0e13032de9828f/pytest-cov-2.4.0.tar.gz";
1299 md5 = "2fda09677d232acc99ec1b3c5831e33f";
1455 md5 = "2fda09677d232acc99ec1b3c5831e33f";
1300 };
1456 };
1301 meta = {
1457 meta = {
1302 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.mit ];
1458 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.mit ];
1303 };
1459 };
1304 };
1460 };
1305 pytest-profiling = super.buildPythonPackage {
1461 pytest-profiling = super.buildPythonPackage {
1306 name = "pytest-profiling-1.2.2";
1462 name = "pytest-profiling-1.2.2";
1307 buildInputs = with self; [];
1463 buildInputs = with self; [];
1308 doCheck = false;
1464 doCheck = false;
1309 propagatedBuildInputs = with self; [six pytest gprof2dot];
1465 propagatedBuildInputs = with self; [six pytest gprof2dot];
1310 src = fetchurl {
1466 src = fetchurl {
1311 url = "https://pypi.python.org/packages/73/e8/804681323bac0bc45c520ec34185ba8469008942266d0074699b204835c1/pytest-profiling-1.2.2.tar.gz";
1467 url = "https://pypi.python.org/packages/73/e8/804681323bac0bc45c520ec34185ba8469008942266d0074699b204835c1/pytest-profiling-1.2.2.tar.gz";
1312 md5 = "0a16d7dda2d23b91e9730fa4558cf728";
1468 md5 = "0a16d7dda2d23b91e9730fa4558cf728";
1313 };
1469 };
1314 meta = {
1470 meta = {
1315 license = [ pkgs.lib.licenses.mit ];
1471 license = [ pkgs.lib.licenses.mit ];
1316 };
1472 };
1317 };
1473 };
1318 pytest-runner = super.buildPythonPackage {
1474 pytest-runner = super.buildPythonPackage {
1319 name = "pytest-runner-2.9";
1475 name = "pytest-runner-2.9";
1320 buildInputs = with self; [];
1476 buildInputs = with self; [];
1321 doCheck = false;
1477 doCheck = false;
1322 propagatedBuildInputs = with self; [];
1478 propagatedBuildInputs = with self; [];
1323 src = fetchurl {
1479 src = fetchurl {
1324 url = "https://pypi.python.org/packages/11/d4/c335ddf94463e451109e3494e909765c3e5205787b772e3b25ee8601b86a/pytest-runner-2.9.tar.gz";
1480 url = "https://pypi.python.org/packages/11/d4/c335ddf94463e451109e3494e909765c3e5205787b772e3b25ee8601b86a/pytest-runner-2.9.tar.gz";
1325 md5 = "2212a2e34404b0960b2fdc2c469247b2";
1481 md5 = "2212a2e34404b0960b2fdc2c469247b2";
1326 };
1482 };
1327 meta = {
1483 meta = {
1328 license = [ pkgs.lib.licenses.mit ];
1484 license = [ pkgs.lib.licenses.mit ];
1329 };
1485 };
1330 };
1486 };
1331 pytest-sugar = super.buildPythonPackage {
1487 pytest-sugar = super.buildPythonPackage {
1332 name = "pytest-sugar-0.7.1";
1488 name = "pytest-sugar-0.7.1";
1333 buildInputs = with self; [];
1489 buildInputs = with self; [];
1334 doCheck = false;
1490 doCheck = false;
1335 propagatedBuildInputs = with self; [pytest termcolor];
1491 propagatedBuildInputs = with self; [pytest termcolor];
1336 src = fetchurl {
1492 src = fetchurl {
1337 url = "https://pypi.python.org/packages/03/97/05d988b4fa870e7373e8ee4582408543b9ca2bd35c3c67b569369c6f9c49/pytest-sugar-0.7.1.tar.gz";
1493 url = "https://pypi.python.org/packages/03/97/05d988b4fa870e7373e8ee4582408543b9ca2bd35c3c67b569369c6f9c49/pytest-sugar-0.7.1.tar.gz";
1338 md5 = "7400f7c11f3d572b2c2a3b60352d35fe";
1494 md5 = "7400f7c11f3d572b2c2a3b60352d35fe";
1339 };
1495 };
1340 meta = {
1496 meta = {
1341 license = [ pkgs.lib.licenses.bsdOriginal ];
1497 license = [ pkgs.lib.licenses.bsdOriginal ];
1342 };
1498 };
1343 };
1499 };
1344 pytest-timeout = super.buildPythonPackage {
1500 pytest-timeout = super.buildPythonPackage {
1345 name = "pytest-timeout-1.2.0";
1501 name = "pytest-timeout-1.2.0";
1346 buildInputs = with self; [];
1502 buildInputs = with self; [];
1347 doCheck = false;
1503 doCheck = false;
1348 propagatedBuildInputs = with self; [pytest];
1504 propagatedBuildInputs = with self; [pytest];
1349 src = fetchurl {
1505 src = fetchurl {
1350 url = "https://pypi.python.org/packages/cc/b7/b2a61365ea6b6d2e8881360ae7ed8dad0327ad2df89f2f0be4a02304deb2/pytest-timeout-1.2.0.tar.gz";
1506 url = "https://pypi.python.org/packages/cc/b7/b2a61365ea6b6d2e8881360ae7ed8dad0327ad2df89f2f0be4a02304deb2/pytest-timeout-1.2.0.tar.gz";
1351 md5 = "83607d91aa163562c7ee835da57d061d";
1507 md5 = "83607d91aa163562c7ee835da57d061d";
1352 };
1508 };
1353 meta = {
1509 meta = {
1354 license = [ pkgs.lib.licenses.mit { fullName = "DFSG approved"; } ];
1510 license = [ pkgs.lib.licenses.mit { fullName = "DFSG approved"; } ];
1355 };
1511 };
1356 };
1512 };
1357 python-dateutil = super.buildPythonPackage {
1513 python-dateutil = super.buildPythonPackage {
1358 name = "python-dateutil-1.5";
1514 name = "python-dateutil-2.1";
1359 buildInputs = with self; [];
1515 buildInputs = with self; [];
1360 doCheck = false;
1516 doCheck = false;
1361 propagatedBuildInputs = with self; [];
1517 propagatedBuildInputs = with self; [six];
1362 src = fetchurl {
1518 src = fetchurl {
1363 url = "https://pypi.python.org/packages/b4/7c/df59c89a753eb33c7c44e1dd42de0e9bc2ccdd5a4d576e0bfad97cc280cb/python-dateutil-1.5.tar.gz";
1519 url = "https://pypi.python.org/packages/65/52/9c18dac21f174ad31b65e22d24297864a954e6fe65876eba3f5773d2da43/python-dateutil-2.1.tar.gz";
1364 md5 = "0dcb1de5e5cad69490a3b6ab63f0cfa5";
1520 md5 = "1534bb15cf311f07afaa3aacba1c028b";
1365 };
1521 };
1366 meta = {
1522 meta = {
1367 license = [ pkgs.lib.licenses.psfl ];
1523 license = [ { fullName = "Simplified BSD"; } ];
1368 };
1524 };
1369 };
1525 };
1370 python-editor = super.buildPythonPackage {
1526 python-editor = super.buildPythonPackage {
1371 name = "python-editor-1.0.3";
1527 name = "python-editor-1.0.3";
1372 buildInputs = with self; [];
1528 buildInputs = with self; [];
1373 doCheck = false;
1529 doCheck = false;
1374 propagatedBuildInputs = with self; [];
1530 propagatedBuildInputs = with self; [];
1375 src = fetchurl {
1531 src = fetchurl {
1376 url = "https://pypi.python.org/packages/65/1e/adf6e000ea5dc909aa420352d6ba37f16434c8a3c2fa030445411a1ed545/python-editor-1.0.3.tar.gz";
1532 url = "https://pypi.python.org/packages/65/1e/adf6e000ea5dc909aa420352d6ba37f16434c8a3c2fa030445411a1ed545/python-editor-1.0.3.tar.gz";
1377 md5 = "0aca5f2ef176ce68e98a5b7e31372835";
1533 md5 = "0aca5f2ef176ce68e98a5b7e31372835";
1378 };
1534 };
1379 meta = {
1535 meta = {
1380 license = [ pkgs.lib.licenses.asl20 { fullName = "Apache"; } ];
1536 license = [ pkgs.lib.licenses.asl20 { fullName = "Apache"; } ];
1381 };
1537 };
1382 };
1538 };
1383 python-ldap = super.buildPythonPackage {
1539 python-ldap = super.buildPythonPackage {
1384 name = "python-ldap-2.4.19";
1540 name = "python-ldap-2.4.19";
1385 buildInputs = with self; [];
1541 buildInputs = with self; [];
1386 doCheck = false;
1542 doCheck = false;
1387 propagatedBuildInputs = with self; [setuptools];
1543 propagatedBuildInputs = with self; [setuptools];
1388 src = fetchurl {
1544 src = fetchurl {
1389 url = "https://pypi.python.org/packages/42/81/1b64838c82e64f14d4e246ff00b52e650a35c012551b891ada2b85d40737/python-ldap-2.4.19.tar.gz";
1545 url = "https://pypi.python.org/packages/42/81/1b64838c82e64f14d4e246ff00b52e650a35c012551b891ada2b85d40737/python-ldap-2.4.19.tar.gz";
1390 md5 = "b941bf31d09739492aa19ef679e94ae3";
1546 md5 = "b941bf31d09739492aa19ef679e94ae3";
1391 };
1547 };
1392 meta = {
1548 meta = {
1393 license = [ pkgs.lib.licenses.psfl ];
1549 license = [ pkgs.lib.licenses.psfl ];
1394 };
1550 };
1395 };
1551 };
1396 python-memcached = super.buildPythonPackage {
1552 python-memcached = super.buildPythonPackage {
1397 name = "python-memcached-1.57";
1553 name = "python-memcached-1.57";
1398 buildInputs = with self; [];
1554 buildInputs = with self; [];
1399 doCheck = false;
1555 doCheck = false;
1400 propagatedBuildInputs = with self; [six];
1556 propagatedBuildInputs = with self; [six];
1401 src = fetchurl {
1557 src = fetchurl {
1402 url = "https://pypi.python.org/packages/52/9d/eebc0dcbc5c7c66840ad207dfc1baa376dadb74912484bff73819cce01e6/python-memcached-1.57.tar.gz";
1558 url = "https://pypi.python.org/packages/52/9d/eebc0dcbc5c7c66840ad207dfc1baa376dadb74912484bff73819cce01e6/python-memcached-1.57.tar.gz";
1403 md5 = "de21f64b42b2d961f3d4ad7beb5468a1";
1559 md5 = "de21f64b42b2d961f3d4ad7beb5468a1";
1404 };
1560 };
1405 meta = {
1561 meta = {
1406 license = [ pkgs.lib.licenses.psfl ];
1562 license = [ pkgs.lib.licenses.psfl ];
1407 };
1563 };
1408 };
1564 };
1409 python-pam = super.buildPythonPackage {
1565 python-pam = super.buildPythonPackage {
1410 name = "python-pam-1.8.2";
1566 name = "python-pam-1.8.2";
1411 buildInputs = with self; [];
1567 buildInputs = with self; [];
1412 doCheck = false;
1568 doCheck = false;
1413 propagatedBuildInputs = with self; [];
1569 propagatedBuildInputs = with self; [];
1414 src = fetchurl {
1570 src = fetchurl {
1415 url = "https://pypi.python.org/packages/de/8c/f8f5d38b4f26893af267ea0b39023d4951705ab0413a39e0cf7cf4900505/python-pam-1.8.2.tar.gz";
1571 url = "https://pypi.python.org/packages/de/8c/f8f5d38b4f26893af267ea0b39023d4951705ab0413a39e0cf7cf4900505/python-pam-1.8.2.tar.gz";
1416 md5 = "db71b6b999246fb05d78ecfbe166629d";
1572 md5 = "db71b6b999246fb05d78ecfbe166629d";
1417 };
1573 };
1418 meta = {
1574 meta = {
1419 license = [ { fullName = "License :: OSI Approved :: MIT License"; } pkgs.lib.licenses.mit ];
1575 license = [ { fullName = "License :: OSI Approved :: MIT License"; } pkgs.lib.licenses.mit ];
1420 };
1576 };
1421 };
1577 };
1422 pytz = super.buildPythonPackage {
1578 pytz = super.buildPythonPackage {
1423 name = "pytz-2015.4";
1579 name = "pytz-2015.4";
1424 buildInputs = with self; [];
1580 buildInputs = with self; [];
1425 doCheck = false;
1581 doCheck = false;
1426 propagatedBuildInputs = with self; [];
1582 propagatedBuildInputs = with self; [];
1427 src = fetchurl {
1583 src = fetchurl {
1428 url = "https://pypi.python.org/packages/7e/1a/f43b5c92df7b156822030fed151327ea096bcf417e45acc23bd1df43472f/pytz-2015.4.zip";
1584 url = "https://pypi.python.org/packages/7e/1a/f43b5c92df7b156822030fed151327ea096bcf417e45acc23bd1df43472f/pytz-2015.4.zip";
1429 md5 = "233f2a2b370d03f9b5911700cc9ebf3c";
1585 md5 = "233f2a2b370d03f9b5911700cc9ebf3c";
1430 };
1586 };
1431 meta = {
1587 meta = {
1432 license = [ pkgs.lib.licenses.mit ];
1588 license = [ pkgs.lib.licenses.mit ];
1433 };
1589 };
1434 };
1590 };
1435 pyzmq = super.buildPythonPackage {
1591 pyzmq = super.buildPythonPackage {
1436 name = "pyzmq-14.6.0";
1592 name = "pyzmq-14.6.0";
1437 buildInputs = with self; [];
1593 buildInputs = with self; [];
1438 doCheck = false;
1594 doCheck = false;
1439 propagatedBuildInputs = with self; [];
1595 propagatedBuildInputs = with self; [];
1440 src = fetchurl {
1596 src = fetchurl {
1441 url = "https://pypi.python.org/packages/8a/3b/5463d5a9d712cd8bbdac335daece0d69f6a6792da4e3dd89956c0db4e4e6/pyzmq-14.6.0.tar.gz";
1597 url = "https://pypi.python.org/packages/8a/3b/5463d5a9d712cd8bbdac335daece0d69f6a6792da4e3dd89956c0db4e4e6/pyzmq-14.6.0.tar.gz";
1442 md5 = "395b5de95a931afa5b14c9349a5b8024";
1598 md5 = "395b5de95a931afa5b14c9349a5b8024";
1443 };
1599 };
1444 meta = {
1600 meta = {
1445 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "LGPL+BSD"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
1601 license = [ pkgs.lib.licenses.bsdOriginal { fullName = "LGPL+BSD"; } { fullName = "GNU Library or Lesser General Public License (LGPL)"; } ];
1446 };
1602 };
1447 };
1603 };
1448 recaptcha-client = super.buildPythonPackage {
1604 recaptcha-client = super.buildPythonPackage {
1449 name = "recaptcha-client-1.0.6";
1605 name = "recaptcha-client-1.0.6";
1450 buildInputs = with self; [];
1606 buildInputs = with self; [];
1451 doCheck = false;
1607 doCheck = false;
1452 propagatedBuildInputs = with self; [];
1608 propagatedBuildInputs = with self; [];
1453 src = fetchurl {
1609 src = fetchurl {
1454 url = "https://pypi.python.org/packages/0a/ea/5f2fbbfd894bdac1c68ef8d92019066cfcf9fbff5fe3d728d2b5c25c8db4/recaptcha-client-1.0.6.tar.gz";
1610 url = "https://pypi.python.org/packages/0a/ea/5f2fbbfd894bdac1c68ef8d92019066cfcf9fbff5fe3d728d2b5c25c8db4/recaptcha-client-1.0.6.tar.gz";
1455 md5 = "74228180f7e1fb76c4d7089160b0d919";
1611 md5 = "74228180f7e1fb76c4d7089160b0d919";
1456 };
1612 };
1457 meta = {
1613 meta = {
1458 license = [ { fullName = "MIT/X11"; } ];
1614 license = [ { fullName = "MIT/X11"; } ];
1459 };
1615 };
1460 };
1616 };
1461 repoze.lru = super.buildPythonPackage {
1617 repoze.lru = super.buildPythonPackage {
1462 name = "repoze.lru-0.6";
1618 name = "repoze.lru-0.6";
1463 buildInputs = with self; [];
1619 buildInputs = with self; [];
1464 doCheck = false;
1620 doCheck = false;
1465 propagatedBuildInputs = with self; [];
1621 propagatedBuildInputs = with self; [];
1466 src = fetchurl {
1622 src = fetchurl {
1467 url = "https://pypi.python.org/packages/6e/1e/aa15cc90217e086dc8769872c8778b409812ff036bf021b15795638939e4/repoze.lru-0.6.tar.gz";
1623 url = "https://pypi.python.org/packages/6e/1e/aa15cc90217e086dc8769872c8778b409812ff036bf021b15795638939e4/repoze.lru-0.6.tar.gz";
1468 md5 = "2c3b64b17a8e18b405f55d46173e14dd";
1624 md5 = "2c3b64b17a8e18b405f55d46173e14dd";
1469 };
1625 };
1470 meta = {
1626 meta = {
1471 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1627 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1472 };
1628 };
1473 };
1629 };
1474 requests = super.buildPythonPackage {
1630 requests = super.buildPythonPackage {
1475 name = "requests-2.9.1";
1631 name = "requests-2.9.1";
1476 buildInputs = with self; [];
1632 buildInputs = with self; [];
1477 doCheck = false;
1633 doCheck = false;
1478 propagatedBuildInputs = with self; [];
1634 propagatedBuildInputs = with self; [];
1479 src = fetchurl {
1635 src = fetchurl {
1480 url = "https://pypi.python.org/packages/f9/6d/07c44fb1ebe04d069459a189e7dab9e4abfe9432adcd4477367c25332748/requests-2.9.1.tar.gz";
1636 url = "https://pypi.python.org/packages/f9/6d/07c44fb1ebe04d069459a189e7dab9e4abfe9432adcd4477367c25332748/requests-2.9.1.tar.gz";
1481 md5 = "0b7f480d19012ec52bab78292efd976d";
1637 md5 = "0b7f480d19012ec52bab78292efd976d";
1482 };
1638 };
1483 meta = {
1639 meta = {
1484 license = [ pkgs.lib.licenses.asl20 ];
1640 license = [ pkgs.lib.licenses.asl20 ];
1485 };
1641 };
1486 };
1642 };
1487 rhodecode-enterprise-ce = super.buildPythonPackage {
1643 rhodecode-enterprise-ce = super.buildPythonPackage {
1488 name = "rhodecode-enterprise-ce-4.7.0";
1644 name = "rhodecode-enterprise-ce-4.7.0";
1489 buildInputs = with self; [pytest py pytest-cov pytest-sugar pytest-runner pytest-catchlog pytest-profiling gprof2dot pytest-timeout mock WebTest cov-core coverage cssselect lxml configobj];
1645 buildInputs = with self; [pytest py pytest-cov pytest-sugar pytest-runner pytest-catchlog pytest-profiling gprof2dot pytest-timeout mock WebTest cov-core coverage cssselect lxml configobj];
1490 doCheck = true;
1646 doCheck = true;
1491 propagatedBuildInputs = with self; [Babel Beaker FormEncode Mako Markdown MarkupSafe MySQL-python Paste PasteDeploy PasteScript Pygments pygments-markdown-lexer Pylons Routes SQLAlchemy Tempita URLObject WebError WebHelpers WebHelpers2 WebOb WebTest Whoosh alembic amqplib anyjson appenlight-client authomatic backport-ipaddress celery channelstream colander decorator deform docutils gevent gunicorn infrae.cache ipython iso8601 kombu msgpack-python packaging psycopg2 py-gfm pycrypto pycurl pyparsing pyramid pyramid-debugtoolbar pyramid-mako pyramid-beaker pysqlite python-dateutil python-ldap python-memcached python-pam recaptcha-client repoze.lru requests simplejson subprocess32 waitress zope.cachedescriptors dogpile.cache dogpile.core psutil py-bcrypt];
1647 propagatedBuildInputs = with self; [Babel Beaker FormEncode Mako Markdown MarkupSafe MySQL-python Paste PasteDeploy PasteScript Pygments pygments-markdown-lexer Pylons Routes SQLAlchemy Tempita URLObject WebError WebHelpers WebHelpers2 WebOb WebTest Whoosh alembic amqplib anyjson appenlight-client authomatic backport-ipaddress celery channelstream colander decorator deform docutils gevent gunicorn infrae.cache ipython iso8601 kombu msgpack-python nbconvert packaging psycopg2 py-gfm pycrypto pycurl pyparsing pyramid pyramid-debugtoolbar pyramid-mako pyramid-beaker pysqlite python-dateutil python-ldap python-memcached python-pam recaptcha-client repoze.lru requests simplejson subprocess32 waitress zope.cachedescriptors dogpile.cache dogpile.core psutil py-bcrypt];
1492 src = ./.;
1648 src = ./.;
1493 meta = {
1649 meta = {
1494 license = [ { fullName = "Affero GNU General Public License v3 or later (AGPLv3+)"; } { fullName = "AGPLv3, and Commercial License"; } ];
1650 license = [ { fullName = "Affero GNU General Public License v3 or later (AGPLv3+)"; } { fullName = "AGPLv3, and Commercial License"; } ];
1495 };
1651 };
1496 };
1652 };
1497 rhodecode-tools = super.buildPythonPackage {
1653 rhodecode-tools = super.buildPythonPackage {
1498 name = "rhodecode-tools-0.11.0";
1654 name = "rhodecode-tools-0.11.0";
1499 buildInputs = with self; [];
1655 buildInputs = with self; [];
1500 doCheck = false;
1656 doCheck = false;
1501 propagatedBuildInputs = with self; [click future six Mako MarkupSafe requests elasticsearch elasticsearch-dsl urllib3 Whoosh];
1657 propagatedBuildInputs = with self; [click future six Mako MarkupSafe requests elasticsearch elasticsearch-dsl urllib3 Whoosh];
1502 src = fetchurl {
1658 src = fetchurl {
1503 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.11.0.tar.gz?md5=e5fd0a8363af08a0ced71b50ca9cce15";
1659 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.11.0.tar.gz?md5=e5fd0a8363af08a0ced71b50ca9cce15";
1504 md5 = "e5fd0a8363af08a0ced71b50ca9cce15";
1660 md5 = "e5fd0a8363af08a0ced71b50ca9cce15";
1505 };
1661 };
1506 meta = {
1662 meta = {
1507 license = [ { fullName = "AGPLv3 and Proprietary"; } ];
1663 license = [ { fullName = "AGPLv3 and Proprietary"; } ];
1508 };
1664 };
1509 };
1665 };
1510 setproctitle = super.buildPythonPackage {
1666 setproctitle = super.buildPythonPackage {
1511 name = "setproctitle-1.1.8";
1667 name = "setproctitle-1.1.8";
1512 buildInputs = with self; [];
1668 buildInputs = with self; [];
1513 doCheck = false;
1669 doCheck = false;
1514 propagatedBuildInputs = with self; [];
1670 propagatedBuildInputs = with self; [];
1515 src = fetchurl {
1671 src = fetchurl {
1516 url = "https://pypi.python.org/packages/33/c3/ad367a4f4f1ca90468863ae727ac62f6edb558fc09a003d344a02cfc6ea6/setproctitle-1.1.8.tar.gz";
1672 url = "https://pypi.python.org/packages/33/c3/ad367a4f4f1ca90468863ae727ac62f6edb558fc09a003d344a02cfc6ea6/setproctitle-1.1.8.tar.gz";
1517 md5 = "728f4c8c6031bbe56083a48594027edd";
1673 md5 = "728f4c8c6031bbe56083a48594027edd";
1518 };
1674 };
1519 meta = {
1675 meta = {
1520 license = [ pkgs.lib.licenses.bsdOriginal ];
1676 license = [ pkgs.lib.licenses.bsdOriginal ];
1521 };
1677 };
1522 };
1678 };
1523 setuptools = super.buildPythonPackage {
1679 setuptools = super.buildPythonPackage {
1524 name = "setuptools-30.1.0";
1680 name = "setuptools-30.1.0";
1525 buildInputs = with self; [];
1681 buildInputs = with self; [];
1526 doCheck = false;
1682 doCheck = false;
1527 propagatedBuildInputs = with self; [];
1683 propagatedBuildInputs = with self; [];
1528 src = fetchurl {
1684 src = fetchurl {
1529 url = "https://pypi.python.org/packages/1e/43/002c8616db9a3e7be23c2556e39b90a32bb40ba0dc652de1999d5334d372/setuptools-30.1.0.tar.gz";
1685 url = "https://pypi.python.org/packages/1e/43/002c8616db9a3e7be23c2556e39b90a32bb40ba0dc652de1999d5334d372/setuptools-30.1.0.tar.gz";
1530 md5 = "cac497f42e5096ac8df29e38d3f81c3e";
1686 md5 = "cac497f42e5096ac8df29e38d3f81c3e";
1531 };
1687 };
1532 meta = {
1688 meta = {
1533 license = [ pkgs.lib.licenses.mit ];
1689 license = [ pkgs.lib.licenses.mit ];
1534 };
1690 };
1535 };
1691 };
1536 setuptools-scm = super.buildPythonPackage {
1692 setuptools-scm = super.buildPythonPackage {
1537 name = "setuptools-scm-1.15.0";
1693 name = "setuptools-scm-1.15.0";
1538 buildInputs = with self; [];
1694 buildInputs = with self; [];
1539 doCheck = false;
1695 doCheck = false;
1540 propagatedBuildInputs = with self; [];
1696 propagatedBuildInputs = with self; [];
1541 src = fetchurl {
1697 src = fetchurl {
1542 url = "https://pypi.python.org/packages/80/b7/31b6ae5fcb188e37f7e31abe75f9be90490a5456a72860fa6e643f8a3cbc/setuptools_scm-1.15.0.tar.gz";
1698 url = "https://pypi.python.org/packages/80/b7/31b6ae5fcb188e37f7e31abe75f9be90490a5456a72860fa6e643f8a3cbc/setuptools_scm-1.15.0.tar.gz";
1543 md5 = "b6916c78ed6253d6602444fad4279c5b";
1699 md5 = "b6916c78ed6253d6602444fad4279c5b";
1544 };
1700 };
1545 meta = {
1701 meta = {
1546 license = [ pkgs.lib.licenses.mit ];
1702 license = [ pkgs.lib.licenses.mit ];
1547 };
1703 };
1548 };
1704 };
1549 simplegeneric = super.buildPythonPackage {
1705 simplegeneric = super.buildPythonPackage {
1550 name = "simplegeneric-0.8.1";
1706 name = "simplegeneric-0.8.1";
1551 buildInputs = with self; [];
1707 buildInputs = with self; [];
1552 doCheck = false;
1708 doCheck = false;
1553 propagatedBuildInputs = with self; [];
1709 propagatedBuildInputs = with self; [];
1554 src = fetchurl {
1710 src = fetchurl {
1555 url = "https://pypi.python.org/packages/3d/57/4d9c9e3ae9a255cd4e1106bb57e24056d3d0709fc01b2e3e345898e49d5b/simplegeneric-0.8.1.zip";
1711 url = "https://pypi.python.org/packages/3d/57/4d9c9e3ae9a255cd4e1106bb57e24056d3d0709fc01b2e3e345898e49d5b/simplegeneric-0.8.1.zip";
1556 md5 = "f9c1fab00fd981be588fc32759f474e3";
1712 md5 = "f9c1fab00fd981be588fc32759f474e3";
1557 };
1713 };
1558 meta = {
1714 meta = {
1559 license = [ pkgs.lib.licenses.zpt21 ];
1715 license = [ pkgs.lib.licenses.zpt21 ];
1560 };
1716 };
1561 };
1717 };
1562 simplejson = super.buildPythonPackage {
1718 simplejson = super.buildPythonPackage {
1563 name = "simplejson-3.7.2";
1719 name = "simplejson-3.7.2";
1564 buildInputs = with self; [];
1720 buildInputs = with self; [];
1565 doCheck = false;
1721 doCheck = false;
1566 propagatedBuildInputs = with self; [];
1722 propagatedBuildInputs = with self; [];
1567 src = fetchurl {
1723 src = fetchurl {
1568 url = "https://pypi.python.org/packages/6d/89/7f13f099344eea9d6722779a1f165087cb559598107844b1ac5dbd831fb1/simplejson-3.7.2.tar.gz";
1724 url = "https://pypi.python.org/packages/6d/89/7f13f099344eea9d6722779a1f165087cb559598107844b1ac5dbd831fb1/simplejson-3.7.2.tar.gz";
1569 md5 = "a5fc7d05d4cb38492285553def5d4b46";
1725 md5 = "a5fc7d05d4cb38492285553def5d4b46";
1570 };
1726 };
1571 meta = {
1727 meta = {
1572 license = [ { fullName = "Academic Free License (AFL)"; } pkgs.lib.licenses.mit ];
1728 license = [ { fullName = "Academic Free License (AFL)"; } pkgs.lib.licenses.mit ];
1573 };
1729 };
1574 };
1730 };
1575 six = super.buildPythonPackage {
1731 six = super.buildPythonPackage {
1576 name = "six-1.9.0";
1732 name = "six-1.9.0";
1577 buildInputs = with self; [];
1733 buildInputs = with self; [];
1578 doCheck = false;
1734 doCheck = false;
1579 propagatedBuildInputs = with self; [];
1735 propagatedBuildInputs = with self; [];
1580 src = fetchurl {
1736 src = fetchurl {
1581 url = "https://pypi.python.org/packages/16/64/1dc5e5976b17466fd7d712e59cbe9fb1e18bec153109e5ba3ed6c9102f1a/six-1.9.0.tar.gz";
1737 url = "https://pypi.python.org/packages/16/64/1dc5e5976b17466fd7d712e59cbe9fb1e18bec153109e5ba3ed6c9102f1a/six-1.9.0.tar.gz";
1582 md5 = "476881ef4012262dfc8adc645ee786c4";
1738 md5 = "476881ef4012262dfc8adc645ee786c4";
1583 };
1739 };
1584 meta = {
1740 meta = {
1585 license = [ pkgs.lib.licenses.mit ];
1741 license = [ pkgs.lib.licenses.mit ];
1586 };
1742 };
1587 };
1743 };
1588 subprocess32 = super.buildPythonPackage {
1744 subprocess32 = super.buildPythonPackage {
1589 name = "subprocess32-3.2.6";
1745 name = "subprocess32-3.2.6";
1590 buildInputs = with self; [];
1746 buildInputs = with self; [];
1591 doCheck = false;
1747 doCheck = false;
1592 propagatedBuildInputs = with self; [];
1748 propagatedBuildInputs = with self; [];
1593 src = fetchurl {
1749 src = fetchurl {
1594 url = "https://pypi.python.org/packages/28/8d/33ccbff51053f59ae6c357310cac0e79246bbed1d345ecc6188b176d72c3/subprocess32-3.2.6.tar.gz";
1750 url = "https://pypi.python.org/packages/28/8d/33ccbff51053f59ae6c357310cac0e79246bbed1d345ecc6188b176d72c3/subprocess32-3.2.6.tar.gz";
1595 md5 = "754c5ab9f533e764f931136974b618f1";
1751 md5 = "754c5ab9f533e764f931136974b618f1";
1596 };
1752 };
1597 meta = {
1753 meta = {
1598 license = [ pkgs.lib.licenses.psfl ];
1754 license = [ pkgs.lib.licenses.psfl ];
1599 };
1755 };
1600 };
1756 };
1601 supervisor = super.buildPythonPackage {
1757 supervisor = super.buildPythonPackage {
1602 name = "supervisor-3.3.1";
1758 name = "supervisor-3.3.1";
1603 buildInputs = with self; [];
1759 buildInputs = with self; [];
1604 doCheck = false;
1760 doCheck = false;
1605 propagatedBuildInputs = with self; [meld3];
1761 propagatedBuildInputs = with self; [meld3];
1606 src = fetchurl {
1762 src = fetchurl {
1607 url = "https://pypi.python.org/packages/80/37/964c0d53cbd328796b1aeb7abea4c0f7b0e8c7197ea9b0b9967b7d004def/supervisor-3.3.1.tar.gz";
1763 url = "https://pypi.python.org/packages/80/37/964c0d53cbd328796b1aeb7abea4c0f7b0e8c7197ea9b0b9967b7d004def/supervisor-3.3.1.tar.gz";
1608 md5 = "202f760f9bf4930ec06557bac73e5cf2";
1764 md5 = "202f760f9bf4930ec06557bac73e5cf2";
1609 };
1765 };
1610 meta = {
1766 meta = {
1611 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1767 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1612 };
1768 };
1613 };
1769 };
1614 termcolor = super.buildPythonPackage {
1770 termcolor = super.buildPythonPackage {
1615 name = "termcolor-1.1.0";
1771 name = "termcolor-1.1.0";
1616 buildInputs = with self; [];
1772 buildInputs = with self; [];
1617 doCheck = false;
1773 doCheck = false;
1618 propagatedBuildInputs = with self; [];
1774 propagatedBuildInputs = with self; [];
1619 src = fetchurl {
1775 src = fetchurl {
1620 url = "https://pypi.python.org/packages/8a/48/a76be51647d0eb9f10e2a4511bf3ffb8cc1e6b14e9e4fab46173aa79f981/termcolor-1.1.0.tar.gz";
1776 url = "https://pypi.python.org/packages/8a/48/a76be51647d0eb9f10e2a4511bf3ffb8cc1e6b14e9e4fab46173aa79f981/termcolor-1.1.0.tar.gz";
1621 md5 = "043e89644f8909d462fbbfa511c768df";
1777 md5 = "043e89644f8909d462fbbfa511c768df";
1622 };
1778 };
1623 meta = {
1779 meta = {
1624 license = [ pkgs.lib.licenses.mit ];
1780 license = [ pkgs.lib.licenses.mit ];
1625 };
1781 };
1626 };
1782 };
1783 testpath = super.buildPythonPackage {
1784 name = "testpath-0.1";
1785 buildInputs = with self; [];
1786 doCheck = false;
1787 propagatedBuildInputs = with self; [];
1788 src = fetchurl {
1789 url = "https://pypi.python.org/packages/f9/c4/c0b22f35138bc26a6058c39cb61db1e8977e5e9550b12cd2cb02ef56fc51/testpath-0.1.tar.gz";
1790 md5 = "401918bcd0b0e5b71a9b909835117bc6";
1791 };
1792 meta = {
1793 license = [ pkgs.lib.licenses.mit ];
1794 };
1795 };
1627 traitlets = super.buildPythonPackage {
1796 traitlets = super.buildPythonPackage {
1628 name = "traitlets-4.3.1";
1797 name = "traitlets-4.3.2";
1629 buildInputs = with self; [];
1798 buildInputs = with self; [];
1630 doCheck = false;
1799 doCheck = false;
1631 propagatedBuildInputs = with self; [ipython-genutils six decorator enum34];
1800 propagatedBuildInputs = with self; [ipython-genutils six decorator enum34];
1632 src = fetchurl {
1801 src = fetchurl {
1633 url = "https://pypi.python.org/packages/b1/d6/5b5aa6d5c474691909b91493da1e8972e309c9f01ecfe4aeafd272eb3234/traitlets-4.3.1.tar.gz";
1802 url = "https://pypi.python.org/packages/a5/98/7f5ef2fe9e9e071813aaf9cb91d1a732e0a68b6c44a32b38cb8e14c3f069/traitlets-4.3.2.tar.gz";
1634 md5 = "dd0b1b6e5d31ce446d55a4b5e5083c98";
1803 md5 = "3068663f2f38fd939a9eb3a500ccc154";
1635 };
1804 };
1636 meta = {
1805 meta = {
1637 license = [ pkgs.lib.licenses.bsdOriginal ];
1806 license = [ pkgs.lib.licenses.bsdOriginal ];
1638 };
1807 };
1639 };
1808 };
1640 transifex-client = super.buildPythonPackage {
1809 transifex-client = super.buildPythonPackage {
1641 name = "transifex-client-0.10";
1810 name = "transifex-client-0.10";
1642 buildInputs = with self; [];
1811 buildInputs = with self; [];
1643 doCheck = false;
1812 doCheck = false;
1644 propagatedBuildInputs = with self; [];
1813 propagatedBuildInputs = with self; [];
1645 src = fetchurl {
1814 src = fetchurl {
1646 url = "https://pypi.python.org/packages/f3/4e/7b925192aee656fb3e04fa6381c8b3dc40198047c3b4a356f6cfd642c809/transifex-client-0.10.tar.gz";
1815 url = "https://pypi.python.org/packages/f3/4e/7b925192aee656fb3e04fa6381c8b3dc40198047c3b4a356f6cfd642c809/transifex-client-0.10.tar.gz";
1647 md5 = "5549538d84b8eede6b254cd81ae024fa";
1816 md5 = "5549538d84b8eede6b254cd81ae024fa";
1648 };
1817 };
1649 meta = {
1818 meta = {
1650 license = [ pkgs.lib.licenses.gpl2 ];
1819 license = [ pkgs.lib.licenses.gpl2 ];
1651 };
1820 };
1652 };
1821 };
1653 translationstring = super.buildPythonPackage {
1822 translationstring = super.buildPythonPackage {
1654 name = "translationstring-1.3";
1823 name = "translationstring-1.3";
1655 buildInputs = with self; [];
1824 buildInputs = with self; [];
1656 doCheck = false;
1825 doCheck = false;
1657 propagatedBuildInputs = with self; [];
1826 propagatedBuildInputs = with self; [];
1658 src = fetchurl {
1827 src = fetchurl {
1659 url = "https://pypi.python.org/packages/5e/eb/bee578cc150b44c653b63f5ebe258b5d0d812ddac12497e5f80fcad5d0b4/translationstring-1.3.tar.gz";
1828 url = "https://pypi.python.org/packages/5e/eb/bee578cc150b44c653b63f5ebe258b5d0d812ddac12497e5f80fcad5d0b4/translationstring-1.3.tar.gz";
1660 md5 = "a4b62e0f3c189c783a1685b3027f7c90";
1829 md5 = "a4b62e0f3c189c783a1685b3027f7c90";
1661 };
1830 };
1662 meta = {
1831 meta = {
1663 license = [ { fullName = "BSD-like (http://repoze.org/license.html)"; } ];
1832 license = [ { fullName = "BSD-like (http://repoze.org/license.html)"; } ];
1664 };
1833 };
1665 };
1834 };
1666 trollius = super.buildPythonPackage {
1835 trollius = super.buildPythonPackage {
1667 name = "trollius-1.0.4";
1836 name = "trollius-1.0.4";
1668 buildInputs = with self; [];
1837 buildInputs = with self; [];
1669 doCheck = false;
1838 doCheck = false;
1670 propagatedBuildInputs = with self; [futures];
1839 propagatedBuildInputs = with self; [futures];
1671 src = fetchurl {
1840 src = fetchurl {
1672 url = "https://pypi.python.org/packages/aa/e6/4141db437f55e6ee7a3fb69663239e3fde7841a811b4bef293145ad6c836/trollius-1.0.4.tar.gz";
1841 url = "https://pypi.python.org/packages/aa/e6/4141db437f55e6ee7a3fb69663239e3fde7841a811b4bef293145ad6c836/trollius-1.0.4.tar.gz";
1673 md5 = "3631a464d49d0cbfd30ab2918ef2b783";
1842 md5 = "3631a464d49d0cbfd30ab2918ef2b783";
1674 };
1843 };
1675 meta = {
1844 meta = {
1676 license = [ pkgs.lib.licenses.asl20 ];
1845 license = [ pkgs.lib.licenses.asl20 ];
1677 };
1846 };
1678 };
1847 };
1679 uWSGI = super.buildPythonPackage {
1848 uWSGI = super.buildPythonPackage {
1680 name = "uWSGI-2.0.11.2";
1849 name = "uWSGI-2.0.11.2";
1681 buildInputs = with self; [];
1850 buildInputs = with self; [];
1682 doCheck = false;
1851 doCheck = false;
1683 propagatedBuildInputs = with self; [];
1852 propagatedBuildInputs = with self; [];
1684 src = fetchurl {
1853 src = fetchurl {
1685 url = "https://pypi.python.org/packages/9b/78/918db0cfab0546afa580c1e565209c49aaf1476bbfe491314eadbe47c556/uwsgi-2.0.11.2.tar.gz";
1854 url = "https://pypi.python.org/packages/9b/78/918db0cfab0546afa580c1e565209c49aaf1476bbfe491314eadbe47c556/uwsgi-2.0.11.2.tar.gz";
1686 md5 = "1f02dcbee7f6f61de4b1fd68350cf16f";
1855 md5 = "1f02dcbee7f6f61de4b1fd68350cf16f";
1687 };
1856 };
1688 meta = {
1857 meta = {
1689 license = [ pkgs.lib.licenses.gpl2 ];
1858 license = [ pkgs.lib.licenses.gpl2 ];
1690 };
1859 };
1691 };
1860 };
1692 urllib3 = super.buildPythonPackage {
1861 urllib3 = super.buildPythonPackage {
1693 name = "urllib3-1.16";
1862 name = "urllib3-1.16";
1694 buildInputs = with self; [];
1863 buildInputs = with self; [];
1695 doCheck = false;
1864 doCheck = false;
1696 propagatedBuildInputs = with self; [];
1865 propagatedBuildInputs = with self; [];
1697 src = fetchurl {
1866 src = fetchurl {
1698 url = "https://pypi.python.org/packages/3b/f0/e763169124e3f5db0926bc3dbfcd580a105f9ca44cf5d8e6c7a803c9f6b5/urllib3-1.16.tar.gz";
1867 url = "https://pypi.python.org/packages/3b/f0/e763169124e3f5db0926bc3dbfcd580a105f9ca44cf5d8e6c7a803c9f6b5/urllib3-1.16.tar.gz";
1699 md5 = "fcaab1c5385c57deeb7053d3d7d81d59";
1868 md5 = "fcaab1c5385c57deeb7053d3d7d81d59";
1700 };
1869 };
1701 meta = {
1870 meta = {
1702 license = [ pkgs.lib.licenses.mit ];
1871 license = [ pkgs.lib.licenses.mit ];
1703 };
1872 };
1704 };
1873 };
1705 venusian = super.buildPythonPackage {
1874 venusian = super.buildPythonPackage {
1706 name = "venusian-1.0";
1875 name = "venusian-1.0";
1707 buildInputs = with self; [];
1876 buildInputs = with self; [];
1708 doCheck = false;
1877 doCheck = false;
1709 propagatedBuildInputs = with self; [];
1878 propagatedBuildInputs = with self; [];
1710 src = fetchurl {
1879 src = fetchurl {
1711 url = "https://pypi.python.org/packages/86/20/1948e0dfc4930ddde3da8c33612f6a5717c0b4bc28f591a5c5cf014dd390/venusian-1.0.tar.gz";
1880 url = "https://pypi.python.org/packages/86/20/1948e0dfc4930ddde3da8c33612f6a5717c0b4bc28f591a5c5cf014dd390/venusian-1.0.tar.gz";
1712 md5 = "dccf2eafb7113759d60c86faf5538756";
1881 md5 = "dccf2eafb7113759d60c86faf5538756";
1713 };
1882 };
1714 meta = {
1883 meta = {
1715 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1884 license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1716 };
1885 };
1717 };
1886 };
1718 waitress = super.buildPythonPackage {
1887 waitress = super.buildPythonPackage {
1719 name = "waitress-1.0.1";
1888 name = "waitress-1.0.1";
1720 buildInputs = with self; [];
1889 buildInputs = with self; [];
1721 doCheck = false;
1890 doCheck = false;
1722 propagatedBuildInputs = with self; [];
1891 propagatedBuildInputs = with self; [];
1723 src = fetchurl {
1892 src = fetchurl {
1724 url = "https://pypi.python.org/packages/78/7d/84d11b96c3f60164dec3bef4a859a03aeae0231aa93f57fbe0d05fa4ff36/waitress-1.0.1.tar.gz";
1893 url = "https://pypi.python.org/packages/78/7d/84d11b96c3f60164dec3bef4a859a03aeae0231aa93f57fbe0d05fa4ff36/waitress-1.0.1.tar.gz";
1725 md5 = "dda92358a7569669086155923a46e57c";
1894 md5 = "dda92358a7569669086155923a46e57c";
1726 };
1895 };
1727 meta = {
1896 meta = {
1728 license = [ pkgs.lib.licenses.zpt21 ];
1897 license = [ pkgs.lib.licenses.zpt21 ];
1729 };
1898 };
1730 };
1899 };
1731 wcwidth = super.buildPythonPackage {
1900 wcwidth = super.buildPythonPackage {
1732 name = "wcwidth-0.1.7";
1901 name = "wcwidth-0.1.7";
1733 buildInputs = with self; [];
1902 buildInputs = with self; [];
1734 doCheck = false;
1903 doCheck = false;
1735 propagatedBuildInputs = with self; [];
1904 propagatedBuildInputs = with self; [];
1736 src = fetchurl {
1905 src = fetchurl {
1737 url = "https://pypi.python.org/packages/55/11/e4a2bb08bb450fdbd42cc709dd40de4ed2c472cf0ccb9e64af22279c5495/wcwidth-0.1.7.tar.gz";
1906 url = "https://pypi.python.org/packages/55/11/e4a2bb08bb450fdbd42cc709dd40de4ed2c472cf0ccb9e64af22279c5495/wcwidth-0.1.7.tar.gz";
1738 md5 = "b3b6a0a08f0c8a34d1de8cf44150a4ad";
1907 md5 = "b3b6a0a08f0c8a34d1de8cf44150a4ad";
1739 };
1908 };
1740 meta = {
1909 meta = {
1741 license = [ pkgs.lib.licenses.mit ];
1910 license = [ pkgs.lib.licenses.mit ];
1742 };
1911 };
1743 };
1912 };
1744 ws4py = super.buildPythonPackage {
1913 ws4py = super.buildPythonPackage {
1745 name = "ws4py-0.3.5";
1914 name = "ws4py-0.3.5";
1746 buildInputs = with self; [];
1915 buildInputs = with self; [];
1747 doCheck = false;
1916 doCheck = false;
1748 propagatedBuildInputs = with self; [];
1917 propagatedBuildInputs = with self; [];
1749 src = fetchurl {
1918 src = fetchurl {
1750 url = "https://pypi.python.org/packages/b6/4f/34af703be86939629479e74d6e650e39f3bd73b3b09212c34e5125764cbc/ws4py-0.3.5.zip";
1919 url = "https://pypi.python.org/packages/b6/4f/34af703be86939629479e74d6e650e39f3bd73b3b09212c34e5125764cbc/ws4py-0.3.5.zip";
1751 md5 = "a261b75c20b980e55ce7451a3576a867";
1920 md5 = "a261b75c20b980e55ce7451a3576a867";
1752 };
1921 };
1753 meta = {
1922 meta = {
1754 license = [ pkgs.lib.licenses.bsdOriginal ];
1923 license = [ pkgs.lib.licenses.bsdOriginal ];
1755 };
1924 };
1756 };
1925 };
1757 wsgiref = super.buildPythonPackage {
1926 wsgiref = super.buildPythonPackage {
1758 name = "wsgiref-0.1.2";
1927 name = "wsgiref-0.1.2";
1759 buildInputs = with self; [];
1928 buildInputs = with self; [];
1760 doCheck = false;
1929 doCheck = false;
1761 propagatedBuildInputs = with self; [];
1930 propagatedBuildInputs = with self; [];
1762 src = fetchurl {
1931 src = fetchurl {
1763 url = "https://pypi.python.org/packages/41/9e/309259ce8dff8c596e8c26df86dbc4e848b9249fd36797fd60be456f03fc/wsgiref-0.1.2.zip";
1932 url = "https://pypi.python.org/packages/41/9e/309259ce8dff8c596e8c26df86dbc4e848b9249fd36797fd60be456f03fc/wsgiref-0.1.2.zip";
1764 md5 = "29b146e6ebd0f9fb119fe321f7bcf6cb";
1933 md5 = "29b146e6ebd0f9fb119fe321f7bcf6cb";
1765 };
1934 };
1766 meta = {
1935 meta = {
1767 license = [ { fullName = "PSF or ZPL"; } ];
1936 license = [ { fullName = "PSF or ZPL"; } ];
1768 };
1937 };
1769 };
1938 };
1770 zope.cachedescriptors = super.buildPythonPackage {
1939 zope.cachedescriptors = super.buildPythonPackage {
1771 name = "zope.cachedescriptors-4.0.0";
1940 name = "zope.cachedescriptors-4.0.0";
1772 buildInputs = with self; [];
1941 buildInputs = with self; [];
1773 doCheck = false;
1942 doCheck = false;
1774 propagatedBuildInputs = with self; [setuptools];
1943 propagatedBuildInputs = with self; [setuptools];
1775 src = fetchurl {
1944 src = fetchurl {
1776 url = "https://pypi.python.org/packages/40/33/694b6644c37f28553f4b9f20b3c3a20fb709a22574dff20b5bdffb09ecd5/zope.cachedescriptors-4.0.0.tar.gz";
1945 url = "https://pypi.python.org/packages/40/33/694b6644c37f28553f4b9f20b3c3a20fb709a22574dff20b5bdffb09ecd5/zope.cachedescriptors-4.0.0.tar.gz";
1777 md5 = "8d308de8c936792c8e758058fcb7d0f0";
1946 md5 = "8d308de8c936792c8e758058fcb7d0f0";
1778 };
1947 };
1779 meta = {
1948 meta = {
1780 license = [ pkgs.lib.licenses.zpt21 ];
1949 license = [ pkgs.lib.licenses.zpt21 ];
1781 };
1950 };
1782 };
1951 };
1783 zope.deprecation = super.buildPythonPackage {
1952 zope.deprecation = super.buildPythonPackage {
1784 name = "zope.deprecation-4.1.2";
1953 name = "zope.deprecation-4.1.2";
1785 buildInputs = with self; [];
1954 buildInputs = with self; [];
1786 doCheck = false;
1955 doCheck = false;
1787 propagatedBuildInputs = with self; [setuptools];
1956 propagatedBuildInputs = with self; [setuptools];
1788 src = fetchurl {
1957 src = fetchurl {
1789 url = "https://pypi.python.org/packages/c1/d3/3919492d5e57d8dd01b36f30b34fc8404a30577392b1eb817c303499ad20/zope.deprecation-4.1.2.tar.gz";
1958 url = "https://pypi.python.org/packages/c1/d3/3919492d5e57d8dd01b36f30b34fc8404a30577392b1eb817c303499ad20/zope.deprecation-4.1.2.tar.gz";
1790 md5 = "e9a663ded58f4f9f7881beb56cae2782";
1959 md5 = "e9a663ded58f4f9f7881beb56cae2782";
1791 };
1960 };
1792 meta = {
1961 meta = {
1793 license = [ pkgs.lib.licenses.zpt21 ];
1962 license = [ pkgs.lib.licenses.zpt21 ];
1794 };
1963 };
1795 };
1964 };
1796 zope.event = super.buildPythonPackage {
1965 zope.event = super.buildPythonPackage {
1797 name = "zope.event-4.0.3";
1966 name = "zope.event-4.0.3";
1798 buildInputs = with self; [];
1967 buildInputs = with self; [];
1799 doCheck = false;
1968 doCheck = false;
1800 propagatedBuildInputs = with self; [setuptools];
1969 propagatedBuildInputs = with self; [setuptools];
1801 src = fetchurl {
1970 src = fetchurl {
1802 url = "https://pypi.python.org/packages/c1/29/91ba884d7d6d96691df592e9e9c2bfa57a47040ec1ff47eff18c85137152/zope.event-4.0.3.tar.gz";
1971 url = "https://pypi.python.org/packages/c1/29/91ba884d7d6d96691df592e9e9c2bfa57a47040ec1ff47eff18c85137152/zope.event-4.0.3.tar.gz";
1803 md5 = "9a3780916332b18b8b85f522bcc3e249";
1972 md5 = "9a3780916332b18b8b85f522bcc3e249";
1804 };
1973 };
1805 meta = {
1974 meta = {
1806 license = [ pkgs.lib.licenses.zpt21 ];
1975 license = [ pkgs.lib.licenses.zpt21 ];
1807 };
1976 };
1808 };
1977 };
1809 zope.interface = super.buildPythonPackage {
1978 zope.interface = super.buildPythonPackage {
1810 name = "zope.interface-4.1.3";
1979 name = "zope.interface-4.1.3";
1811 buildInputs = with self; [];
1980 buildInputs = with self; [];
1812 doCheck = false;
1981 doCheck = false;
1813 propagatedBuildInputs = with self; [setuptools];
1982 propagatedBuildInputs = with self; [setuptools];
1814 src = fetchurl {
1983 src = fetchurl {
1815 url = "https://pypi.python.org/packages/9d/81/2509ca3c6f59080123c1a8a97125eb48414022618cec0e64eb1313727bfe/zope.interface-4.1.3.tar.gz";
1984 url = "https://pypi.python.org/packages/9d/81/2509ca3c6f59080123c1a8a97125eb48414022618cec0e64eb1313727bfe/zope.interface-4.1.3.tar.gz";
1816 md5 = "9ae3d24c0c7415deb249dd1a132f0f79";
1985 md5 = "9ae3d24c0c7415deb249dd1a132f0f79";
1817 };
1986 };
1818 meta = {
1987 meta = {
1819 license = [ pkgs.lib.licenses.zpt21 ];
1988 license = [ pkgs.lib.licenses.zpt21 ];
1820 };
1989 };
1821 };
1990 };
1822
1991
1823 ### Test requirements
1992 ### Test requirements
1824
1993
1825
1994
1826 }
1995 }
@@ -1,127 +1,134 b''
1 ## core
1 ## core
2 setuptools==30.1.0
2 setuptools==30.1.0
3 setuptools-scm==1.15.0
3 setuptools-scm==1.15.0
4
4
5 amqplib==1.0.2
5 amqplib==1.0.2
6 anyjson==0.3.3
6 anyjson==0.3.3
7 authomatic==0.1.0.post1
7 authomatic==0.1.0.post1
8 Babel==1.3
8 Babel==1.3
9 backport-ipaddress==0.1
9 backport-ipaddress==0.1
10 Beaker==1.7.0
10 Beaker==1.7.0
11 celery==2.2.10
11 celery==2.2.10
12 Chameleon==2.24
12 Chameleon==2.24
13 channelstream==0.5.2
13 channelstream==0.5.2
14 click==5.1
14 click==5.1
15 colander==1.2
15 colander==1.2
16 configobj==5.0.6
16 configobj==5.0.6
17 decorator==3.4.2
17 decorator==3.4.2
18 deform==2.0a2
18 deform==2.0a2
19 docutils==0.12
19 docutils==0.12
20 dogpile.cache==0.6.1
20 dogpile.cache==0.6.1
21 dogpile.core==0.4.1
21 dogpile.core==0.4.1
22 ecdsa==0.11
22 ecdsa==0.11
23 FormEncode==1.2.4
23 FormEncode==1.2.4
24 future==0.14.3
24 future==0.14.3
25 futures==3.0.2
25 futures==3.0.2
26 gnureadline==6.3.3
26 gnureadline==6.3.3
27 infrae.cache==1.0.1
27 infrae.cache==1.0.1
28 iso8601==0.1.11
28 iso8601==0.1.11
29 itsdangerous==0.24
29 itsdangerous==0.24
30 Jinja2==2.7.3
30 Jinja2==2.7.3
31 kombu==1.5.1
31 kombu==1.5.1
32 Mako==1.0.6
32 Mako==1.0.6
33 Markdown==2.6.7
33 Markdown==2.6.7
34 MarkupSafe==0.23
34 MarkupSafe==0.23
35 meld3==1.0.2
35 meld3==1.0.2
36 msgpack-python==0.4.8
36 msgpack-python==0.4.8
37 MySQL-python==1.2.5
37 MySQL-python==1.2.5
38 nose==1.3.6
38 nose==1.3.6
39 objgraph==2.0.0
39 objgraph==2.0.0
40 packaging==15.2
40 packaging==15.2
41 paramiko==1.15.1
41 paramiko==1.15.1
42 Paste==2.0.3
42 Paste==2.0.3
43 PasteDeploy==1.5.2
43 PasteDeploy==1.5.2
44 PasteScript==1.7.5
44 PasteScript==1.7.5
45 pathlib2==2.1.0
45 psutil==4.3.1
46 psutil==4.3.1
46 psycopg2==2.6.1
47 psycopg2==2.6.1
47 py-bcrypt==0.4
48 py-bcrypt==0.4
48 pycrypto==2.6.1
49 pycrypto==2.6.1
49 pycurl==7.19.5
50 pycurl==7.19.5
50 pyflakes==0.8.1
51 pyflakes==0.8.1
51 pygments-markdown-lexer==0.1.0.dev39
52 pygments-markdown-lexer==0.1.0.dev39
52 Pygments==2.2.0
53 Pygments==2.2.0
53 pyparsing==1.5.7
54 pyparsing==1.5.7
54 pyramid-beaker==0.8
55 pyramid-beaker==0.8
55 pyramid-debugtoolbar==3.0.5
56 pyramid-debugtoolbar==3.0.5
56 pyramid-jinja2==2.5
57 pyramid-jinja2==2.5
57 pyramid-mako==1.0.2
58 pyramid-mako==1.0.2
58 pyramid==1.7.4
59 pyramid==1.7.4
59 pysqlite==2.6.3
60 pysqlite==2.6.3
60 python-dateutil==1.5
61 python-dateutil==2.1
61 python-ldap==2.4.19
62 python-ldap==2.4.19
62 python-memcached==1.57
63 python-memcached==1.57
63 python-pam==1.8.2
64 python-pam==1.8.2
64 pytz==2015.4
65 pytz==2015.4
65 pyzmq==14.6.0
66 pyzmq==14.6.0
66 recaptcha-client==1.0.6
67 recaptcha-client==1.0.6
67 repoze.lru==0.6
68 repoze.lru==0.6
68 requests==2.9.1
69 requests==2.9.1
69 Routes==1.13
70 Routes==1.13
70 setproctitle==1.1.8
71 setproctitle==1.1.8
71 simplejson==3.7.2
72 simplejson==3.7.2
72 six==1.9.0
73 six==1.9.0
73 Sphinx==1.2.2
74 Sphinx==1.2.2
74 SQLAlchemy==0.9.9
75 SQLAlchemy==0.9.9
75 subprocess32==3.2.6
76 subprocess32==3.2.6
76 supervisor==3.3.1
77 supervisor==3.3.1
77 Tempita==0.5.2
78 Tempita==0.5.2
78 translationstring==1.3
79 translationstring==1.3
79 trollius==1.0.4
80 trollius==1.0.4
80 urllib3==1.16
81 urllib3==1.16
81 URLObject==2.4.0
82 URLObject==2.4.0
82 venusian==1.0
83 venusian==1.0
83 WebError==0.10.3
84 WebError==0.10.3
84 WebHelpers2==2.0
85 WebHelpers2==2.0
85 WebHelpers==1.3
86 WebHelpers==1.3
86 WebOb==1.3.1
87 WebOb==1.3.1
87 Whoosh==2.7.4
88 Whoosh==2.7.4
88 wsgiref==0.1.2
89 wsgiref==0.1.2
89 zope.cachedescriptors==4.0.0
90 zope.cachedescriptors==4.0.0
90 zope.deprecation==4.1.2
91 zope.deprecation==4.1.2
91 zope.event==4.0.3
92 zope.event==4.0.3
92 zope.interface==4.1.3
93 zope.interface==4.1.3
93
94
94 ## customized/patched libs
95 ## customized/patched libs
95 # our patched version of Pylons==1.0.2
96 # our patched version of Pylons==1.0.2
96 https://code.rhodecode.com/upstream/pylons/archive/707354ee4261b9c10450404fc9852ccea4fd667d.tar.gz?md5=f26633726fa2cd3a340316ee6a5d218f#egg=Pylons==1.0.2.rhodecode-patch-1
97 https://code.rhodecode.com/upstream/pylons/archive/707354ee4261b9c10450404fc9852ccea4fd667d.tar.gz?md5=f26633726fa2cd3a340316ee6a5d218f#egg=Pylons==1.0.2.rhodecode-patch-1
97 # not released py-gfm==0.1.3
98 # not released py-gfm==0.1.3
98 https://code.rhodecode.com/upstream/py-gfm/archive/0d66a19bc16e3d49de273c0f797d4e4781e8c0f2.tar.gz?md5=0d0d5385bfb629eea636a80b9c2bfd16#egg=py-gfm==0.1.3.rhodecode-upstream1
99 https://code.rhodecode.com/upstream/py-gfm/archive/0d66a19bc16e3d49de273c0f797d4e4781e8c0f2.tar.gz?md5=0d0d5385bfb629eea636a80b9c2bfd16#egg=py-gfm==0.1.3.rhodecode-upstream1
99
100
101 # IPYTHON RENDERING
102 # entrypoints backport, pypi version doesn't support egg installs
103 https://code.rhodecode.com/upstream/entrypoints/archive/96e6d645684e1af3d7df5b5272f3fe85a546b233.tar.gz?md5=7db37771aea9ac9fefe093e5d6987313#egg=entrypoints==0.2.2.rhodecode-upstream1
104 nbconvert==5.1.1
105 nbformat==4.3.0
106 jupyter_client==5.0.0
100
107
101 ## cli tools
108 ## cli tools
102 alembic==0.8.4
109 alembic==0.8.4
103 invoke==0.13.0
110 invoke==0.13.0
104 bumpversion==0.5.3
111 bumpversion==0.5.3
105 transifex-client==0.10
112 transifex-client==0.10
106
113
107 ## http servers
114 ## http servers
108 gevent==1.1.2
115 gevent==1.1.2
109 greenlet==0.4.10
116 greenlet==0.4.10
110 gunicorn==19.6.0
117 gunicorn==19.6.0
111 waitress==1.0.1
118 waitress==1.0.1
112 uWSGI==2.0.11.2
119 uWSGI==2.0.11.2
113
120
114 ## debug
121 ## debug
115 ipdb==0.10.1
122 ipdb==0.10.1
116 ipython==5.1.0
123 ipython==5.1.0
117 CProfileV==1.0.6
124 CProfileV==1.0.6
118 bottle==0.12.8
125 bottle==0.12.8
119
126
120 ## rhodecode-tools, special case
127 ## rhodecode-tools, special case
121 https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.11.0.tar.gz?md5=e5fd0a8363af08a0ced71b50ca9cce15#egg=rhodecode-tools==0.11.0
128 https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.11.0.tar.gz?md5=e5fd0a8363af08a0ced71b50ca9cce15#egg=rhodecode-tools==0.11.0
122
129
123 ## appenlight
130 ## appenlight
124 appenlight-client==0.6.14
131 appenlight-client==0.6.14
125
132
126 ## test related requirements
133 ## test related requirements
127 -r requirements_test.txt
134 -r requirements_test.txt
@@ -1,2005 +1,2038 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2017 RhodeCode GmbH
3 # Copyright (C) 2010-2017 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 """
21 """
22 Helper functions
22 Helper functions
23
23
24 Consists of functions to typically be used within templates, but also
24 Consists of functions to typically be used within templates, but also
25 available to Controllers. This module is available to both as 'h'.
25 available to Controllers. This module is available to both as 'h'.
26 """
26 """
27
27
28 import random
28 import random
29 import hashlib
29 import hashlib
30 import StringIO
30 import StringIO
31 import urllib
31 import urllib
32 import math
32 import math
33 import logging
33 import logging
34 import re
34 import re
35 import urlparse
35 import urlparse
36 import time
36 import time
37 import string
37 import string
38 import hashlib
38 import hashlib
39 import pygments
39 import pygments
40 import itertools
40 import itertools
41
41
42 from datetime import datetime
42 from datetime import datetime
43 from functools import partial
43 from functools import partial
44 from pygments.formatters.html import HtmlFormatter
44 from pygments.formatters.html import HtmlFormatter
45 from pygments import highlight as code_highlight
45 from pygments import highlight as code_highlight
46 from pygments.lexers import (
46 from pygments.lexers import (
47 get_lexer_by_name, get_lexer_for_filename, get_lexer_for_mimetype)
47 get_lexer_by_name, get_lexer_for_filename, get_lexer_for_mimetype)
48 from pylons import url as pylons_url
48 from pylons import url as pylons_url
49 from pylons.i18n.translation import _, ungettext
49 from pylons.i18n.translation import _, ungettext
50 from pyramid.threadlocal import get_current_request
50 from pyramid.threadlocal import get_current_request
51
51
52 from webhelpers.html import literal, HTML, escape
52 from webhelpers.html import literal, HTML, escape
53 from webhelpers.html.tools import *
53 from webhelpers.html.tools import *
54 from webhelpers.html.builder import make_tag
54 from webhelpers.html.builder import make_tag
55 from webhelpers.html.tags import auto_discovery_link, checkbox, css_classes, \
55 from webhelpers.html.tags import auto_discovery_link, checkbox, css_classes, \
56 end_form, file, form as wh_form, hidden, image, javascript_link, link_to, \
56 end_form, file, form as wh_form, hidden, image, javascript_link, link_to, \
57 link_to_if, link_to_unless, ol, required_legend, select, stylesheet_link, \
57 link_to_if, link_to_unless, ol, required_legend, select, stylesheet_link, \
58 submit, text, password, textarea, title, ul, xml_declaration, radio
58 submit, text, password, textarea, title, ul, xml_declaration, radio
59 from webhelpers.html.tools import auto_link, button_to, highlight, \
59 from webhelpers.html.tools import auto_link, button_to, highlight, \
60 js_obfuscate, mail_to, strip_links, strip_tags, tag_re
60 js_obfuscate, mail_to, strip_links, strip_tags, tag_re
61 from webhelpers.pylonslib import Flash as _Flash
61 from webhelpers.pylonslib import Flash as _Flash
62 from webhelpers.text import chop_at, collapse, convert_accented_entities, \
62 from webhelpers.text import chop_at, collapse, convert_accented_entities, \
63 convert_misc_entities, lchop, plural, rchop, remove_formatting, \
63 convert_misc_entities, lchop, plural, rchop, remove_formatting, \
64 replace_whitespace, urlify, truncate, wrap_paragraphs
64 replace_whitespace, urlify, truncate, wrap_paragraphs
65 from webhelpers.date import time_ago_in_words
65 from webhelpers.date import time_ago_in_words
66 from webhelpers.paginate import Page as _Page
66 from webhelpers.paginate import Page as _Page
67 from webhelpers.html.tags import _set_input_attrs, _set_id_attr, \
67 from webhelpers.html.tags import _set_input_attrs, _set_id_attr, \
68 convert_boolean_attrs, NotGiven, _make_safe_id_component
68 convert_boolean_attrs, NotGiven, _make_safe_id_component
69 from webhelpers2.number import format_byte_size
69 from webhelpers2.number import format_byte_size
70
70
71 from rhodecode.lib.action_parser import action_parser
71 from rhodecode.lib.action_parser import action_parser
72 from rhodecode.lib.ext_json import json
72 from rhodecode.lib.ext_json import json
73 from rhodecode.lib.utils import repo_name_slug, get_custom_lexer
73 from rhodecode.lib.utils import repo_name_slug, get_custom_lexer
74 from rhodecode.lib.utils2 import str2bool, safe_unicode, safe_str, \
74 from rhodecode.lib.utils2 import str2bool, safe_unicode, safe_str, \
75 get_commit_safe, datetime_to_time, time_to_datetime, time_to_utcdatetime, \
75 get_commit_safe, datetime_to_time, time_to_datetime, time_to_utcdatetime, \
76 AttributeDict, safe_int, md5, md5_safe
76 AttributeDict, safe_int, md5, md5_safe
77 from rhodecode.lib.markup_renderer import MarkupRenderer
77 from rhodecode.lib.markup_renderer import MarkupRenderer
78 from rhodecode.lib.vcs.exceptions import CommitDoesNotExistError
78 from rhodecode.lib.vcs.exceptions import CommitDoesNotExistError
79 from rhodecode.lib.vcs.backends.base import BaseChangeset, EmptyCommit
79 from rhodecode.lib.vcs.backends.base import BaseChangeset, EmptyCommit
80 from rhodecode.config.conf import DATE_FORMAT, DATETIME_FORMAT
80 from rhodecode.config.conf import DATE_FORMAT, DATETIME_FORMAT
81 from rhodecode.model.changeset_status import ChangesetStatusModel
81 from rhodecode.model.changeset_status import ChangesetStatusModel
82 from rhodecode.model.db import Permission, User, Repository
82 from rhodecode.model.db import Permission, User, Repository
83 from rhodecode.model.repo_group import RepoGroupModel
83 from rhodecode.model.repo_group import RepoGroupModel
84 from rhodecode.model.settings import IssueTrackerSettingsModel
84 from rhodecode.model.settings import IssueTrackerSettingsModel
85
85
86 log = logging.getLogger(__name__)
86 log = logging.getLogger(__name__)
87
87
88
88
89 DEFAULT_USER = User.DEFAULT_USER
89 DEFAULT_USER = User.DEFAULT_USER
90 DEFAULT_USER_EMAIL = User.DEFAULT_USER_EMAIL
90 DEFAULT_USER_EMAIL = User.DEFAULT_USER_EMAIL
91
91
92
92
93 def url(*args, **kw):
93 def url(*args, **kw):
94 return pylons_url(*args, **kw)
94 return pylons_url(*args, **kw)
95
95
96
96
97 def pylons_url_current(*args, **kw):
97 def pylons_url_current(*args, **kw):
98 """
98 """
99 This function overrides pylons.url.current() which returns the current
99 This function overrides pylons.url.current() which returns the current
100 path so that it will also work from a pyramid only context. This
100 path so that it will also work from a pyramid only context. This
101 should be removed once port to pyramid is complete.
101 should be removed once port to pyramid is complete.
102 """
102 """
103 if not args and not kw:
103 if not args and not kw:
104 request = get_current_request()
104 request = get_current_request()
105 return request.path
105 return request.path
106 return pylons_url.current(*args, **kw)
106 return pylons_url.current(*args, **kw)
107
107
108 url.current = pylons_url_current
108 url.current = pylons_url_current
109
109
110
110
111 def url_replace(**qargs):
111 def url_replace(**qargs):
112 """ Returns the current request url while replacing query string args """
112 """ Returns the current request url while replacing query string args """
113
113
114 request = get_current_request()
114 request = get_current_request()
115 new_args = request.GET.mixed()
115 new_args = request.GET.mixed()
116 new_args.update(qargs)
116 new_args.update(qargs)
117 return url('', **new_args)
117 return url('', **new_args)
118
118
119
119
120 def asset(path, ver=None, **kwargs):
120 def asset(path, ver=None, **kwargs):
121 """
121 """
122 Helper to generate a static asset file path for rhodecode assets
122 Helper to generate a static asset file path for rhodecode assets
123
123
124 eg. h.asset('images/image.png', ver='3923')
124 eg. h.asset('images/image.png', ver='3923')
125
125
126 :param path: path of asset
126 :param path: path of asset
127 :param ver: optional version query param to append as ?ver=
127 :param ver: optional version query param to append as ?ver=
128 """
128 """
129 request = get_current_request()
129 request = get_current_request()
130 query = {}
130 query = {}
131 query.update(kwargs)
131 query.update(kwargs)
132 if ver:
132 if ver:
133 query = {'ver': ver}
133 query = {'ver': ver}
134 return request.static_path(
134 return request.static_path(
135 'rhodecode:public/{}'.format(path), _query=query)
135 'rhodecode:public/{}'.format(path), _query=query)
136
136
137
137
138 default_html_escape_table = {
138 default_html_escape_table = {
139 ord('&'): u'&amp;',
139 ord('&'): u'&amp;',
140 ord('<'): u'&lt;',
140 ord('<'): u'&lt;',
141 ord('>'): u'&gt;',
141 ord('>'): u'&gt;',
142 ord('"'): u'&quot;',
142 ord('"'): u'&quot;',
143 ord("'"): u'&#39;',
143 ord("'"): u'&#39;',
144 }
144 }
145
145
146
146
147 def html_escape(text, html_escape_table=default_html_escape_table):
147 def html_escape(text, html_escape_table=default_html_escape_table):
148 """Produce entities within text."""
148 """Produce entities within text."""
149 return text.translate(html_escape_table)
149 return text.translate(html_escape_table)
150
150
151
151
152 def chop_at_smart(s, sub, inclusive=False, suffix_if_chopped=None):
152 def chop_at_smart(s, sub, inclusive=False, suffix_if_chopped=None):
153 """
153 """
154 Truncate string ``s`` at the first occurrence of ``sub``.
154 Truncate string ``s`` at the first occurrence of ``sub``.
155
155
156 If ``inclusive`` is true, truncate just after ``sub`` rather than at it.
156 If ``inclusive`` is true, truncate just after ``sub`` rather than at it.
157 """
157 """
158 suffix_if_chopped = suffix_if_chopped or ''
158 suffix_if_chopped = suffix_if_chopped or ''
159 pos = s.find(sub)
159 pos = s.find(sub)
160 if pos == -1:
160 if pos == -1:
161 return s
161 return s
162
162
163 if inclusive:
163 if inclusive:
164 pos += len(sub)
164 pos += len(sub)
165
165
166 chopped = s[:pos]
166 chopped = s[:pos]
167 left = s[pos:].strip()
167 left = s[pos:].strip()
168
168
169 if left and suffix_if_chopped:
169 if left and suffix_if_chopped:
170 chopped += suffix_if_chopped
170 chopped += suffix_if_chopped
171
171
172 return chopped
172 return chopped
173
173
174
174
175 def shorter(text, size=20):
175 def shorter(text, size=20):
176 postfix = '...'
176 postfix = '...'
177 if len(text) > size:
177 if len(text) > size:
178 return text[:size - len(postfix)] + postfix
178 return text[:size - len(postfix)] + postfix
179 return text
179 return text
180
180
181
181
182 def _reset(name, value=None, id=NotGiven, type="reset", **attrs):
182 def _reset(name, value=None, id=NotGiven, type="reset", **attrs):
183 """
183 """
184 Reset button
184 Reset button
185 """
185 """
186 _set_input_attrs(attrs, type, name, value)
186 _set_input_attrs(attrs, type, name, value)
187 _set_id_attr(attrs, id, name)
187 _set_id_attr(attrs, id, name)
188 convert_boolean_attrs(attrs, ["disabled"])
188 convert_boolean_attrs(attrs, ["disabled"])
189 return HTML.input(**attrs)
189 return HTML.input(**attrs)
190
190
191 reset = _reset
191 reset = _reset
192 safeid = _make_safe_id_component
192 safeid = _make_safe_id_component
193
193
194
194
195 def branding(name, length=40):
195 def branding(name, length=40):
196 return truncate(name, length, indicator="")
196 return truncate(name, length, indicator="")
197
197
198
198
199 def FID(raw_id, path):
199 def FID(raw_id, path):
200 """
200 """
201 Creates a unique ID for filenode based on it's hash of path and commit
201 Creates a unique ID for filenode based on it's hash of path and commit
202 it's safe to use in urls
202 it's safe to use in urls
203
203
204 :param raw_id:
204 :param raw_id:
205 :param path:
205 :param path:
206 """
206 """
207
207
208 return 'c-%s-%s' % (short_id(raw_id), md5_safe(path)[:12])
208 return 'c-%s-%s' % (short_id(raw_id), md5_safe(path)[:12])
209
209
210
210
211 class _GetError(object):
211 class _GetError(object):
212 """Get error from form_errors, and represent it as span wrapped error
212 """Get error from form_errors, and represent it as span wrapped error
213 message
213 message
214
214
215 :param field_name: field to fetch errors for
215 :param field_name: field to fetch errors for
216 :param form_errors: form errors dict
216 :param form_errors: form errors dict
217 """
217 """
218
218
219 def __call__(self, field_name, form_errors):
219 def __call__(self, field_name, form_errors):
220 tmpl = """<span class="error_msg">%s</span>"""
220 tmpl = """<span class="error_msg">%s</span>"""
221 if form_errors and field_name in form_errors:
221 if form_errors and field_name in form_errors:
222 return literal(tmpl % form_errors.get(field_name))
222 return literal(tmpl % form_errors.get(field_name))
223
223
224 get_error = _GetError()
224 get_error = _GetError()
225
225
226
226
227 class _ToolTip(object):
227 class _ToolTip(object):
228
228
229 def __call__(self, tooltip_title, trim_at=50):
229 def __call__(self, tooltip_title, trim_at=50):
230 """
230 """
231 Special function just to wrap our text into nice formatted
231 Special function just to wrap our text into nice formatted
232 autowrapped text
232 autowrapped text
233
233
234 :param tooltip_title:
234 :param tooltip_title:
235 """
235 """
236 tooltip_title = escape(tooltip_title)
236 tooltip_title = escape(tooltip_title)
237 tooltip_title = tooltip_title.replace('<', '&lt;').replace('>', '&gt;')
237 tooltip_title = tooltip_title.replace('<', '&lt;').replace('>', '&gt;')
238 return tooltip_title
238 return tooltip_title
239 tooltip = _ToolTip()
239 tooltip = _ToolTip()
240
240
241
241
242 def files_breadcrumbs(repo_name, commit_id, file_path):
242 def files_breadcrumbs(repo_name, commit_id, file_path):
243 if isinstance(file_path, str):
243 if isinstance(file_path, str):
244 file_path = safe_unicode(file_path)
244 file_path = safe_unicode(file_path)
245
245
246 # TODO: johbo: Is this always a url like path, or is this operating
246 # TODO: johbo: Is this always a url like path, or is this operating
247 # system dependent?
247 # system dependent?
248 path_segments = file_path.split('/')
248 path_segments = file_path.split('/')
249
249
250 repo_name_html = escape(repo_name)
250 repo_name_html = escape(repo_name)
251 if len(path_segments) == 1 and path_segments[0] == '':
251 if len(path_segments) == 1 and path_segments[0] == '':
252 url_segments = [repo_name_html]
252 url_segments = [repo_name_html]
253 else:
253 else:
254 url_segments = [
254 url_segments = [
255 link_to(
255 link_to(
256 repo_name_html,
256 repo_name_html,
257 url('files_home',
257 url('files_home',
258 repo_name=repo_name,
258 repo_name=repo_name,
259 revision=commit_id,
259 revision=commit_id,
260 f_path=''),
260 f_path=''),
261 class_='pjax-link')]
261 class_='pjax-link')]
262
262
263 last_cnt = len(path_segments) - 1
263 last_cnt = len(path_segments) - 1
264 for cnt, segment in enumerate(path_segments):
264 for cnt, segment in enumerate(path_segments):
265 if not segment:
265 if not segment:
266 continue
266 continue
267 segment_html = escape(segment)
267 segment_html = escape(segment)
268
268
269 if cnt != last_cnt:
269 if cnt != last_cnt:
270 url_segments.append(
270 url_segments.append(
271 link_to(
271 link_to(
272 segment_html,
272 segment_html,
273 url('files_home',
273 url('files_home',
274 repo_name=repo_name,
274 repo_name=repo_name,
275 revision=commit_id,
275 revision=commit_id,
276 f_path='/'.join(path_segments[:cnt + 1])),
276 f_path='/'.join(path_segments[:cnt + 1])),
277 class_='pjax-link'))
277 class_='pjax-link'))
278 else:
278 else:
279 url_segments.append(segment_html)
279 url_segments.append(segment_html)
280
280
281 return literal('/'.join(url_segments))
281 return literal('/'.join(url_segments))
282
282
283
283
284 class CodeHtmlFormatter(HtmlFormatter):
284 class CodeHtmlFormatter(HtmlFormatter):
285 """
285 """
286 My code Html Formatter for source codes
286 My code Html Formatter for source codes
287 """
287 """
288
288
289 def wrap(self, source, outfile):
289 def wrap(self, source, outfile):
290 return self._wrap_div(self._wrap_pre(self._wrap_code(source)))
290 return self._wrap_div(self._wrap_pre(self._wrap_code(source)))
291
291
292 def _wrap_code(self, source):
292 def _wrap_code(self, source):
293 for cnt, it in enumerate(source):
293 for cnt, it in enumerate(source):
294 i, t = it
294 i, t = it
295 t = '<div id="L%s">%s</div>' % (cnt + 1, t)
295 t = '<div id="L%s">%s</div>' % (cnt + 1, t)
296 yield i, t
296 yield i, t
297
297
298 def _wrap_tablelinenos(self, inner):
298 def _wrap_tablelinenos(self, inner):
299 dummyoutfile = StringIO.StringIO()
299 dummyoutfile = StringIO.StringIO()
300 lncount = 0
300 lncount = 0
301 for t, line in inner:
301 for t, line in inner:
302 if t:
302 if t:
303 lncount += 1
303 lncount += 1
304 dummyoutfile.write(line)
304 dummyoutfile.write(line)
305
305
306 fl = self.linenostart
306 fl = self.linenostart
307 mw = len(str(lncount + fl - 1))
307 mw = len(str(lncount + fl - 1))
308 sp = self.linenospecial
308 sp = self.linenospecial
309 st = self.linenostep
309 st = self.linenostep
310 la = self.lineanchors
310 la = self.lineanchors
311 aln = self.anchorlinenos
311 aln = self.anchorlinenos
312 nocls = self.noclasses
312 nocls = self.noclasses
313 if sp:
313 if sp:
314 lines = []
314 lines = []
315
315
316 for i in range(fl, fl + lncount):
316 for i in range(fl, fl + lncount):
317 if i % st == 0:
317 if i % st == 0:
318 if i % sp == 0:
318 if i % sp == 0:
319 if aln:
319 if aln:
320 lines.append('<a href="#%s%d" class="special">%*d</a>' %
320 lines.append('<a href="#%s%d" class="special">%*d</a>' %
321 (la, i, mw, i))
321 (la, i, mw, i))
322 else:
322 else:
323 lines.append('<span class="special">%*d</span>' % (mw, i))
323 lines.append('<span class="special">%*d</span>' % (mw, i))
324 else:
324 else:
325 if aln:
325 if aln:
326 lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
326 lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
327 else:
327 else:
328 lines.append('%*d' % (mw, i))
328 lines.append('%*d' % (mw, i))
329 else:
329 else:
330 lines.append('')
330 lines.append('')
331 ls = '\n'.join(lines)
331 ls = '\n'.join(lines)
332 else:
332 else:
333 lines = []
333 lines = []
334 for i in range(fl, fl + lncount):
334 for i in range(fl, fl + lncount):
335 if i % st == 0:
335 if i % st == 0:
336 if aln:
336 if aln:
337 lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
337 lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
338 else:
338 else:
339 lines.append('%*d' % (mw, i))
339 lines.append('%*d' % (mw, i))
340 else:
340 else:
341 lines.append('')
341 lines.append('')
342 ls = '\n'.join(lines)
342 ls = '\n'.join(lines)
343
343
344 # in case you wonder about the seemingly redundant <div> here: since the
344 # in case you wonder about the seemingly redundant <div> here: since the
345 # content in the other cell also is wrapped in a div, some browsers in
345 # content in the other cell also is wrapped in a div, some browsers in
346 # some configurations seem to mess up the formatting...
346 # some configurations seem to mess up the formatting...
347 if nocls:
347 if nocls:
348 yield 0, ('<table class="%stable">' % self.cssclass +
348 yield 0, ('<table class="%stable">' % self.cssclass +
349 '<tr><td><div class="linenodiv" '
349 '<tr><td><div class="linenodiv" '
350 'style="background-color: #f0f0f0; padding-right: 10px">'
350 'style="background-color: #f0f0f0; padding-right: 10px">'
351 '<pre style="line-height: 125%">' +
351 '<pre style="line-height: 125%">' +
352 ls + '</pre></div></td><td id="hlcode" class="code">')
352 ls + '</pre></div></td><td id="hlcode" class="code">')
353 else:
353 else:
354 yield 0, ('<table class="%stable">' % self.cssclass +
354 yield 0, ('<table class="%stable">' % self.cssclass +
355 '<tr><td class="linenos"><div class="linenodiv"><pre>' +
355 '<tr><td class="linenos"><div class="linenodiv"><pre>' +
356 ls + '</pre></div></td><td id="hlcode" class="code">')
356 ls + '</pre></div></td><td id="hlcode" class="code">')
357 yield 0, dummyoutfile.getvalue()
357 yield 0, dummyoutfile.getvalue()
358 yield 0, '</td></tr></table>'
358 yield 0, '</td></tr></table>'
359
359
360
360
361 class SearchContentCodeHtmlFormatter(CodeHtmlFormatter):
361 class SearchContentCodeHtmlFormatter(CodeHtmlFormatter):
362 def __init__(self, **kw):
362 def __init__(self, **kw):
363 # only show these line numbers if set
363 # only show these line numbers if set
364 self.only_lines = kw.pop('only_line_numbers', [])
364 self.only_lines = kw.pop('only_line_numbers', [])
365 self.query_terms = kw.pop('query_terms', [])
365 self.query_terms = kw.pop('query_terms', [])
366 self.max_lines = kw.pop('max_lines', 5)
366 self.max_lines = kw.pop('max_lines', 5)
367 self.line_context = kw.pop('line_context', 3)
367 self.line_context = kw.pop('line_context', 3)
368 self.url = kw.pop('url', None)
368 self.url = kw.pop('url', None)
369
369
370 super(CodeHtmlFormatter, self).__init__(**kw)
370 super(CodeHtmlFormatter, self).__init__(**kw)
371
371
372 def _wrap_code(self, source):
372 def _wrap_code(self, source):
373 for cnt, it in enumerate(source):
373 for cnt, it in enumerate(source):
374 i, t = it
374 i, t = it
375 t = '<pre>%s</pre>' % t
375 t = '<pre>%s</pre>' % t
376 yield i, t
376 yield i, t
377
377
378 def _wrap_tablelinenos(self, inner):
378 def _wrap_tablelinenos(self, inner):
379 yield 0, '<table class="code-highlight %stable">' % self.cssclass
379 yield 0, '<table class="code-highlight %stable">' % self.cssclass
380
380
381 last_shown_line_number = 0
381 last_shown_line_number = 0
382 current_line_number = 1
382 current_line_number = 1
383
383
384 for t, line in inner:
384 for t, line in inner:
385 if not t:
385 if not t:
386 yield t, line
386 yield t, line
387 continue
387 continue
388
388
389 if current_line_number in self.only_lines:
389 if current_line_number in self.only_lines:
390 if last_shown_line_number + 1 != current_line_number:
390 if last_shown_line_number + 1 != current_line_number:
391 yield 0, '<tr>'
391 yield 0, '<tr>'
392 yield 0, '<td class="line">...</td>'
392 yield 0, '<td class="line">...</td>'
393 yield 0, '<td id="hlcode" class="code"></td>'
393 yield 0, '<td id="hlcode" class="code"></td>'
394 yield 0, '</tr>'
394 yield 0, '</tr>'
395
395
396 yield 0, '<tr>'
396 yield 0, '<tr>'
397 if self.url:
397 if self.url:
398 yield 0, '<td class="line"><a href="%s#L%i">%i</a></td>' % (
398 yield 0, '<td class="line"><a href="%s#L%i">%i</a></td>' % (
399 self.url, current_line_number, current_line_number)
399 self.url, current_line_number, current_line_number)
400 else:
400 else:
401 yield 0, '<td class="line"><a href="">%i</a></td>' % (
401 yield 0, '<td class="line"><a href="">%i</a></td>' % (
402 current_line_number)
402 current_line_number)
403 yield 0, '<td id="hlcode" class="code">' + line + '</td>'
403 yield 0, '<td id="hlcode" class="code">' + line + '</td>'
404 yield 0, '</tr>'
404 yield 0, '</tr>'
405
405
406 last_shown_line_number = current_line_number
406 last_shown_line_number = current_line_number
407
407
408 current_line_number += 1
408 current_line_number += 1
409
409
410
410
411 yield 0, '</table>'
411 yield 0, '</table>'
412
412
413
413
414 def extract_phrases(text_query):
414 def extract_phrases(text_query):
415 """
415 """
416 Extracts phrases from search term string making sure phrases
416 Extracts phrases from search term string making sure phrases
417 contained in double quotes are kept together - and discarding empty values
417 contained in double quotes are kept together - and discarding empty values
418 or fully whitespace values eg.
418 or fully whitespace values eg.
419
419
420 'some text "a phrase" more' => ['some', 'text', 'a phrase', 'more']
420 'some text "a phrase" more' => ['some', 'text', 'a phrase', 'more']
421
421
422 """
422 """
423
423
424 in_phrase = False
424 in_phrase = False
425 buf = ''
425 buf = ''
426 phrases = []
426 phrases = []
427 for char in text_query:
427 for char in text_query:
428 if in_phrase:
428 if in_phrase:
429 if char == '"': # end phrase
429 if char == '"': # end phrase
430 phrases.append(buf)
430 phrases.append(buf)
431 buf = ''
431 buf = ''
432 in_phrase = False
432 in_phrase = False
433 continue
433 continue
434 else:
434 else:
435 buf += char
435 buf += char
436 continue
436 continue
437 else:
437 else:
438 if char == '"': # start phrase
438 if char == '"': # start phrase
439 in_phrase = True
439 in_phrase = True
440 phrases.append(buf)
440 phrases.append(buf)
441 buf = ''
441 buf = ''
442 continue
442 continue
443 elif char == ' ':
443 elif char == ' ':
444 phrases.append(buf)
444 phrases.append(buf)
445 buf = ''
445 buf = ''
446 continue
446 continue
447 else:
447 else:
448 buf += char
448 buf += char
449
449
450 phrases.append(buf)
450 phrases.append(buf)
451 phrases = [phrase.strip() for phrase in phrases if phrase.strip()]
451 phrases = [phrase.strip() for phrase in phrases if phrase.strip()]
452 return phrases
452 return phrases
453
453
454
454
455 def get_matching_offsets(text, phrases):
455 def get_matching_offsets(text, phrases):
456 """
456 """
457 Returns a list of string offsets in `text` that the list of `terms` match
457 Returns a list of string offsets in `text` that the list of `terms` match
458
458
459 >>> get_matching_offsets('some text here', ['some', 'here'])
459 >>> get_matching_offsets('some text here', ['some', 'here'])
460 [(0, 4), (10, 14)]
460 [(0, 4), (10, 14)]
461
461
462 """
462 """
463 offsets = []
463 offsets = []
464 for phrase in phrases:
464 for phrase in phrases:
465 for match in re.finditer(phrase, text):
465 for match in re.finditer(phrase, text):
466 offsets.append((match.start(), match.end()))
466 offsets.append((match.start(), match.end()))
467
467
468 return offsets
468 return offsets
469
469
470
470
471 def normalize_text_for_matching(x):
471 def normalize_text_for_matching(x):
472 """
472 """
473 Replaces all non alnum characters to spaces and lower cases the string,
473 Replaces all non alnum characters to spaces and lower cases the string,
474 useful for comparing two text strings without punctuation
474 useful for comparing two text strings without punctuation
475 """
475 """
476 return re.sub(r'[^\w]', ' ', x.lower())
476 return re.sub(r'[^\w]', ' ', x.lower())
477
477
478
478
479 def get_matching_line_offsets(lines, terms):
479 def get_matching_line_offsets(lines, terms):
480 """ Return a set of `lines` indices (starting from 1) matching a
480 """ Return a set of `lines` indices (starting from 1) matching a
481 text search query, along with `context` lines above/below matching lines
481 text search query, along with `context` lines above/below matching lines
482
482
483 :param lines: list of strings representing lines
483 :param lines: list of strings representing lines
484 :param terms: search term string to match in lines eg. 'some text'
484 :param terms: search term string to match in lines eg. 'some text'
485 :param context: number of lines above/below a matching line to add to result
485 :param context: number of lines above/below a matching line to add to result
486 :param max_lines: cut off for lines of interest
486 :param max_lines: cut off for lines of interest
487 eg.
487 eg.
488
488
489 text = '''
489 text = '''
490 words words words
490 words words words
491 words words words
491 words words words
492 some text some
492 some text some
493 words words words
493 words words words
494 words words words
494 words words words
495 text here what
495 text here what
496 '''
496 '''
497 get_matching_line_offsets(text, 'text', context=1)
497 get_matching_line_offsets(text, 'text', context=1)
498 {3: [(5, 9)], 6: [(0, 4)]]
498 {3: [(5, 9)], 6: [(0, 4)]]
499
499
500 """
500 """
501 matching_lines = {}
501 matching_lines = {}
502 phrases = [normalize_text_for_matching(phrase)
502 phrases = [normalize_text_for_matching(phrase)
503 for phrase in extract_phrases(terms)]
503 for phrase in extract_phrases(terms)]
504
504
505 for line_index, line in enumerate(lines, start=1):
505 for line_index, line in enumerate(lines, start=1):
506 match_offsets = get_matching_offsets(
506 match_offsets = get_matching_offsets(
507 normalize_text_for_matching(line), phrases)
507 normalize_text_for_matching(line), phrases)
508 if match_offsets:
508 if match_offsets:
509 matching_lines[line_index] = match_offsets
509 matching_lines[line_index] = match_offsets
510
510
511 return matching_lines
511 return matching_lines
512
512
513
513
514 def hsv_to_rgb(h, s, v):
514 def hsv_to_rgb(h, s, v):
515 """ Convert hsv color values to rgb """
515 """ Convert hsv color values to rgb """
516
516
517 if s == 0.0:
517 if s == 0.0:
518 return v, v, v
518 return v, v, v
519 i = int(h * 6.0) # XXX assume int() truncates!
519 i = int(h * 6.0) # XXX assume int() truncates!
520 f = (h * 6.0) - i
520 f = (h * 6.0) - i
521 p = v * (1.0 - s)
521 p = v * (1.0 - s)
522 q = v * (1.0 - s * f)
522 q = v * (1.0 - s * f)
523 t = v * (1.0 - s * (1.0 - f))
523 t = v * (1.0 - s * (1.0 - f))
524 i = i % 6
524 i = i % 6
525 if i == 0:
525 if i == 0:
526 return v, t, p
526 return v, t, p
527 if i == 1:
527 if i == 1:
528 return q, v, p
528 return q, v, p
529 if i == 2:
529 if i == 2:
530 return p, v, t
530 return p, v, t
531 if i == 3:
531 if i == 3:
532 return p, q, v
532 return p, q, v
533 if i == 4:
533 if i == 4:
534 return t, p, v
534 return t, p, v
535 if i == 5:
535 if i == 5:
536 return v, p, q
536 return v, p, q
537
537
538
538
539 def unique_color_generator(n=10000, saturation=0.10, lightness=0.95):
539 def unique_color_generator(n=10000, saturation=0.10, lightness=0.95):
540 """
540 """
541 Generator for getting n of evenly distributed colors using
541 Generator for getting n of evenly distributed colors using
542 hsv color and golden ratio. It always return same order of colors
542 hsv color and golden ratio. It always return same order of colors
543
543
544 :param n: number of colors to generate
544 :param n: number of colors to generate
545 :param saturation: saturation of returned colors
545 :param saturation: saturation of returned colors
546 :param lightness: lightness of returned colors
546 :param lightness: lightness of returned colors
547 :returns: RGB tuple
547 :returns: RGB tuple
548 """
548 """
549
549
550 golden_ratio = 0.618033988749895
550 golden_ratio = 0.618033988749895
551 h = 0.22717784590367374
551 h = 0.22717784590367374
552
552
553 for _ in xrange(n):
553 for _ in xrange(n):
554 h += golden_ratio
554 h += golden_ratio
555 h %= 1
555 h %= 1
556 HSV_tuple = [h, saturation, lightness]
556 HSV_tuple = [h, saturation, lightness]
557 RGB_tuple = hsv_to_rgb(*HSV_tuple)
557 RGB_tuple = hsv_to_rgb(*HSV_tuple)
558 yield map(lambda x: str(int(x * 256)), RGB_tuple)
558 yield map(lambda x: str(int(x * 256)), RGB_tuple)
559
559
560
560
561 def color_hasher(n=10000, saturation=0.10, lightness=0.95):
561 def color_hasher(n=10000, saturation=0.10, lightness=0.95):
562 """
562 """
563 Returns a function which when called with an argument returns a unique
563 Returns a function which when called with an argument returns a unique
564 color for that argument, eg.
564 color for that argument, eg.
565
565
566 :param n: number of colors to generate
566 :param n: number of colors to generate
567 :param saturation: saturation of returned colors
567 :param saturation: saturation of returned colors
568 :param lightness: lightness of returned colors
568 :param lightness: lightness of returned colors
569 :returns: css RGB string
569 :returns: css RGB string
570
570
571 >>> color_hash = color_hasher()
571 >>> color_hash = color_hasher()
572 >>> color_hash('hello')
572 >>> color_hash('hello')
573 'rgb(34, 12, 59)'
573 'rgb(34, 12, 59)'
574 >>> color_hash('hello')
574 >>> color_hash('hello')
575 'rgb(34, 12, 59)'
575 'rgb(34, 12, 59)'
576 >>> color_hash('other')
576 >>> color_hash('other')
577 'rgb(90, 224, 159)'
577 'rgb(90, 224, 159)'
578 """
578 """
579
579
580 color_dict = {}
580 color_dict = {}
581 cgenerator = unique_color_generator(
581 cgenerator = unique_color_generator(
582 saturation=saturation, lightness=lightness)
582 saturation=saturation, lightness=lightness)
583
583
584 def get_color_string(thing):
584 def get_color_string(thing):
585 if thing in color_dict:
585 if thing in color_dict:
586 col = color_dict[thing]
586 col = color_dict[thing]
587 else:
587 else:
588 col = color_dict[thing] = cgenerator.next()
588 col = color_dict[thing] = cgenerator.next()
589 return "rgb(%s)" % (', '.join(col))
589 return "rgb(%s)" % (', '.join(col))
590
590
591 return get_color_string
591 return get_color_string
592
592
593
593
594 def get_lexer_safe(mimetype=None, filepath=None):
594 def get_lexer_safe(mimetype=None, filepath=None):
595 """
595 """
596 Tries to return a relevant pygments lexer using mimetype/filepath name,
596 Tries to return a relevant pygments lexer using mimetype/filepath name,
597 defaulting to plain text if none could be found
597 defaulting to plain text if none could be found
598 """
598 """
599 lexer = None
599 lexer = None
600 try:
600 try:
601 if mimetype:
601 if mimetype:
602 lexer = get_lexer_for_mimetype(mimetype)
602 lexer = get_lexer_for_mimetype(mimetype)
603 if not lexer:
603 if not lexer:
604 lexer = get_lexer_for_filename(filepath)
604 lexer = get_lexer_for_filename(filepath)
605 except pygments.util.ClassNotFound:
605 except pygments.util.ClassNotFound:
606 pass
606 pass
607
607
608 if not lexer:
608 if not lexer:
609 lexer = get_lexer_by_name('text')
609 lexer = get_lexer_by_name('text')
610
610
611 return lexer
611 return lexer
612
612
613
613
614 def get_lexer_for_filenode(filenode):
614 def get_lexer_for_filenode(filenode):
615 lexer = get_custom_lexer(filenode.extension) or filenode.lexer
615 lexer = get_custom_lexer(filenode.extension) or filenode.lexer
616 return lexer
616 return lexer
617
617
618
618
619 def pygmentize(filenode, **kwargs):
619 def pygmentize(filenode, **kwargs):
620 """
620 """
621 pygmentize function using pygments
621 pygmentize function using pygments
622
622
623 :param filenode:
623 :param filenode:
624 """
624 """
625 lexer = get_lexer_for_filenode(filenode)
625 lexer = get_lexer_for_filenode(filenode)
626 return literal(code_highlight(filenode.content, lexer,
626 return literal(code_highlight(filenode.content, lexer,
627 CodeHtmlFormatter(**kwargs)))
627 CodeHtmlFormatter(**kwargs)))
628
628
629
629
630 def is_following_repo(repo_name, user_id):
630 def is_following_repo(repo_name, user_id):
631 from rhodecode.model.scm import ScmModel
631 from rhodecode.model.scm import ScmModel
632 return ScmModel().is_following_repo(repo_name, user_id)
632 return ScmModel().is_following_repo(repo_name, user_id)
633
633
634
634
635 class _Message(object):
635 class _Message(object):
636 """A message returned by ``Flash.pop_messages()``.
636 """A message returned by ``Flash.pop_messages()``.
637
637
638 Converting the message to a string returns the message text. Instances
638 Converting the message to a string returns the message text. Instances
639 also have the following attributes:
639 also have the following attributes:
640
640
641 * ``message``: the message text.
641 * ``message``: the message text.
642 * ``category``: the category specified when the message was created.
642 * ``category``: the category specified when the message was created.
643 """
643 """
644
644
645 def __init__(self, category, message):
645 def __init__(self, category, message):
646 self.category = category
646 self.category = category
647 self.message = message
647 self.message = message
648
648
649 def __str__(self):
649 def __str__(self):
650 return self.message
650 return self.message
651
651
652 __unicode__ = __str__
652 __unicode__ = __str__
653
653
654 def __html__(self):
654 def __html__(self):
655 return escape(safe_unicode(self.message))
655 return escape(safe_unicode(self.message))
656
656
657
657
658 class Flash(_Flash):
658 class Flash(_Flash):
659
659
660 def pop_messages(self):
660 def pop_messages(self):
661 """Return all accumulated messages and delete them from the session.
661 """Return all accumulated messages and delete them from the session.
662
662
663 The return value is a list of ``Message`` objects.
663 The return value is a list of ``Message`` objects.
664 """
664 """
665 from pylons import session
665 from pylons import session
666
666
667 messages = []
667 messages = []
668
668
669 # Pop the 'old' pylons flash messages. They are tuples of the form
669 # Pop the 'old' pylons flash messages. They are tuples of the form
670 # (category, message)
670 # (category, message)
671 for cat, msg in session.pop(self.session_key, []):
671 for cat, msg in session.pop(self.session_key, []):
672 messages.append(_Message(cat, msg))
672 messages.append(_Message(cat, msg))
673
673
674 # Pop the 'new' pyramid flash messages for each category as list
674 # Pop the 'new' pyramid flash messages for each category as list
675 # of strings.
675 # of strings.
676 for cat in self.categories:
676 for cat in self.categories:
677 for msg in session.pop_flash(queue=cat):
677 for msg in session.pop_flash(queue=cat):
678 messages.append(_Message(cat, msg))
678 messages.append(_Message(cat, msg))
679 # Map messages from the default queue to the 'notice' category.
679 # Map messages from the default queue to the 'notice' category.
680 for msg in session.pop_flash():
680 for msg in session.pop_flash():
681 messages.append(_Message('notice', msg))
681 messages.append(_Message('notice', msg))
682
682
683 session.save()
683 session.save()
684 return messages
684 return messages
685
685
686 def json_alerts(self):
686 def json_alerts(self):
687 payloads = []
687 payloads = []
688 messages = flash.pop_messages()
688 messages = flash.pop_messages()
689 if messages:
689 if messages:
690 for message in messages:
690 for message in messages:
691 subdata = {}
691 subdata = {}
692 if hasattr(message.message, 'rsplit'):
692 if hasattr(message.message, 'rsplit'):
693 flash_data = message.message.rsplit('|DELIM|', 1)
693 flash_data = message.message.rsplit('|DELIM|', 1)
694 org_message = flash_data[0]
694 org_message = flash_data[0]
695 if len(flash_data) > 1:
695 if len(flash_data) > 1:
696 subdata = json.loads(flash_data[1])
696 subdata = json.loads(flash_data[1])
697 else:
697 else:
698 org_message = message.message
698 org_message = message.message
699 payloads.append({
699 payloads.append({
700 'message': {
700 'message': {
701 'message': u'{}'.format(org_message),
701 'message': u'{}'.format(org_message),
702 'level': message.category,
702 'level': message.category,
703 'force': True,
703 'force': True,
704 'subdata': subdata
704 'subdata': subdata
705 }
705 }
706 })
706 })
707 return json.dumps(payloads)
707 return json.dumps(payloads)
708
708
709 flash = Flash()
709 flash = Flash()
710
710
711 #==============================================================================
711 #==============================================================================
712 # SCM FILTERS available via h.
712 # SCM FILTERS available via h.
713 #==============================================================================
713 #==============================================================================
714 from rhodecode.lib.vcs.utils import author_name, author_email
714 from rhodecode.lib.vcs.utils import author_name, author_email
715 from rhodecode.lib.utils2 import credentials_filter, age as _age
715 from rhodecode.lib.utils2 import credentials_filter, age as _age
716 from rhodecode.model.db import User, ChangesetStatus
716 from rhodecode.model.db import User, ChangesetStatus
717
717
718 age = _age
718 age = _age
719 capitalize = lambda x: x.capitalize()
719 capitalize = lambda x: x.capitalize()
720 email = author_email
720 email = author_email
721 short_id = lambda x: x[:12]
721 short_id = lambda x: x[:12]
722 hide_credentials = lambda x: ''.join(credentials_filter(x))
722 hide_credentials = lambda x: ''.join(credentials_filter(x))
723
723
724
724
725 def age_component(datetime_iso, value=None, time_is_local=False):
725 def age_component(datetime_iso, value=None, time_is_local=False):
726 title = value or format_date(datetime_iso)
726 title = value or format_date(datetime_iso)
727 tzinfo = '+00:00'
727 tzinfo = '+00:00'
728
728
729 # detect if we have a timezone info, otherwise, add it
729 # detect if we have a timezone info, otherwise, add it
730 if isinstance(datetime_iso, datetime) and not datetime_iso.tzinfo:
730 if isinstance(datetime_iso, datetime) and not datetime_iso.tzinfo:
731 if time_is_local:
731 if time_is_local:
732 tzinfo = time.strftime("+%H:%M",
732 tzinfo = time.strftime("+%H:%M",
733 time.gmtime(
733 time.gmtime(
734 (datetime.now() - datetime.utcnow()).seconds + 1
734 (datetime.now() - datetime.utcnow()).seconds + 1
735 )
735 )
736 )
736 )
737
737
738 return literal(
738 return literal(
739 '<time class="timeago tooltip" '
739 '<time class="timeago tooltip" '
740 'title="{1}{2}" datetime="{0}{2}">{1}</time>'.format(
740 'title="{1}{2}" datetime="{0}{2}">{1}</time>'.format(
741 datetime_iso, title, tzinfo))
741 datetime_iso, title, tzinfo))
742
742
743
743
744 def _shorten_commit_id(commit_id):
744 def _shorten_commit_id(commit_id):
745 from rhodecode import CONFIG
745 from rhodecode import CONFIG
746 def_len = safe_int(CONFIG.get('rhodecode_show_sha_length', 12))
746 def_len = safe_int(CONFIG.get('rhodecode_show_sha_length', 12))
747 return commit_id[:def_len]
747 return commit_id[:def_len]
748
748
749
749
750 def show_id(commit):
750 def show_id(commit):
751 """
751 """
752 Configurable function that shows ID
752 Configurable function that shows ID
753 by default it's r123:fffeeefffeee
753 by default it's r123:fffeeefffeee
754
754
755 :param commit: commit instance
755 :param commit: commit instance
756 """
756 """
757 from rhodecode import CONFIG
757 from rhodecode import CONFIG
758 show_idx = str2bool(CONFIG.get('rhodecode_show_revision_number', True))
758 show_idx = str2bool(CONFIG.get('rhodecode_show_revision_number', True))
759
759
760 raw_id = _shorten_commit_id(commit.raw_id)
760 raw_id = _shorten_commit_id(commit.raw_id)
761 if show_idx:
761 if show_idx:
762 return 'r%s:%s' % (commit.idx, raw_id)
762 return 'r%s:%s' % (commit.idx, raw_id)
763 else:
763 else:
764 return '%s' % (raw_id, )
764 return '%s' % (raw_id, )
765
765
766
766
767 def format_date(date):
767 def format_date(date):
768 """
768 """
769 use a standardized formatting for dates used in RhodeCode
769 use a standardized formatting for dates used in RhodeCode
770
770
771 :param date: date/datetime object
771 :param date: date/datetime object
772 :return: formatted date
772 :return: formatted date
773 """
773 """
774
774
775 if date:
775 if date:
776 _fmt = "%a, %d %b %Y %H:%M:%S"
776 _fmt = "%a, %d %b %Y %H:%M:%S"
777 return safe_unicode(date.strftime(_fmt))
777 return safe_unicode(date.strftime(_fmt))
778
778
779 return u""
779 return u""
780
780
781
781
782 class _RepoChecker(object):
782 class _RepoChecker(object):
783
783
784 def __init__(self, backend_alias):
784 def __init__(self, backend_alias):
785 self._backend_alias = backend_alias
785 self._backend_alias = backend_alias
786
786
787 def __call__(self, repository):
787 def __call__(self, repository):
788 if hasattr(repository, 'alias'):
788 if hasattr(repository, 'alias'):
789 _type = repository.alias
789 _type = repository.alias
790 elif hasattr(repository, 'repo_type'):
790 elif hasattr(repository, 'repo_type'):
791 _type = repository.repo_type
791 _type = repository.repo_type
792 else:
792 else:
793 _type = repository
793 _type = repository
794 return _type == self._backend_alias
794 return _type == self._backend_alias
795
795
796 is_git = _RepoChecker('git')
796 is_git = _RepoChecker('git')
797 is_hg = _RepoChecker('hg')
797 is_hg = _RepoChecker('hg')
798 is_svn = _RepoChecker('svn')
798 is_svn = _RepoChecker('svn')
799
799
800
800
801 def get_repo_type_by_name(repo_name):
801 def get_repo_type_by_name(repo_name):
802 repo = Repository.get_by_repo_name(repo_name)
802 repo = Repository.get_by_repo_name(repo_name)
803 return repo.repo_type
803 return repo.repo_type
804
804
805
805
806 def is_svn_without_proxy(repository):
806 def is_svn_without_proxy(repository):
807 if is_svn(repository):
807 if is_svn(repository):
808 from rhodecode.model.settings import VcsSettingsModel
808 from rhodecode.model.settings import VcsSettingsModel
809 conf = VcsSettingsModel().get_ui_settings_as_config_obj()
809 conf = VcsSettingsModel().get_ui_settings_as_config_obj()
810 return not str2bool(conf.get('vcs_svn_proxy', 'http_requests_enabled'))
810 return not str2bool(conf.get('vcs_svn_proxy', 'http_requests_enabled'))
811 return False
811 return False
812
812
813
813
814 def discover_user(author):
814 def discover_user(author):
815 """
815 """
816 Tries to discover RhodeCode User based on the autho string. Author string
816 Tries to discover RhodeCode User based on the autho string. Author string
817 is typically `FirstName LastName <email@address.com>`
817 is typically `FirstName LastName <email@address.com>`
818 """
818 """
819
819
820 # if author is already an instance use it for extraction
820 # if author is already an instance use it for extraction
821 if isinstance(author, User):
821 if isinstance(author, User):
822 return author
822 return author
823
823
824 # Valid email in the attribute passed, see if they're in the system
824 # Valid email in the attribute passed, see if they're in the system
825 _email = author_email(author)
825 _email = author_email(author)
826 if _email != '':
826 if _email != '':
827 user = User.get_by_email(_email, case_insensitive=True, cache=True)
827 user = User.get_by_email(_email, case_insensitive=True, cache=True)
828 if user is not None:
828 if user is not None:
829 return user
829 return user
830
830
831 # Maybe it's a username, we try to extract it and fetch by username ?
831 # Maybe it's a username, we try to extract it and fetch by username ?
832 _author = author_name(author)
832 _author = author_name(author)
833 user = User.get_by_username(_author, case_insensitive=True, cache=True)
833 user = User.get_by_username(_author, case_insensitive=True, cache=True)
834 if user is not None:
834 if user is not None:
835 return user
835 return user
836
836
837 return None
837 return None
838
838
839
839
840 def email_or_none(author):
840 def email_or_none(author):
841 # extract email from the commit string
841 # extract email from the commit string
842 _email = author_email(author)
842 _email = author_email(author)
843
843
844 # If we have an email, use it, otherwise
844 # If we have an email, use it, otherwise
845 # see if it contains a username we can get an email from
845 # see if it contains a username we can get an email from
846 if _email != '':
846 if _email != '':
847 return _email
847 return _email
848 else:
848 else:
849 user = User.get_by_username(
849 user = User.get_by_username(
850 author_name(author), case_insensitive=True, cache=True)
850 author_name(author), case_insensitive=True, cache=True)
851
851
852 if user is not None:
852 if user is not None:
853 return user.email
853 return user.email
854
854
855 # No valid email, not a valid user in the system, none!
855 # No valid email, not a valid user in the system, none!
856 return None
856 return None
857
857
858
858
859 def link_to_user(author, length=0, **kwargs):
859 def link_to_user(author, length=0, **kwargs):
860 user = discover_user(author)
860 user = discover_user(author)
861 # user can be None, but if we have it already it means we can re-use it
861 # user can be None, but if we have it already it means we can re-use it
862 # in the person() function, so we save 1 intensive-query
862 # in the person() function, so we save 1 intensive-query
863 if user:
863 if user:
864 author = user
864 author = user
865
865
866 display_person = person(author, 'username_or_name_or_email')
866 display_person = person(author, 'username_or_name_or_email')
867 if length:
867 if length:
868 display_person = shorter(display_person, length)
868 display_person = shorter(display_person, length)
869
869
870 if user:
870 if user:
871 return link_to(
871 return link_to(
872 escape(display_person),
872 escape(display_person),
873 url('user_profile', username=user.username),
873 url('user_profile', username=user.username),
874 **kwargs)
874 **kwargs)
875 else:
875 else:
876 return escape(display_person)
876 return escape(display_person)
877
877
878
878
879 def person(author, show_attr="username_and_name"):
879 def person(author, show_attr="username_and_name"):
880 user = discover_user(author)
880 user = discover_user(author)
881 if user:
881 if user:
882 return getattr(user, show_attr)
882 return getattr(user, show_attr)
883 else:
883 else:
884 _author = author_name(author)
884 _author = author_name(author)
885 _email = email(author)
885 _email = email(author)
886 return _author or _email
886 return _author or _email
887
887
888
888
889 def author_string(email):
889 def author_string(email):
890 if email:
890 if email:
891 user = User.get_by_email(email, case_insensitive=True, cache=True)
891 user = User.get_by_email(email, case_insensitive=True, cache=True)
892 if user:
892 if user:
893 if user.firstname or user.lastname:
893 if user.firstname or user.lastname:
894 return '%s %s &lt;%s&gt;' % (user.firstname, user.lastname, email)
894 return '%s %s &lt;%s&gt;' % (user.firstname, user.lastname, email)
895 else:
895 else:
896 return email
896 return email
897 else:
897 else:
898 return email
898 return email
899 else:
899 else:
900 return None
900 return None
901
901
902
902
903 def person_by_id(id_, show_attr="username_and_name"):
903 def person_by_id(id_, show_attr="username_and_name"):
904 # attr to return from fetched user
904 # attr to return from fetched user
905 person_getter = lambda usr: getattr(usr, show_attr)
905 person_getter = lambda usr: getattr(usr, show_attr)
906
906
907 #maybe it's an ID ?
907 #maybe it's an ID ?
908 if str(id_).isdigit() or isinstance(id_, int):
908 if str(id_).isdigit() or isinstance(id_, int):
909 id_ = int(id_)
909 id_ = int(id_)
910 user = User.get(id_)
910 user = User.get(id_)
911 if user is not None:
911 if user is not None:
912 return person_getter(user)
912 return person_getter(user)
913 return id_
913 return id_
914
914
915
915
916 def gravatar_with_user(author, show_disabled=False):
916 def gravatar_with_user(author, show_disabled=False):
917 from rhodecode.lib.utils import PartialRenderer
917 from rhodecode.lib.utils import PartialRenderer
918 _render = PartialRenderer('base/base.mako')
918 _render = PartialRenderer('base/base.mako')
919 return _render('gravatar_with_user', author, show_disabled=show_disabled)
919 return _render('gravatar_with_user', author, show_disabled=show_disabled)
920
920
921
921
922 def desc_stylize(value):
922 def desc_stylize(value):
923 """
923 """
924 converts tags from value into html equivalent
924 converts tags from value into html equivalent
925
925
926 :param value:
926 :param value:
927 """
927 """
928 if not value:
928 if not value:
929 return ''
929 return ''
930
930
931 value = re.sub(r'\[see\ \=\>\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
931 value = re.sub(r'\[see\ \=\>\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
932 '<div class="metatag" tag="see">see =&gt; \\1 </div>', value)
932 '<div class="metatag" tag="see">see =&gt; \\1 </div>', value)
933 value = re.sub(r'\[license\ \=\>\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
933 value = re.sub(r'\[license\ \=\>\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
934 '<div class="metatag" tag="license"><a href="http:\/\/www.opensource.org/licenses/\\1">\\1</a></div>', value)
934 '<div class="metatag" tag="license"><a href="http:\/\/www.opensource.org/licenses/\\1">\\1</a></div>', value)
935 value = re.sub(r'\[(requires|recommends|conflicts|base)\ \=\>\ *([a-zA-Z0-9\-\/]*)\]',
935 value = re.sub(r'\[(requires|recommends|conflicts|base)\ \=\>\ *([a-zA-Z0-9\-\/]*)\]',
936 '<div class="metatag" tag="\\1">\\1 =&gt; <a href="/\\2">\\2</a></div>', value)
936 '<div class="metatag" tag="\\1">\\1 =&gt; <a href="/\\2">\\2</a></div>', value)
937 value = re.sub(r'\[(lang|language)\ \=\>\ *([a-zA-Z\-\/\#\+]*)\]',
937 value = re.sub(r'\[(lang|language)\ \=\>\ *([a-zA-Z\-\/\#\+]*)\]',
938 '<div class="metatag" tag="lang">\\2</div>', value)
938 '<div class="metatag" tag="lang">\\2</div>', value)
939 value = re.sub(r'\[([a-z]+)\]',
939 value = re.sub(r'\[([a-z]+)\]',
940 '<div class="metatag" tag="\\1">\\1</div>', value)
940 '<div class="metatag" tag="\\1">\\1</div>', value)
941
941
942 return value
942 return value
943
943
944
944
945 def escaped_stylize(value):
945 def escaped_stylize(value):
946 """
946 """
947 converts tags from value into html equivalent, but escaping its value first
947 converts tags from value into html equivalent, but escaping its value first
948 """
948 """
949 if not value:
949 if not value:
950 return ''
950 return ''
951
951
952 # Using default webhelper escape method, but has to force it as a
952 # Using default webhelper escape method, but has to force it as a
953 # plain unicode instead of a markup tag to be used in regex expressions
953 # plain unicode instead of a markup tag to be used in regex expressions
954 value = unicode(escape(safe_unicode(value)))
954 value = unicode(escape(safe_unicode(value)))
955
955
956 value = re.sub(r'\[see\ \=\&gt;\ *([a-zA-Z0-9\/\=\?\&amp;\ \:\/\.\-]*)\]',
956 value = re.sub(r'\[see\ \=\&gt;\ *([a-zA-Z0-9\/\=\?\&amp;\ \:\/\.\-]*)\]',
957 '<div class="metatag" tag="see">see =&gt; \\1 </div>', value)
957 '<div class="metatag" tag="see">see =&gt; \\1 </div>', value)
958 value = re.sub(r'\[license\ \=\&gt;\ *([a-zA-Z0-9\/\=\?\&amp;\ \:\/\.\-]*)\]',
958 value = re.sub(r'\[license\ \=\&gt;\ *([a-zA-Z0-9\/\=\?\&amp;\ \:\/\.\-]*)\]',
959 '<div class="metatag" tag="license"><a href="http:\/\/www.opensource.org/licenses/\\1">\\1</a></div>', value)
959 '<div class="metatag" tag="license"><a href="http:\/\/www.opensource.org/licenses/\\1">\\1</a></div>', value)
960 value = re.sub(r'\[(requires|recommends|conflicts|base)\ \=\&gt;\ *([a-zA-Z0-9\-\/]*)\]',
960 value = re.sub(r'\[(requires|recommends|conflicts|base)\ \=\&gt;\ *([a-zA-Z0-9\-\/]*)\]',
961 '<div class="metatag" tag="\\1">\\1 =&gt; <a href="/\\2">\\2</a></div>', value)
961 '<div class="metatag" tag="\\1">\\1 =&gt; <a href="/\\2">\\2</a></div>', value)
962 value = re.sub(r'\[(lang|language)\ \=\&gt;\ *([a-zA-Z\-\/\#\+]*)\]',
962 value = re.sub(r'\[(lang|language)\ \=\&gt;\ *([a-zA-Z\-\/\#\+]*)\]',
963 '<div class="metatag" tag="lang">\\2</div>', value)
963 '<div class="metatag" tag="lang">\\2</div>', value)
964 value = re.sub(r'\[([a-z]+)\]',
964 value = re.sub(r'\[([a-z]+)\]',
965 '<div class="metatag" tag="\\1">\\1</div>', value)
965 '<div class="metatag" tag="\\1">\\1</div>', value)
966
966
967 return value
967 return value
968
968
969
969
970 def bool2icon(value):
970 def bool2icon(value):
971 """
971 """
972 Returns boolean value of a given value, represented as html element with
972 Returns boolean value of a given value, represented as html element with
973 classes that will represent icons
973 classes that will represent icons
974
974
975 :param value: given value to convert to html node
975 :param value: given value to convert to html node
976 """
976 """
977
977
978 if value: # does bool conversion
978 if value: # does bool conversion
979 return HTML.tag('i', class_="icon-true")
979 return HTML.tag('i', class_="icon-true")
980 else: # not true as bool
980 else: # not true as bool
981 return HTML.tag('i', class_="icon-false")
981 return HTML.tag('i', class_="icon-false")
982
982
983
983
984 #==============================================================================
984 #==============================================================================
985 # PERMS
985 # PERMS
986 #==============================================================================
986 #==============================================================================
987 from rhodecode.lib.auth import HasPermissionAny, HasPermissionAll, \
987 from rhodecode.lib.auth import HasPermissionAny, HasPermissionAll, \
988 HasRepoPermissionAny, HasRepoPermissionAll, HasRepoGroupPermissionAll, \
988 HasRepoPermissionAny, HasRepoPermissionAll, HasRepoGroupPermissionAll, \
989 HasRepoGroupPermissionAny, HasRepoPermissionAnyApi, get_csrf_token, \
989 HasRepoGroupPermissionAny, HasRepoPermissionAnyApi, get_csrf_token, \
990 csrf_token_key
990 csrf_token_key
991
991
992
992
993 #==============================================================================
993 #==============================================================================
994 # GRAVATAR URL
994 # GRAVATAR URL
995 #==============================================================================
995 #==============================================================================
996 class InitialsGravatar(object):
996 class InitialsGravatar(object):
997 def __init__(self, email_address, first_name, last_name, size=30,
997 def __init__(self, email_address, first_name, last_name, size=30,
998 background=None, text_color='#fff'):
998 background=None, text_color='#fff'):
999 self.size = size
999 self.size = size
1000 self.first_name = first_name
1000 self.first_name = first_name
1001 self.last_name = last_name
1001 self.last_name = last_name
1002 self.email_address = email_address
1002 self.email_address = email_address
1003 self.background = background or self.str2color(email_address)
1003 self.background = background or self.str2color(email_address)
1004 self.text_color = text_color
1004 self.text_color = text_color
1005
1005
1006 def get_color_bank(self):
1006 def get_color_bank(self):
1007 """
1007 """
1008 returns a predefined list of colors that gravatars can use.
1008 returns a predefined list of colors that gravatars can use.
1009 Those are randomized distinct colors that guarantee readability and
1009 Those are randomized distinct colors that guarantee readability and
1010 uniqueness.
1010 uniqueness.
1011
1011
1012 generated with: http://phrogz.net/css/distinct-colors.html
1012 generated with: http://phrogz.net/css/distinct-colors.html
1013 """
1013 """
1014 return [
1014 return [
1015 '#bf3030', '#a67f53', '#00ff00', '#5989b3', '#392040', '#d90000',
1015 '#bf3030', '#a67f53', '#00ff00', '#5989b3', '#392040', '#d90000',
1016 '#402910', '#204020', '#79baf2', '#a700b3', '#bf6060', '#7f5320',
1016 '#402910', '#204020', '#79baf2', '#a700b3', '#bf6060', '#7f5320',
1017 '#008000', '#003059', '#ee00ff', '#ff0000', '#8c4b00', '#007300',
1017 '#008000', '#003059', '#ee00ff', '#ff0000', '#8c4b00', '#007300',
1018 '#005fb3', '#de73e6', '#ff4040', '#ffaa00', '#3df255', '#203140',
1018 '#005fb3', '#de73e6', '#ff4040', '#ffaa00', '#3df255', '#203140',
1019 '#47004d', '#591616', '#664400', '#59b365', '#0d2133', '#83008c',
1019 '#47004d', '#591616', '#664400', '#59b365', '#0d2133', '#83008c',
1020 '#592d2d', '#bf9f60', '#73e682', '#1d3f73', '#73006b', '#402020',
1020 '#592d2d', '#bf9f60', '#73e682', '#1d3f73', '#73006b', '#402020',
1021 '#b2862d', '#397341', '#597db3', '#e600d6', '#a60000', '#736039',
1021 '#b2862d', '#397341', '#597db3', '#e600d6', '#a60000', '#736039',
1022 '#00b318', '#79aaf2', '#330d30', '#ff8080', '#403010', '#16591f',
1022 '#00b318', '#79aaf2', '#330d30', '#ff8080', '#403010', '#16591f',
1023 '#002459', '#8c4688', '#e50000', '#ffbf40', '#00732e', '#102340',
1023 '#002459', '#8c4688', '#e50000', '#ffbf40', '#00732e', '#102340',
1024 '#bf60ac', '#8c4646', '#cc8800', '#00a642', '#1d3473', '#b32d98',
1024 '#bf60ac', '#8c4646', '#cc8800', '#00a642', '#1d3473', '#b32d98',
1025 '#660e00', '#ffd580', '#80ffb2', '#7391e6', '#733967', '#d97b6c',
1025 '#660e00', '#ffd580', '#80ffb2', '#7391e6', '#733967', '#d97b6c',
1026 '#8c5e00', '#59b389', '#3967e6', '#590047', '#73281d', '#665200',
1026 '#8c5e00', '#59b389', '#3967e6', '#590047', '#73281d', '#665200',
1027 '#00e67a', '#2d50b3', '#8c2377', '#734139', '#b2982d', '#16593a',
1027 '#00e67a', '#2d50b3', '#8c2377', '#734139', '#b2982d', '#16593a',
1028 '#001859', '#ff00aa', '#a65e53', '#ffcc00', '#0d3321', '#2d3959',
1028 '#001859', '#ff00aa', '#a65e53', '#ffcc00', '#0d3321', '#2d3959',
1029 '#731d56', '#401610', '#4c3d00', '#468c6c', '#002ca6', '#d936a3',
1029 '#731d56', '#401610', '#4c3d00', '#468c6c', '#002ca6', '#d936a3',
1030 '#d94c36', '#403920', '#36d9a3', '#0d1733', '#592d4a', '#993626',
1030 '#d94c36', '#403920', '#36d9a3', '#0d1733', '#592d4a', '#993626',
1031 '#cca300', '#00734d', '#46598c', '#8c005e', '#7f1100', '#8c7000',
1031 '#cca300', '#00734d', '#46598c', '#8c005e', '#7f1100', '#8c7000',
1032 '#00a66f', '#7382e6', '#b32d74', '#d9896c', '#ffe680', '#1d7362',
1032 '#00a66f', '#7382e6', '#b32d74', '#d9896c', '#ffe680', '#1d7362',
1033 '#364cd9', '#73003d', '#d93a00', '#998a4d', '#59b3a1', '#5965b3',
1033 '#364cd9', '#73003d', '#d93a00', '#998a4d', '#59b3a1', '#5965b3',
1034 '#e5007a', '#73341d', '#665f00', '#00b38f', '#0018b3', '#59163a',
1034 '#e5007a', '#73341d', '#665f00', '#00b38f', '#0018b3', '#59163a',
1035 '#b2502d', '#bfb960', '#00ffcc', '#23318c', '#a6537f', '#734939',
1035 '#b2502d', '#bfb960', '#00ffcc', '#23318c', '#a6537f', '#734939',
1036 '#b2a700', '#104036', '#3d3df2', '#402031', '#e56739', '#736f39',
1036 '#b2a700', '#104036', '#3d3df2', '#402031', '#e56739', '#736f39',
1037 '#79f2ea', '#000059', '#401029', '#4c1400', '#ffee00', '#005953',
1037 '#79f2ea', '#000059', '#401029', '#4c1400', '#ffee00', '#005953',
1038 '#101040', '#990052', '#402820', '#403d10', '#00ffee', '#0000d9',
1038 '#101040', '#990052', '#402820', '#403d10', '#00ffee', '#0000d9',
1039 '#ff80c4', '#a66953', '#eeff00', '#00ccbe', '#8080ff', '#e673a1',
1039 '#ff80c4', '#a66953', '#eeff00', '#00ccbe', '#8080ff', '#e673a1',
1040 '#a62c00', '#474d00', '#1a3331', '#46468c', '#733950', '#662900',
1040 '#a62c00', '#474d00', '#1a3331', '#46468c', '#733950', '#662900',
1041 '#858c23', '#238c85', '#0f0073', '#b20047', '#d9986c', '#becc00',
1041 '#858c23', '#238c85', '#0f0073', '#b20047', '#d9986c', '#becc00',
1042 '#396f73', '#281d73', '#ff0066', '#ff6600', '#dee673', '#59adb3',
1042 '#396f73', '#281d73', '#ff0066', '#ff6600', '#dee673', '#59adb3',
1043 '#6559b3', '#590024', '#b2622d', '#98b32d', '#36ced9', '#332d59',
1043 '#6559b3', '#590024', '#b2622d', '#98b32d', '#36ced9', '#332d59',
1044 '#40001a', '#733f1d', '#526600', '#005359', '#242040', '#bf6079',
1044 '#40001a', '#733f1d', '#526600', '#005359', '#242040', '#bf6079',
1045 '#735039', '#cef23d', '#007780', '#5630bf', '#66001b', '#b24700',
1045 '#735039', '#cef23d', '#007780', '#5630bf', '#66001b', '#b24700',
1046 '#acbf60', '#1d6273', '#25008c', '#731d34', '#a67453', '#50592d',
1046 '#acbf60', '#1d6273', '#25008c', '#731d34', '#a67453', '#50592d',
1047 '#00ccff', '#6600ff', '#ff0044', '#4c1f00', '#8a994d', '#79daf2',
1047 '#00ccff', '#6600ff', '#ff0044', '#4c1f00', '#8a994d', '#79daf2',
1048 '#a173e6', '#d93662', '#402310', '#aaff00', '#2d98b3', '#8c40ff',
1048 '#a173e6', '#d93662', '#402310', '#aaff00', '#2d98b3', '#8c40ff',
1049 '#592d39', '#ff8c40', '#354020', '#103640', '#1a0040', '#331a20',
1049 '#592d39', '#ff8c40', '#354020', '#103640', '#1a0040', '#331a20',
1050 '#331400', '#334d00', '#1d5673', '#583973', '#7f0022', '#4c3626',
1050 '#331400', '#334d00', '#1d5673', '#583973', '#7f0022', '#4c3626',
1051 '#88cc00', '#36a3d9', '#3d0073', '#d9364c', '#33241a', '#698c23',
1051 '#88cc00', '#36a3d9', '#3d0073', '#d9364c', '#33241a', '#698c23',
1052 '#5995b3', '#300059', '#e57382', '#7f3300', '#366600', '#00aaff',
1052 '#5995b3', '#300059', '#e57382', '#7f3300', '#366600', '#00aaff',
1053 '#3a1659', '#733941', '#663600', '#74b32d', '#003c59', '#7f53a6',
1053 '#3a1659', '#733941', '#663600', '#74b32d', '#003c59', '#7f53a6',
1054 '#73000f', '#ff8800', '#baf279', '#79caf2', '#291040', '#a6293a',
1054 '#73000f', '#ff8800', '#baf279', '#79caf2', '#291040', '#a6293a',
1055 '#b2742d', '#587339', '#0077b3', '#632699', '#400009', '#d9a66c',
1055 '#b2742d', '#587339', '#0077b3', '#632699', '#400009', '#d9a66c',
1056 '#294010', '#2d4a59', '#aa00ff', '#4c131b', '#b25f00', '#5ce600',
1056 '#294010', '#2d4a59', '#aa00ff', '#4c131b', '#b25f00', '#5ce600',
1057 '#267399', '#a336d9', '#990014', '#664e33', '#86bf60', '#0088ff',
1057 '#267399', '#a336d9', '#990014', '#664e33', '#86bf60', '#0088ff',
1058 '#7700b3', '#593a16', '#073300', '#1d4b73', '#ac60bf', '#e59539',
1058 '#7700b3', '#593a16', '#073300', '#1d4b73', '#ac60bf', '#e59539',
1059 '#4f8c46', '#368dd9', '#5c0073'
1059 '#4f8c46', '#368dd9', '#5c0073'
1060 ]
1060 ]
1061
1061
1062 def rgb_to_hex_color(self, rgb_tuple):
1062 def rgb_to_hex_color(self, rgb_tuple):
1063 """
1063 """
1064 Converts an rgb_tuple passed to an hex color.
1064 Converts an rgb_tuple passed to an hex color.
1065
1065
1066 :param rgb_tuple: tuple with 3 ints represents rgb color space
1066 :param rgb_tuple: tuple with 3 ints represents rgb color space
1067 """
1067 """
1068 return '#' + ("".join(map(chr, rgb_tuple)).encode('hex'))
1068 return '#' + ("".join(map(chr, rgb_tuple)).encode('hex'))
1069
1069
1070 def email_to_int_list(self, email_str):
1070 def email_to_int_list(self, email_str):
1071 """
1071 """
1072 Get every byte of the hex digest value of email and turn it to integer.
1072 Get every byte of the hex digest value of email and turn it to integer.
1073 It's going to be always between 0-255
1073 It's going to be always between 0-255
1074 """
1074 """
1075 digest = md5_safe(email_str.lower())
1075 digest = md5_safe(email_str.lower())
1076 return [int(digest[i * 2:i * 2 + 2], 16) for i in range(16)]
1076 return [int(digest[i * 2:i * 2 + 2], 16) for i in range(16)]
1077
1077
1078 def pick_color_bank_index(self, email_str, color_bank):
1078 def pick_color_bank_index(self, email_str, color_bank):
1079 return self.email_to_int_list(email_str)[0] % len(color_bank)
1079 return self.email_to_int_list(email_str)[0] % len(color_bank)
1080
1080
1081 def str2color(self, email_str):
1081 def str2color(self, email_str):
1082 """
1082 """
1083 Tries to map in a stable algorithm an email to color
1083 Tries to map in a stable algorithm an email to color
1084
1084
1085 :param email_str:
1085 :param email_str:
1086 """
1086 """
1087 color_bank = self.get_color_bank()
1087 color_bank = self.get_color_bank()
1088 # pick position (module it's length so we always find it in the
1088 # pick position (module it's length so we always find it in the
1089 # bank even if it's smaller than 256 values
1089 # bank even if it's smaller than 256 values
1090 pos = self.pick_color_bank_index(email_str, color_bank)
1090 pos = self.pick_color_bank_index(email_str, color_bank)
1091 return color_bank[pos]
1091 return color_bank[pos]
1092
1092
1093 def normalize_email(self, email_address):
1093 def normalize_email(self, email_address):
1094 import unicodedata
1094 import unicodedata
1095 # default host used to fill in the fake/missing email
1095 # default host used to fill in the fake/missing email
1096 default_host = u'localhost'
1096 default_host = u'localhost'
1097
1097
1098 if not email_address:
1098 if not email_address:
1099 email_address = u'%s@%s' % (User.DEFAULT_USER, default_host)
1099 email_address = u'%s@%s' % (User.DEFAULT_USER, default_host)
1100
1100
1101 email_address = safe_unicode(email_address)
1101 email_address = safe_unicode(email_address)
1102
1102
1103 if u'@' not in email_address:
1103 if u'@' not in email_address:
1104 email_address = u'%s@%s' % (email_address, default_host)
1104 email_address = u'%s@%s' % (email_address, default_host)
1105
1105
1106 if email_address.endswith(u'@'):
1106 if email_address.endswith(u'@'):
1107 email_address = u'%s%s' % (email_address, default_host)
1107 email_address = u'%s%s' % (email_address, default_host)
1108
1108
1109 email_address = unicodedata.normalize('NFKD', email_address)\
1109 email_address = unicodedata.normalize('NFKD', email_address)\
1110 .encode('ascii', 'ignore')
1110 .encode('ascii', 'ignore')
1111 return email_address
1111 return email_address
1112
1112
1113 def get_initials(self):
1113 def get_initials(self):
1114 """
1114 """
1115 Returns 2 letter initials calculated based on the input.
1115 Returns 2 letter initials calculated based on the input.
1116 The algorithm picks first given email address, and takes first letter
1116 The algorithm picks first given email address, and takes first letter
1117 of part before @, and then the first letter of server name. In case
1117 of part before @, and then the first letter of server name. In case
1118 the part before @ is in a format of `somestring.somestring2` it replaces
1118 the part before @ is in a format of `somestring.somestring2` it replaces
1119 the server letter with first letter of somestring2
1119 the server letter with first letter of somestring2
1120
1120
1121 In case function was initialized with both first and lastname, this
1121 In case function was initialized with both first and lastname, this
1122 overrides the extraction from email by first letter of the first and
1122 overrides the extraction from email by first letter of the first and
1123 last name. We add special logic to that functionality, In case Full name
1123 last name. We add special logic to that functionality, In case Full name
1124 is compound, like Guido Von Rossum, we use last part of the last name
1124 is compound, like Guido Von Rossum, we use last part of the last name
1125 (Von Rossum) picking `R`.
1125 (Von Rossum) picking `R`.
1126
1126
1127 Function also normalizes the non-ascii characters to they ascii
1127 Function also normalizes the non-ascii characters to they ascii
1128 representation, eg Δ„ => A
1128 representation, eg Δ„ => A
1129 """
1129 """
1130 import unicodedata
1130 import unicodedata
1131 # replace non-ascii to ascii
1131 # replace non-ascii to ascii
1132 first_name = unicodedata.normalize(
1132 first_name = unicodedata.normalize(
1133 'NFKD', safe_unicode(self.first_name)).encode('ascii', 'ignore')
1133 'NFKD', safe_unicode(self.first_name)).encode('ascii', 'ignore')
1134 last_name = unicodedata.normalize(
1134 last_name = unicodedata.normalize(
1135 'NFKD', safe_unicode(self.last_name)).encode('ascii', 'ignore')
1135 'NFKD', safe_unicode(self.last_name)).encode('ascii', 'ignore')
1136
1136
1137 # do NFKD encoding, and also make sure email has proper format
1137 # do NFKD encoding, and also make sure email has proper format
1138 email_address = self.normalize_email(self.email_address)
1138 email_address = self.normalize_email(self.email_address)
1139
1139
1140 # first push the email initials
1140 # first push the email initials
1141 prefix, server = email_address.split('@', 1)
1141 prefix, server = email_address.split('@', 1)
1142
1142
1143 # check if prefix is maybe a 'firstname.lastname' syntax
1143 # check if prefix is maybe a 'firstname.lastname' syntax
1144 _dot_split = prefix.rsplit('.', 1)
1144 _dot_split = prefix.rsplit('.', 1)
1145 if len(_dot_split) == 2:
1145 if len(_dot_split) == 2:
1146 initials = [_dot_split[0][0], _dot_split[1][0]]
1146 initials = [_dot_split[0][0], _dot_split[1][0]]
1147 else:
1147 else:
1148 initials = [prefix[0], server[0]]
1148 initials = [prefix[0], server[0]]
1149
1149
1150 # then try to replace either firtname or lastname
1150 # then try to replace either firtname or lastname
1151 fn_letter = (first_name or " ")[0].strip()
1151 fn_letter = (first_name or " ")[0].strip()
1152 ln_letter = (last_name.split(' ', 1)[-1] or " ")[0].strip()
1152 ln_letter = (last_name.split(' ', 1)[-1] or " ")[0].strip()
1153
1153
1154 if fn_letter:
1154 if fn_letter:
1155 initials[0] = fn_letter
1155 initials[0] = fn_letter
1156
1156
1157 if ln_letter:
1157 if ln_letter:
1158 initials[1] = ln_letter
1158 initials[1] = ln_letter
1159
1159
1160 return ''.join(initials).upper()
1160 return ''.join(initials).upper()
1161
1161
1162 def get_img_data_by_type(self, font_family, img_type):
1162 def get_img_data_by_type(self, font_family, img_type):
1163 default_user = """
1163 default_user = """
1164 <svg xmlns="http://www.w3.org/2000/svg"
1164 <svg xmlns="http://www.w3.org/2000/svg"
1165 version="1.1" x="0px" y="0px" width="{size}" height="{size}"
1165 version="1.1" x="0px" y="0px" width="{size}" height="{size}"
1166 viewBox="-15 -10 439.165 429.164"
1166 viewBox="-15 -10 439.165 429.164"
1167
1167
1168 xml:space="preserve"
1168 xml:space="preserve"
1169 style="background:{background};" >
1169 style="background:{background};" >
1170
1170
1171 <path d="M204.583,216.671c50.664,0,91.74-48.075,
1171 <path d="M204.583,216.671c50.664,0,91.74-48.075,
1172 91.74-107.378c0-82.237-41.074-107.377-91.74-107.377
1172 91.74-107.378c0-82.237-41.074-107.377-91.74-107.377
1173 c-50.668,0-91.74,25.14-91.74,107.377C112.844,
1173 c-50.668,0-91.74,25.14-91.74,107.377C112.844,
1174 168.596,153.916,216.671,
1174 168.596,153.916,216.671,
1175 204.583,216.671z" fill="{text_color}"/>
1175 204.583,216.671z" fill="{text_color}"/>
1176 <path d="M407.164,374.717L360.88,
1176 <path d="M407.164,374.717L360.88,
1177 270.454c-2.117-4.771-5.836-8.728-10.465-11.138l-71.83-37.392
1177 270.454c-2.117-4.771-5.836-8.728-10.465-11.138l-71.83-37.392
1178 c-1.584-0.823-3.502-0.663-4.926,0.415c-20.316,
1178 c-1.584-0.823-3.502-0.663-4.926,0.415c-20.316,
1179 15.366-44.203,23.488-69.076,23.488c-24.877,
1179 15.366-44.203,23.488-69.076,23.488c-24.877,
1180 0-48.762-8.122-69.078-23.488
1180 0-48.762-8.122-69.078-23.488
1181 c-1.428-1.078-3.346-1.238-4.93-0.415L58.75,
1181 c-1.428-1.078-3.346-1.238-4.93-0.415L58.75,
1182 259.316c-4.631,2.41-8.346,6.365-10.465,11.138L2.001,374.717
1182 259.316c-4.631,2.41-8.346,6.365-10.465,11.138L2.001,374.717
1183 c-3.191,7.188-2.537,15.412,1.75,22.005c4.285,
1183 c-3.191,7.188-2.537,15.412,1.75,22.005c4.285,
1184 6.592,11.537,10.526,19.4,10.526h362.861c7.863,0,15.117-3.936,
1184 6.592,11.537,10.526,19.4,10.526h362.861c7.863,0,15.117-3.936,
1185 19.402-10.527 C409.699,390.129,
1185 19.402-10.527 C409.699,390.129,
1186 410.355,381.902,407.164,374.717z" fill="{text_color}"/>
1186 410.355,381.902,407.164,374.717z" fill="{text_color}"/>
1187 </svg>""".format(
1187 </svg>""".format(
1188 size=self.size,
1188 size=self.size,
1189 background='#979797', # @grey4
1189 background='#979797', # @grey4
1190 text_color=self.text_color,
1190 text_color=self.text_color,
1191 font_family=font_family)
1191 font_family=font_family)
1192
1192
1193 return {
1193 return {
1194 "default_user": default_user
1194 "default_user": default_user
1195 }[img_type]
1195 }[img_type]
1196
1196
1197 def get_img_data(self, svg_type=None):
1197 def get_img_data(self, svg_type=None):
1198 """
1198 """
1199 generates the svg metadata for image
1199 generates the svg metadata for image
1200 """
1200 """
1201
1201
1202 font_family = ','.join([
1202 font_family = ','.join([
1203 'proximanovaregular',
1203 'proximanovaregular',
1204 'Proxima Nova Regular',
1204 'Proxima Nova Regular',
1205 'Proxima Nova',
1205 'Proxima Nova',
1206 'Arial',
1206 'Arial',
1207 'Lucida Grande',
1207 'Lucida Grande',
1208 'sans-serif'
1208 'sans-serif'
1209 ])
1209 ])
1210 if svg_type:
1210 if svg_type:
1211 return self.get_img_data_by_type(font_family, svg_type)
1211 return self.get_img_data_by_type(font_family, svg_type)
1212
1212
1213 initials = self.get_initials()
1213 initials = self.get_initials()
1214 img_data = """
1214 img_data = """
1215 <svg xmlns="http://www.w3.org/2000/svg" pointer-events="none"
1215 <svg xmlns="http://www.w3.org/2000/svg" pointer-events="none"
1216 width="{size}" height="{size}"
1216 width="{size}" height="{size}"
1217 style="width: 100%; height: 100%; background-color: {background}"
1217 style="width: 100%; height: 100%; background-color: {background}"
1218 viewBox="0 0 {size} {size}">
1218 viewBox="0 0 {size} {size}">
1219 <text text-anchor="middle" y="50%" x="50%" dy="0.35em"
1219 <text text-anchor="middle" y="50%" x="50%" dy="0.35em"
1220 pointer-events="auto" fill="{text_color}"
1220 pointer-events="auto" fill="{text_color}"
1221 font-family="{font_family}"
1221 font-family="{font_family}"
1222 style="font-weight: 400; font-size: {f_size}px;">{text}
1222 style="font-weight: 400; font-size: {f_size}px;">{text}
1223 </text>
1223 </text>
1224 </svg>""".format(
1224 </svg>""".format(
1225 size=self.size,
1225 size=self.size,
1226 f_size=self.size/1.85, # scale the text inside the box nicely
1226 f_size=self.size/1.85, # scale the text inside the box nicely
1227 background=self.background,
1227 background=self.background,
1228 text_color=self.text_color,
1228 text_color=self.text_color,
1229 text=initials.upper(),
1229 text=initials.upper(),
1230 font_family=font_family)
1230 font_family=font_family)
1231
1231
1232 return img_data
1232 return img_data
1233
1233
1234 def generate_svg(self, svg_type=None):
1234 def generate_svg(self, svg_type=None):
1235 img_data = self.get_img_data(svg_type)
1235 img_data = self.get_img_data(svg_type)
1236 return "data:image/svg+xml;base64,%s" % img_data.encode('base64')
1236 return "data:image/svg+xml;base64,%s" % img_data.encode('base64')
1237
1237
1238
1238
1239 def initials_gravatar(email_address, first_name, last_name, size=30):
1239 def initials_gravatar(email_address, first_name, last_name, size=30):
1240 svg_type = None
1240 svg_type = None
1241 if email_address == User.DEFAULT_USER_EMAIL:
1241 if email_address == User.DEFAULT_USER_EMAIL:
1242 svg_type = 'default_user'
1242 svg_type = 'default_user'
1243 klass = InitialsGravatar(email_address, first_name, last_name, size)
1243 klass = InitialsGravatar(email_address, first_name, last_name, size)
1244 return klass.generate_svg(svg_type=svg_type)
1244 return klass.generate_svg(svg_type=svg_type)
1245
1245
1246
1246
1247 def gravatar_url(email_address, size=30):
1247 def gravatar_url(email_address, size=30):
1248 # doh, we need to re-import those to mock it later
1248 # doh, we need to re-import those to mock it later
1249 from pylons import tmpl_context as c
1249 from pylons import tmpl_context as c
1250
1250
1251 _use_gravatar = c.visual.use_gravatar
1251 _use_gravatar = c.visual.use_gravatar
1252 _gravatar_url = c.visual.gravatar_url or User.DEFAULT_GRAVATAR_URL
1252 _gravatar_url = c.visual.gravatar_url or User.DEFAULT_GRAVATAR_URL
1253
1253
1254 email_address = email_address or User.DEFAULT_USER_EMAIL
1254 email_address = email_address or User.DEFAULT_USER_EMAIL
1255 if isinstance(email_address, unicode):
1255 if isinstance(email_address, unicode):
1256 # hashlib crashes on unicode items
1256 # hashlib crashes on unicode items
1257 email_address = safe_str(email_address)
1257 email_address = safe_str(email_address)
1258
1258
1259 # empty email or default user
1259 # empty email or default user
1260 if not email_address or email_address == User.DEFAULT_USER_EMAIL:
1260 if not email_address or email_address == User.DEFAULT_USER_EMAIL:
1261 return initials_gravatar(User.DEFAULT_USER_EMAIL, '', '', size=size)
1261 return initials_gravatar(User.DEFAULT_USER_EMAIL, '', '', size=size)
1262
1262
1263 if _use_gravatar:
1263 if _use_gravatar:
1264 # TODO: Disuse pyramid thread locals. Think about another solution to
1264 # TODO: Disuse pyramid thread locals. Think about another solution to
1265 # get the host and schema here.
1265 # get the host and schema here.
1266 request = get_current_request()
1266 request = get_current_request()
1267 tmpl = safe_str(_gravatar_url)
1267 tmpl = safe_str(_gravatar_url)
1268 tmpl = tmpl.replace('{email}', email_address)\
1268 tmpl = tmpl.replace('{email}', email_address)\
1269 .replace('{md5email}', md5_safe(email_address.lower())) \
1269 .replace('{md5email}', md5_safe(email_address.lower())) \
1270 .replace('{netloc}', request.host)\
1270 .replace('{netloc}', request.host)\
1271 .replace('{scheme}', request.scheme)\
1271 .replace('{scheme}', request.scheme)\
1272 .replace('{size}', safe_str(size))
1272 .replace('{size}', safe_str(size))
1273 return tmpl
1273 return tmpl
1274 else:
1274 else:
1275 return initials_gravatar(email_address, '', '', size=size)
1275 return initials_gravatar(email_address, '', '', size=size)
1276
1276
1277
1277
1278 class Page(_Page):
1278 class Page(_Page):
1279 """
1279 """
1280 Custom pager to match rendering style with paginator
1280 Custom pager to match rendering style with paginator
1281 """
1281 """
1282
1282
1283 def _get_pos(self, cur_page, max_page, items):
1283 def _get_pos(self, cur_page, max_page, items):
1284 edge = (items / 2) + 1
1284 edge = (items / 2) + 1
1285 if (cur_page <= edge):
1285 if (cur_page <= edge):
1286 radius = max(items / 2, items - cur_page)
1286 radius = max(items / 2, items - cur_page)
1287 elif (max_page - cur_page) < edge:
1287 elif (max_page - cur_page) < edge:
1288 radius = (items - 1) - (max_page - cur_page)
1288 radius = (items - 1) - (max_page - cur_page)
1289 else:
1289 else:
1290 radius = items / 2
1290 radius = items / 2
1291
1291
1292 left = max(1, (cur_page - (radius)))
1292 left = max(1, (cur_page - (radius)))
1293 right = min(max_page, cur_page + (radius))
1293 right = min(max_page, cur_page + (radius))
1294 return left, cur_page, right
1294 return left, cur_page, right
1295
1295
1296 def _range(self, regexp_match):
1296 def _range(self, regexp_match):
1297 """
1297 """
1298 Return range of linked pages (e.g. '1 2 [3] 4 5 6 7 8').
1298 Return range of linked pages (e.g. '1 2 [3] 4 5 6 7 8').
1299
1299
1300 Arguments:
1300 Arguments:
1301
1301
1302 regexp_match
1302 regexp_match
1303 A "re" (regular expressions) match object containing the
1303 A "re" (regular expressions) match object containing the
1304 radius of linked pages around the current page in
1304 radius of linked pages around the current page in
1305 regexp_match.group(1) as a string
1305 regexp_match.group(1) as a string
1306
1306
1307 This function is supposed to be called as a callable in
1307 This function is supposed to be called as a callable in
1308 re.sub.
1308 re.sub.
1309
1309
1310 """
1310 """
1311 radius = int(regexp_match.group(1))
1311 radius = int(regexp_match.group(1))
1312
1312
1313 # Compute the first and last page number within the radius
1313 # Compute the first and last page number within the radius
1314 # e.g. '1 .. 5 6 [7] 8 9 .. 12'
1314 # e.g. '1 .. 5 6 [7] 8 9 .. 12'
1315 # -> leftmost_page = 5
1315 # -> leftmost_page = 5
1316 # -> rightmost_page = 9
1316 # -> rightmost_page = 9
1317 leftmost_page, _cur, rightmost_page = self._get_pos(self.page,
1317 leftmost_page, _cur, rightmost_page = self._get_pos(self.page,
1318 self.last_page,
1318 self.last_page,
1319 (radius * 2) + 1)
1319 (radius * 2) + 1)
1320 nav_items = []
1320 nav_items = []
1321
1321
1322 # Create a link to the first page (unless we are on the first page
1322 # Create a link to the first page (unless we are on the first page
1323 # or there would be no need to insert '..' spacers)
1323 # or there would be no need to insert '..' spacers)
1324 if self.page != self.first_page and self.first_page < leftmost_page:
1324 if self.page != self.first_page and self.first_page < leftmost_page:
1325 nav_items.append(self._pagerlink(self.first_page, self.first_page))
1325 nav_items.append(self._pagerlink(self.first_page, self.first_page))
1326
1326
1327 # Insert dots if there are pages between the first page
1327 # Insert dots if there are pages between the first page
1328 # and the currently displayed page range
1328 # and the currently displayed page range
1329 if leftmost_page - self.first_page > 1:
1329 if leftmost_page - self.first_page > 1:
1330 # Wrap in a SPAN tag if nolink_attr is set
1330 # Wrap in a SPAN tag if nolink_attr is set
1331 text = '..'
1331 text = '..'
1332 if self.dotdot_attr:
1332 if self.dotdot_attr:
1333 text = HTML.span(c=text, **self.dotdot_attr)
1333 text = HTML.span(c=text, **self.dotdot_attr)
1334 nav_items.append(text)
1334 nav_items.append(text)
1335
1335
1336 for thispage in xrange(leftmost_page, rightmost_page + 1):
1336 for thispage in xrange(leftmost_page, rightmost_page + 1):
1337 # Hilight the current page number and do not use a link
1337 # Hilight the current page number and do not use a link
1338 if thispage == self.page:
1338 if thispage == self.page:
1339 text = '%s' % (thispage,)
1339 text = '%s' % (thispage,)
1340 # Wrap in a SPAN tag if nolink_attr is set
1340 # Wrap in a SPAN tag if nolink_attr is set
1341 if self.curpage_attr:
1341 if self.curpage_attr:
1342 text = HTML.span(c=text, **self.curpage_attr)
1342 text = HTML.span(c=text, **self.curpage_attr)
1343 nav_items.append(text)
1343 nav_items.append(text)
1344 # Otherwise create just a link to that page
1344 # Otherwise create just a link to that page
1345 else:
1345 else:
1346 text = '%s' % (thispage,)
1346 text = '%s' % (thispage,)
1347 nav_items.append(self._pagerlink(thispage, text))
1347 nav_items.append(self._pagerlink(thispage, text))
1348
1348
1349 # Insert dots if there are pages between the displayed
1349 # Insert dots if there are pages between the displayed
1350 # page numbers and the end of the page range
1350 # page numbers and the end of the page range
1351 if self.last_page - rightmost_page > 1:
1351 if self.last_page - rightmost_page > 1:
1352 text = '..'
1352 text = '..'
1353 # Wrap in a SPAN tag if nolink_attr is set
1353 # Wrap in a SPAN tag if nolink_attr is set
1354 if self.dotdot_attr:
1354 if self.dotdot_attr:
1355 text = HTML.span(c=text, **self.dotdot_attr)
1355 text = HTML.span(c=text, **self.dotdot_attr)
1356 nav_items.append(text)
1356 nav_items.append(text)
1357
1357
1358 # Create a link to the very last page (unless we are on the last
1358 # Create a link to the very last page (unless we are on the last
1359 # page or there would be no need to insert '..' spacers)
1359 # page or there would be no need to insert '..' spacers)
1360 if self.page != self.last_page and rightmost_page < self.last_page:
1360 if self.page != self.last_page and rightmost_page < self.last_page:
1361 nav_items.append(self._pagerlink(self.last_page, self.last_page))
1361 nav_items.append(self._pagerlink(self.last_page, self.last_page))
1362
1362
1363 ## prerender links
1363 ## prerender links
1364 #_page_link = url.current()
1364 #_page_link = url.current()
1365 #nav_items.append(literal('<link rel="prerender" href="%s?page=%s">' % (_page_link, str(int(self.page)+1))))
1365 #nav_items.append(literal('<link rel="prerender" href="%s?page=%s">' % (_page_link, str(int(self.page)+1))))
1366 #nav_items.append(literal('<link rel="prefetch" href="%s?page=%s">' % (_page_link, str(int(self.page)+1))))
1366 #nav_items.append(literal('<link rel="prefetch" href="%s?page=%s">' % (_page_link, str(int(self.page)+1))))
1367 return self.separator.join(nav_items)
1367 return self.separator.join(nav_items)
1368
1368
1369 def pager(self, format='~2~', page_param='page', partial_param='partial',
1369 def pager(self, format='~2~', page_param='page', partial_param='partial',
1370 show_if_single_page=False, separator=' ', onclick=None,
1370 show_if_single_page=False, separator=' ', onclick=None,
1371 symbol_first='<<', symbol_last='>>',
1371 symbol_first='<<', symbol_last='>>',
1372 symbol_previous='<', symbol_next='>',
1372 symbol_previous='<', symbol_next='>',
1373 link_attr={'class': 'pager_link', 'rel': 'prerender'},
1373 link_attr={'class': 'pager_link', 'rel': 'prerender'},
1374 curpage_attr={'class': 'pager_curpage'},
1374 curpage_attr={'class': 'pager_curpage'},
1375 dotdot_attr={'class': 'pager_dotdot'}, **kwargs):
1375 dotdot_attr={'class': 'pager_dotdot'}, **kwargs):
1376
1376
1377 self.curpage_attr = curpage_attr
1377 self.curpage_attr = curpage_attr
1378 self.separator = separator
1378 self.separator = separator
1379 self.pager_kwargs = kwargs
1379 self.pager_kwargs = kwargs
1380 self.page_param = page_param
1380 self.page_param = page_param
1381 self.partial_param = partial_param
1381 self.partial_param = partial_param
1382 self.onclick = onclick
1382 self.onclick = onclick
1383 self.link_attr = link_attr
1383 self.link_attr = link_attr
1384 self.dotdot_attr = dotdot_attr
1384 self.dotdot_attr = dotdot_attr
1385
1385
1386 # Don't show navigator if there is no more than one page
1386 # Don't show navigator if there is no more than one page
1387 if self.page_count == 0 or (self.page_count == 1 and not show_if_single_page):
1387 if self.page_count == 0 or (self.page_count == 1 and not show_if_single_page):
1388 return ''
1388 return ''
1389
1389
1390 from string import Template
1390 from string import Template
1391 # Replace ~...~ in token format by range of pages
1391 # Replace ~...~ in token format by range of pages
1392 result = re.sub(r'~(\d+)~', self._range, format)
1392 result = re.sub(r'~(\d+)~', self._range, format)
1393
1393
1394 # Interpolate '%' variables
1394 # Interpolate '%' variables
1395 result = Template(result).safe_substitute({
1395 result = Template(result).safe_substitute({
1396 'first_page': self.first_page,
1396 'first_page': self.first_page,
1397 'last_page': self.last_page,
1397 'last_page': self.last_page,
1398 'page': self.page,
1398 'page': self.page,
1399 'page_count': self.page_count,
1399 'page_count': self.page_count,
1400 'items_per_page': self.items_per_page,
1400 'items_per_page': self.items_per_page,
1401 'first_item': self.first_item,
1401 'first_item': self.first_item,
1402 'last_item': self.last_item,
1402 'last_item': self.last_item,
1403 'item_count': self.item_count,
1403 'item_count': self.item_count,
1404 'link_first': self.page > self.first_page and \
1404 'link_first': self.page > self.first_page and \
1405 self._pagerlink(self.first_page, symbol_first) or '',
1405 self._pagerlink(self.first_page, symbol_first) or '',
1406 'link_last': self.page < self.last_page and \
1406 'link_last': self.page < self.last_page and \
1407 self._pagerlink(self.last_page, symbol_last) or '',
1407 self._pagerlink(self.last_page, symbol_last) or '',
1408 'link_previous': self.previous_page and \
1408 'link_previous': self.previous_page and \
1409 self._pagerlink(self.previous_page, symbol_previous) \
1409 self._pagerlink(self.previous_page, symbol_previous) \
1410 or HTML.span(symbol_previous, class_="pg-previous disabled"),
1410 or HTML.span(symbol_previous, class_="pg-previous disabled"),
1411 'link_next': self.next_page and \
1411 'link_next': self.next_page and \
1412 self._pagerlink(self.next_page, symbol_next) \
1412 self._pagerlink(self.next_page, symbol_next) \
1413 or HTML.span(symbol_next, class_="pg-next disabled")
1413 or HTML.span(symbol_next, class_="pg-next disabled")
1414 })
1414 })
1415
1415
1416 return literal(result)
1416 return literal(result)
1417
1417
1418
1418
1419 #==============================================================================
1419 #==============================================================================
1420 # REPO PAGER, PAGER FOR REPOSITORY
1420 # REPO PAGER, PAGER FOR REPOSITORY
1421 #==============================================================================
1421 #==============================================================================
1422 class RepoPage(Page):
1422 class RepoPage(Page):
1423
1423
1424 def __init__(self, collection, page=1, items_per_page=20,
1424 def __init__(self, collection, page=1, items_per_page=20,
1425 item_count=None, url=None, **kwargs):
1425 item_count=None, url=None, **kwargs):
1426
1426
1427 """Create a "RepoPage" instance. special pager for paging
1427 """Create a "RepoPage" instance. special pager for paging
1428 repository
1428 repository
1429 """
1429 """
1430 self._url_generator = url
1430 self._url_generator = url
1431
1431
1432 # Safe the kwargs class-wide so they can be used in the pager() method
1432 # Safe the kwargs class-wide so they can be used in the pager() method
1433 self.kwargs = kwargs
1433 self.kwargs = kwargs
1434
1434
1435 # Save a reference to the collection
1435 # Save a reference to the collection
1436 self.original_collection = collection
1436 self.original_collection = collection
1437
1437
1438 self.collection = collection
1438 self.collection = collection
1439
1439
1440 # The self.page is the number of the current page.
1440 # The self.page is the number of the current page.
1441 # The first page has the number 1!
1441 # The first page has the number 1!
1442 try:
1442 try:
1443 self.page = int(page) # make it int() if we get it as a string
1443 self.page = int(page) # make it int() if we get it as a string
1444 except (ValueError, TypeError):
1444 except (ValueError, TypeError):
1445 self.page = 1
1445 self.page = 1
1446
1446
1447 self.items_per_page = items_per_page
1447 self.items_per_page = items_per_page
1448
1448
1449 # Unless the user tells us how many items the collections has
1449 # Unless the user tells us how many items the collections has
1450 # we calculate that ourselves.
1450 # we calculate that ourselves.
1451 if item_count is not None:
1451 if item_count is not None:
1452 self.item_count = item_count
1452 self.item_count = item_count
1453 else:
1453 else:
1454 self.item_count = len(self.collection)
1454 self.item_count = len(self.collection)
1455
1455
1456 # Compute the number of the first and last available page
1456 # Compute the number of the first and last available page
1457 if self.item_count > 0:
1457 if self.item_count > 0:
1458 self.first_page = 1
1458 self.first_page = 1
1459 self.page_count = int(math.ceil(float(self.item_count) /
1459 self.page_count = int(math.ceil(float(self.item_count) /
1460 self.items_per_page))
1460 self.items_per_page))
1461 self.last_page = self.first_page + self.page_count - 1
1461 self.last_page = self.first_page + self.page_count - 1
1462
1462
1463 # Make sure that the requested page number is the range of
1463 # Make sure that the requested page number is the range of
1464 # valid pages
1464 # valid pages
1465 if self.page > self.last_page:
1465 if self.page > self.last_page:
1466 self.page = self.last_page
1466 self.page = self.last_page
1467 elif self.page < self.first_page:
1467 elif self.page < self.first_page:
1468 self.page = self.first_page
1468 self.page = self.first_page
1469
1469
1470 # Note: the number of items on this page can be less than
1470 # Note: the number of items on this page can be less than
1471 # items_per_page if the last page is not full
1471 # items_per_page if the last page is not full
1472 self.first_item = max(0, (self.item_count) - (self.page *
1472 self.first_item = max(0, (self.item_count) - (self.page *
1473 items_per_page))
1473 items_per_page))
1474 self.last_item = ((self.item_count - 1) - items_per_page *
1474 self.last_item = ((self.item_count - 1) - items_per_page *
1475 (self.page - 1))
1475 (self.page - 1))
1476
1476
1477 self.items = list(self.collection[self.first_item:self.last_item + 1])
1477 self.items = list(self.collection[self.first_item:self.last_item + 1])
1478
1478
1479 # Links to previous and next page
1479 # Links to previous and next page
1480 if self.page > self.first_page:
1480 if self.page > self.first_page:
1481 self.previous_page = self.page - 1
1481 self.previous_page = self.page - 1
1482 else:
1482 else:
1483 self.previous_page = None
1483 self.previous_page = None
1484
1484
1485 if self.page < self.last_page:
1485 if self.page < self.last_page:
1486 self.next_page = self.page + 1
1486 self.next_page = self.page + 1
1487 else:
1487 else:
1488 self.next_page = None
1488 self.next_page = None
1489
1489
1490 # No items available
1490 # No items available
1491 else:
1491 else:
1492 self.first_page = None
1492 self.first_page = None
1493 self.page_count = 0
1493 self.page_count = 0
1494 self.last_page = None
1494 self.last_page = None
1495 self.first_item = None
1495 self.first_item = None
1496 self.last_item = None
1496 self.last_item = None
1497 self.previous_page = None
1497 self.previous_page = None
1498 self.next_page = None
1498 self.next_page = None
1499 self.items = []
1499 self.items = []
1500
1500
1501 # This is a subclass of the 'list' type. Initialise the list now.
1501 # This is a subclass of the 'list' type. Initialise the list now.
1502 list.__init__(self, reversed(self.items))
1502 list.__init__(self, reversed(self.items))
1503
1503
1504
1504
1505 def changed_tooltip(nodes):
1505 def changed_tooltip(nodes):
1506 """
1506 """
1507 Generates a html string for changed nodes in commit page.
1507 Generates a html string for changed nodes in commit page.
1508 It limits the output to 30 entries
1508 It limits the output to 30 entries
1509
1509
1510 :param nodes: LazyNodesGenerator
1510 :param nodes: LazyNodesGenerator
1511 """
1511 """
1512 if nodes:
1512 if nodes:
1513 pref = ': <br/> '
1513 pref = ': <br/> '
1514 suf = ''
1514 suf = ''
1515 if len(nodes) > 30:
1515 if len(nodes) > 30:
1516 suf = '<br/>' + _(' and %s more') % (len(nodes) - 30)
1516 suf = '<br/>' + _(' and %s more') % (len(nodes) - 30)
1517 return literal(pref + '<br/> '.join([safe_unicode(x.path)
1517 return literal(pref + '<br/> '.join([safe_unicode(x.path)
1518 for x in nodes[:30]]) + suf)
1518 for x in nodes[:30]]) + suf)
1519 else:
1519 else:
1520 return ': ' + _('No Files')
1520 return ': ' + _('No Files')
1521
1521
1522
1522
1523 def breadcrumb_repo_link(repo):
1523 def breadcrumb_repo_link(repo):
1524 """
1524 """
1525 Makes a breadcrumbs path link to repo
1525 Makes a breadcrumbs path link to repo
1526
1526
1527 ex::
1527 ex::
1528 group >> subgroup >> repo
1528 group >> subgroup >> repo
1529
1529
1530 :param repo: a Repository instance
1530 :param repo: a Repository instance
1531 """
1531 """
1532
1532
1533 path = [
1533 path = [
1534 link_to(group.name, url('repo_group_home', group_name=group.group_name))
1534 link_to(group.name, url('repo_group_home', group_name=group.group_name))
1535 for group in repo.groups_with_parents
1535 for group in repo.groups_with_parents
1536 ] + [
1536 ] + [
1537 link_to(repo.just_name, url('summary_home', repo_name=repo.repo_name))
1537 link_to(repo.just_name, url('summary_home', repo_name=repo.repo_name))
1538 ]
1538 ]
1539
1539
1540 return literal(' &raquo; '.join(path))
1540 return literal(' &raquo; '.join(path))
1541
1541
1542
1542
1543 def format_byte_size_binary(file_size):
1543 def format_byte_size_binary(file_size):
1544 """
1544 """
1545 Formats file/folder sizes to standard.
1545 Formats file/folder sizes to standard.
1546 """
1546 """
1547 formatted_size = format_byte_size(file_size, binary=True)
1547 formatted_size = format_byte_size(file_size, binary=True)
1548 return formatted_size
1548 return formatted_size
1549
1549
1550
1550
1551 def fancy_file_stats(stats):
1551 def fancy_file_stats(stats):
1552 """
1552 """
1553 Displays a fancy two colored bar for number of added/deleted
1553 Displays a fancy two colored bar for number of added/deleted
1554 lines of code on file
1554 lines of code on file
1555
1555
1556 :param stats: two element list of added/deleted lines of code
1556 :param stats: two element list of added/deleted lines of code
1557 """
1557 """
1558 from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
1558 from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
1559 MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE
1559 MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE
1560
1560
1561 def cgen(l_type, a_v, d_v):
1561 def cgen(l_type, a_v, d_v):
1562 mapping = {'tr': 'top-right-rounded-corner-mid',
1562 mapping = {'tr': 'top-right-rounded-corner-mid',
1563 'tl': 'top-left-rounded-corner-mid',
1563 'tl': 'top-left-rounded-corner-mid',
1564 'br': 'bottom-right-rounded-corner-mid',
1564 'br': 'bottom-right-rounded-corner-mid',
1565 'bl': 'bottom-left-rounded-corner-mid'}
1565 'bl': 'bottom-left-rounded-corner-mid'}
1566 map_getter = lambda x: mapping[x]
1566 map_getter = lambda x: mapping[x]
1567
1567
1568 if l_type == 'a' and d_v:
1568 if l_type == 'a' and d_v:
1569 #case when added and deleted are present
1569 #case when added and deleted are present
1570 return ' '.join(map(map_getter, ['tl', 'bl']))
1570 return ' '.join(map(map_getter, ['tl', 'bl']))
1571
1571
1572 if l_type == 'a' and not d_v:
1572 if l_type == 'a' and not d_v:
1573 return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
1573 return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
1574
1574
1575 if l_type == 'd' and a_v:
1575 if l_type == 'd' and a_v:
1576 return ' '.join(map(map_getter, ['tr', 'br']))
1576 return ' '.join(map(map_getter, ['tr', 'br']))
1577
1577
1578 if l_type == 'd' and not a_v:
1578 if l_type == 'd' and not a_v:
1579 return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
1579 return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
1580
1580
1581 a, d = stats['added'], stats['deleted']
1581 a, d = stats['added'], stats['deleted']
1582 width = 100
1582 width = 100
1583
1583
1584 if stats['binary']: # binary operations like chmod/rename etc
1584 if stats['binary']: # binary operations like chmod/rename etc
1585 lbl = []
1585 lbl = []
1586 bin_op = 0 # undefined
1586 bin_op = 0 # undefined
1587
1587
1588 # prefix with bin for binary files
1588 # prefix with bin for binary files
1589 if BIN_FILENODE in stats['ops']:
1589 if BIN_FILENODE in stats['ops']:
1590 lbl += ['bin']
1590 lbl += ['bin']
1591
1591
1592 if NEW_FILENODE in stats['ops']:
1592 if NEW_FILENODE in stats['ops']:
1593 lbl += [_('new file')]
1593 lbl += [_('new file')]
1594 bin_op = NEW_FILENODE
1594 bin_op = NEW_FILENODE
1595 elif MOD_FILENODE in stats['ops']:
1595 elif MOD_FILENODE in stats['ops']:
1596 lbl += [_('mod')]
1596 lbl += [_('mod')]
1597 bin_op = MOD_FILENODE
1597 bin_op = MOD_FILENODE
1598 elif DEL_FILENODE in stats['ops']:
1598 elif DEL_FILENODE in stats['ops']:
1599 lbl += [_('del')]
1599 lbl += [_('del')]
1600 bin_op = DEL_FILENODE
1600 bin_op = DEL_FILENODE
1601 elif RENAMED_FILENODE in stats['ops']:
1601 elif RENAMED_FILENODE in stats['ops']:
1602 lbl += [_('rename')]
1602 lbl += [_('rename')]
1603 bin_op = RENAMED_FILENODE
1603 bin_op = RENAMED_FILENODE
1604
1604
1605 # chmod can go with other operations, so we add a + to lbl if needed
1605 # chmod can go with other operations, so we add a + to lbl if needed
1606 if CHMOD_FILENODE in stats['ops']:
1606 if CHMOD_FILENODE in stats['ops']:
1607 lbl += [_('chmod')]
1607 lbl += [_('chmod')]
1608 if bin_op == 0:
1608 if bin_op == 0:
1609 bin_op = CHMOD_FILENODE
1609 bin_op = CHMOD_FILENODE
1610
1610
1611 lbl = '+'.join(lbl)
1611 lbl = '+'.join(lbl)
1612 b_a = '<div class="bin bin%s %s" style="width:100%%">%s</div>' \
1612 b_a = '<div class="bin bin%s %s" style="width:100%%">%s</div>' \
1613 % (bin_op, cgen('a', a_v='', d_v=0), lbl)
1613 % (bin_op, cgen('a', a_v='', d_v=0), lbl)
1614 b_d = '<div class="bin bin1" style="width:0%%"></div>'
1614 b_d = '<div class="bin bin1" style="width:0%%"></div>'
1615 return literal('<div style="width:%spx">%s%s</div>' % (width, b_a, b_d))
1615 return literal('<div style="width:%spx">%s%s</div>' % (width, b_a, b_d))
1616
1616
1617 t = stats['added'] + stats['deleted']
1617 t = stats['added'] + stats['deleted']
1618 unit = float(width) / (t or 1)
1618 unit = float(width) / (t or 1)
1619
1619
1620 # needs > 9% of width to be visible or 0 to be hidden
1620 # needs > 9% of width to be visible or 0 to be hidden
1621 a_p = max(9, unit * a) if a > 0 else 0
1621 a_p = max(9, unit * a) if a > 0 else 0
1622 d_p = max(9, unit * d) if d > 0 else 0
1622 d_p = max(9, unit * d) if d > 0 else 0
1623 p_sum = a_p + d_p
1623 p_sum = a_p + d_p
1624
1624
1625 if p_sum > width:
1625 if p_sum > width:
1626 #adjust the percentage to be == 100% since we adjusted to 9
1626 #adjust the percentage to be == 100% since we adjusted to 9
1627 if a_p > d_p:
1627 if a_p > d_p:
1628 a_p = a_p - (p_sum - width)
1628 a_p = a_p - (p_sum - width)
1629 else:
1629 else:
1630 d_p = d_p - (p_sum - width)
1630 d_p = d_p - (p_sum - width)
1631
1631
1632 a_v = a if a > 0 else ''
1632 a_v = a if a > 0 else ''
1633 d_v = d if d > 0 else ''
1633 d_v = d if d > 0 else ''
1634
1634
1635 d_a = '<div class="added %s" style="width:%s%%">%s</div>' % (
1635 d_a = '<div class="added %s" style="width:%s%%">%s</div>' % (
1636 cgen('a', a_v, d_v), a_p, a_v
1636 cgen('a', a_v, d_v), a_p, a_v
1637 )
1637 )
1638 d_d = '<div class="deleted %s" style="width:%s%%">%s</div>' % (
1638 d_d = '<div class="deleted %s" style="width:%s%%">%s</div>' % (
1639 cgen('d', a_v, d_v), d_p, d_v
1639 cgen('d', a_v, d_v), d_p, d_v
1640 )
1640 )
1641 return literal('<div style="width:%spx">%s%s</div>' % (width, d_a, d_d))
1641 return literal('<div style="width:%spx">%s%s</div>' % (width, d_a, d_d))
1642
1642
1643
1643
1644 def urlify_text(text_, safe=True):
1644 def urlify_text(text_, safe=True):
1645 """
1645 """
1646 Extrac urls from text and make html links out of them
1646 Extrac urls from text and make html links out of them
1647
1647
1648 :param text_:
1648 :param text_:
1649 """
1649 """
1650
1650
1651 url_pat = re.compile(r'''(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@#.&+]'''
1651 url_pat = re.compile(r'''(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@#.&+]'''
1652 '''|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)''')
1652 '''|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)''')
1653
1653
1654 def url_func(match_obj):
1654 def url_func(match_obj):
1655 url_full = match_obj.groups()[0]
1655 url_full = match_obj.groups()[0]
1656 return '<a href="%(url)s">%(url)s</a>' % ({'url': url_full})
1656 return '<a href="%(url)s">%(url)s</a>' % ({'url': url_full})
1657 _newtext = url_pat.sub(url_func, text_)
1657 _newtext = url_pat.sub(url_func, text_)
1658 if safe:
1658 if safe:
1659 return literal(_newtext)
1659 return literal(_newtext)
1660 return _newtext
1660 return _newtext
1661
1661
1662
1662
1663 def urlify_commits(text_, repository):
1663 def urlify_commits(text_, repository):
1664 """
1664 """
1665 Extract commit ids from text and make link from them
1665 Extract commit ids from text and make link from them
1666
1666
1667 :param text_:
1667 :param text_:
1668 :param repository: repo name to build the URL with
1668 :param repository: repo name to build the URL with
1669 """
1669 """
1670 from pylons import url # doh, we need to re-import url to mock it later
1670 from pylons import url # doh, we need to re-import url to mock it later
1671 URL_PAT = re.compile(r'(^|\s)([0-9a-fA-F]{12,40})($|\s)')
1671 URL_PAT = re.compile(r'(^|\s)([0-9a-fA-F]{12,40})($|\s)')
1672
1672
1673 def url_func(match_obj):
1673 def url_func(match_obj):
1674 commit_id = match_obj.groups()[1]
1674 commit_id = match_obj.groups()[1]
1675 pref = match_obj.groups()[0]
1675 pref = match_obj.groups()[0]
1676 suf = match_obj.groups()[2]
1676 suf = match_obj.groups()[2]
1677
1677
1678 tmpl = (
1678 tmpl = (
1679 '%(pref)s<a class="%(cls)s" href="%(url)s">'
1679 '%(pref)s<a class="%(cls)s" href="%(url)s">'
1680 '%(commit_id)s</a>%(suf)s'
1680 '%(commit_id)s</a>%(suf)s'
1681 )
1681 )
1682 return tmpl % {
1682 return tmpl % {
1683 'pref': pref,
1683 'pref': pref,
1684 'cls': 'revision-link',
1684 'cls': 'revision-link',
1685 'url': url('changeset_home', repo_name=repository,
1685 'url': url('changeset_home', repo_name=repository,
1686 revision=commit_id, qualified=True),
1686 revision=commit_id, qualified=True),
1687 'commit_id': commit_id,
1687 'commit_id': commit_id,
1688 'suf': suf
1688 'suf': suf
1689 }
1689 }
1690
1690
1691 newtext = URL_PAT.sub(url_func, text_)
1691 newtext = URL_PAT.sub(url_func, text_)
1692
1692
1693 return newtext
1693 return newtext
1694
1694
1695
1695
1696 def _process_url_func(match_obj, repo_name, uid, entry,
1696 def _process_url_func(match_obj, repo_name, uid, entry,
1697 return_raw_data=False):
1697 return_raw_data=False):
1698 pref = ''
1698 pref = ''
1699 if match_obj.group().startswith(' '):
1699 if match_obj.group().startswith(' '):
1700 pref = ' '
1700 pref = ' '
1701
1701
1702 issue_id = ''.join(match_obj.groups())
1702 issue_id = ''.join(match_obj.groups())
1703 tmpl = (
1703 tmpl = (
1704 '%(pref)s<a class="%(cls)s" href="%(url)s">'
1704 '%(pref)s<a class="%(cls)s" href="%(url)s">'
1705 '%(issue-prefix)s%(id-repr)s'
1705 '%(issue-prefix)s%(id-repr)s'
1706 '</a>')
1706 '</a>')
1707
1707
1708 (repo_name_cleaned,
1708 (repo_name_cleaned,
1709 parent_group_name) = RepoGroupModel().\
1709 parent_group_name) = RepoGroupModel().\
1710 _get_group_name_and_parent(repo_name)
1710 _get_group_name_and_parent(repo_name)
1711
1711
1712 # variables replacement
1712 # variables replacement
1713 named_vars = {
1713 named_vars = {
1714 'id': issue_id,
1714 'id': issue_id,
1715 'repo': repo_name,
1715 'repo': repo_name,
1716 'repo_name': repo_name_cleaned,
1716 'repo_name': repo_name_cleaned,
1717 'group_name': parent_group_name
1717 'group_name': parent_group_name
1718 }
1718 }
1719 # named regex variables
1719 # named regex variables
1720 named_vars.update(match_obj.groupdict())
1720 named_vars.update(match_obj.groupdict())
1721 _url = string.Template(entry['url']).safe_substitute(**named_vars)
1721 _url = string.Template(entry['url']).safe_substitute(**named_vars)
1722
1722
1723 data = {
1723 data = {
1724 'pref': pref,
1724 'pref': pref,
1725 'cls': 'issue-tracker-link',
1725 'cls': 'issue-tracker-link',
1726 'url': _url,
1726 'url': _url,
1727 'id-repr': issue_id,
1727 'id-repr': issue_id,
1728 'issue-prefix': entry['pref'],
1728 'issue-prefix': entry['pref'],
1729 'serv': entry['url'],
1729 'serv': entry['url'],
1730 }
1730 }
1731 if return_raw_data:
1731 if return_raw_data:
1732 return {
1732 return {
1733 'id': issue_id,
1733 'id': issue_id,
1734 'url': _url
1734 'url': _url
1735 }
1735 }
1736 return tmpl % data
1736 return tmpl % data
1737
1737
1738
1738
1739 def process_patterns(text_string, repo_name, config=None):
1739 def process_patterns(text_string, repo_name, config=None):
1740 repo = None
1740 repo = None
1741 if repo_name:
1741 if repo_name:
1742 # Retrieving repo_name to avoid invalid repo_name to explode on
1742 # Retrieving repo_name to avoid invalid repo_name to explode on
1743 # IssueTrackerSettingsModel but still passing invalid name further down
1743 # IssueTrackerSettingsModel but still passing invalid name further down
1744 repo = Repository.get_by_repo_name(repo_name, cache=True)
1744 repo = Repository.get_by_repo_name(repo_name, cache=True)
1745
1745
1746 settings_model = IssueTrackerSettingsModel(repo=repo)
1746 settings_model = IssueTrackerSettingsModel(repo=repo)
1747 active_entries = settings_model.get_settings(cache=True)
1747 active_entries = settings_model.get_settings(cache=True)
1748
1748
1749 issues_data = []
1749 issues_data = []
1750 newtext = text_string
1750 newtext = text_string
1751 for uid, entry in active_entries.items():
1751 for uid, entry in active_entries.items():
1752 log.debug('found issue tracker entry with uid %s' % (uid,))
1752 log.debug('found issue tracker entry with uid %s' % (uid,))
1753
1753
1754 if not (entry['pat'] and entry['url']):
1754 if not (entry['pat'] and entry['url']):
1755 log.debug('skipping due to missing data')
1755 log.debug('skipping due to missing data')
1756 continue
1756 continue
1757
1757
1758 log.debug('issue tracker entry: uid: `%s` PAT:%s URL:%s PREFIX:%s'
1758 log.debug('issue tracker entry: uid: `%s` PAT:%s URL:%s PREFIX:%s'
1759 % (uid, entry['pat'], entry['url'], entry['pref']))
1759 % (uid, entry['pat'], entry['url'], entry['pref']))
1760
1760
1761 try:
1761 try:
1762 pattern = re.compile(r'%s' % entry['pat'])
1762 pattern = re.compile(r'%s' % entry['pat'])
1763 except re.error:
1763 except re.error:
1764 log.exception(
1764 log.exception(
1765 'issue tracker pattern: `%s` failed to compile',
1765 'issue tracker pattern: `%s` failed to compile',
1766 entry['pat'])
1766 entry['pat'])
1767 continue
1767 continue
1768
1768
1769 data_func = partial(
1769 data_func = partial(
1770 _process_url_func, repo_name=repo_name, entry=entry, uid=uid,
1770 _process_url_func, repo_name=repo_name, entry=entry, uid=uid,
1771 return_raw_data=True)
1771 return_raw_data=True)
1772
1772
1773 for match_obj in pattern.finditer(text_string):
1773 for match_obj in pattern.finditer(text_string):
1774 issues_data.append(data_func(match_obj))
1774 issues_data.append(data_func(match_obj))
1775
1775
1776 url_func = partial(
1776 url_func = partial(
1777 _process_url_func, repo_name=repo_name, entry=entry, uid=uid)
1777 _process_url_func, repo_name=repo_name, entry=entry, uid=uid)
1778
1778
1779 newtext = pattern.sub(url_func, newtext)
1779 newtext = pattern.sub(url_func, newtext)
1780 log.debug('processed prefix:uid `%s`' % (uid,))
1780 log.debug('processed prefix:uid `%s`' % (uid,))
1781
1781
1782 return newtext, issues_data
1782 return newtext, issues_data
1783
1783
1784
1784
1785 def urlify_commit_message(commit_text, repository=None):
1785 def urlify_commit_message(commit_text, repository=None):
1786 """
1786 """
1787 Parses given text message and makes proper links.
1787 Parses given text message and makes proper links.
1788 issues are linked to given issue-server, and rest is a commit link
1788 issues are linked to given issue-server, and rest is a commit link
1789
1789
1790 :param commit_text:
1790 :param commit_text:
1791 :param repository:
1791 :param repository:
1792 """
1792 """
1793 from pylons import url # doh, we need to re-import url to mock it later
1793 from pylons import url # doh, we need to re-import url to mock it later
1794
1794
1795 def escaper(string):
1795 def escaper(string):
1796 return string.replace('<', '&lt;').replace('>', '&gt;')
1796 return string.replace('<', '&lt;').replace('>', '&gt;')
1797
1797
1798 newtext = escaper(commit_text)
1798 newtext = escaper(commit_text)
1799
1799
1800 # extract http/https links and make them real urls
1800 # extract http/https links and make them real urls
1801 newtext = urlify_text(newtext, safe=False)
1801 newtext = urlify_text(newtext, safe=False)
1802
1802
1803 # urlify commits - extract commit ids and make link out of them, if we have
1803 # urlify commits - extract commit ids and make link out of them, if we have
1804 # the scope of repository present.
1804 # the scope of repository present.
1805 if repository:
1805 if repository:
1806 newtext = urlify_commits(newtext, repository)
1806 newtext = urlify_commits(newtext, repository)
1807
1807
1808 # process issue tracker patterns
1808 # process issue tracker patterns
1809 newtext, issues = process_patterns(newtext, repository or '')
1809 newtext, issues = process_patterns(newtext, repository or '')
1810
1810
1811 return literal(newtext)
1811 return literal(newtext)
1812
1812
1813
1813
1814 def rst(source, mentions=False):
1814 def rst(source, mentions=False):
1815 return literal('<div class="rst-block">%s</div>' %
1815 return literal('<div class="rst-block">%s</div>' %
1816 MarkupRenderer.rst(source, mentions=mentions))
1816 MarkupRenderer.rst(source, mentions=mentions))
1817
1817
1818
1818
1819 def markdown(source, mentions=False):
1819 def markdown(source, mentions=False):
1820 return literal('<div class="markdown-block">%s</div>' %
1820 return literal('<div class="markdown-block">%s</div>' %
1821 MarkupRenderer.markdown(source, flavored=True,
1821 MarkupRenderer.markdown(source, flavored=True,
1822 mentions=mentions))
1822 mentions=mentions))
1823
1823
1824
1824 def renderer_from_filename(filename, exclude=None):
1825 def renderer_from_filename(filename, exclude=None):
1825 return MarkupRenderer.renderer_from_filename(filename, exclude=exclude)
1826 """
1827 choose a renderer based on filename
1828 """
1829
1830 # images
1831
1832 # ipython
1833 if filename.endswith('.ipynb'):
1834 return 'ipython'
1835
1836 is_markup = MarkupRenderer.renderer_from_filename(filename, exclude=exclude)
1837 if is_markup:
1838 return is_markup
1839 return None
1826
1840
1827
1841
1828 def render(source, renderer='rst', mentions=False):
1842 def render(source, renderer='rst', mentions=False):
1829 if renderer == 'rst':
1843 if renderer == 'rst':
1830 return rst(source, mentions=mentions)
1844 return rst(source, mentions=mentions)
1831 if renderer == 'markdown':
1845 elif renderer == 'markdown':
1832 return markdown(source, mentions=mentions)
1846 return markdown(source, mentions=mentions)
1847 elif renderer == 'ipython':
1848 def ipython_renderer(source):
1849 import nbformat
1850 from nbconvert import HTMLExporter
1851 notebook = nbformat.reads(source, as_version=4)
1852
1853 # 2. Instantiate the exporter. We use the `basic` template for now; we'll get into more details
1854 # later about how to customize the exporter further.
1855 html_exporter = HTMLExporter()
1856 html_exporter.template_file = 'basic'
1857
1858 # 3. Process the notebook we loaded earlier
1859 (body, resources) = html_exporter.from_notebook_node(notebook)
1860
1861 return body
1862
1863 return ipython_renderer(source)
1864 # None means just show the file-source
1865 return None
1833
1866
1834
1867
1835 def commit_status(repo, commit_id):
1868 def commit_status(repo, commit_id):
1836 return ChangesetStatusModel().get_status(repo, commit_id)
1869 return ChangesetStatusModel().get_status(repo, commit_id)
1837
1870
1838
1871
1839 def commit_status_lbl(commit_status):
1872 def commit_status_lbl(commit_status):
1840 return dict(ChangesetStatus.STATUSES).get(commit_status)
1873 return dict(ChangesetStatus.STATUSES).get(commit_status)
1841
1874
1842
1875
1843 def commit_time(repo_name, commit_id):
1876 def commit_time(repo_name, commit_id):
1844 repo = Repository.get_by_repo_name(repo_name)
1877 repo = Repository.get_by_repo_name(repo_name)
1845 commit = repo.get_commit(commit_id=commit_id)
1878 commit = repo.get_commit(commit_id=commit_id)
1846 return commit.date
1879 return commit.date
1847
1880
1848
1881
1849 def get_permission_name(key):
1882 def get_permission_name(key):
1850 return dict(Permission.PERMS).get(key)
1883 return dict(Permission.PERMS).get(key)
1851
1884
1852
1885
1853 def journal_filter_help():
1886 def journal_filter_help():
1854 return _(
1887 return _(
1855 'Example filter terms:\n' +
1888 'Example filter terms:\n' +
1856 ' repository:vcs\n' +
1889 ' repository:vcs\n' +
1857 ' username:marcin\n' +
1890 ' username:marcin\n' +
1858 ' action:*push*\n' +
1891 ' action:*push*\n' +
1859 ' ip:127.0.0.1\n' +
1892 ' ip:127.0.0.1\n' +
1860 ' date:20120101\n' +
1893 ' date:20120101\n' +
1861 ' date:[20120101100000 TO 20120102]\n' +
1894 ' date:[20120101100000 TO 20120102]\n' +
1862 '\n' +
1895 '\n' +
1863 'Generate wildcards using \'*\' character:\n' +
1896 'Generate wildcards using \'*\' character:\n' +
1864 ' "repository:vcs*" - search everything starting with \'vcs\'\n' +
1897 ' "repository:vcs*" - search everything starting with \'vcs\'\n' +
1865 ' "repository:*vcs*" - search for repository containing \'vcs\'\n' +
1898 ' "repository:*vcs*" - search for repository containing \'vcs\'\n' +
1866 '\n' +
1899 '\n' +
1867 'Optional AND / OR operators in queries\n' +
1900 'Optional AND / OR operators in queries\n' +
1868 ' "repository:vcs OR repository:test"\n' +
1901 ' "repository:vcs OR repository:test"\n' +
1869 ' "username:test AND repository:test*"\n'
1902 ' "username:test AND repository:test*"\n'
1870 )
1903 )
1871
1904
1872
1905
1873 def not_mapped_error(repo_name):
1906 def not_mapped_error(repo_name):
1874 flash(_('%s repository is not mapped to db perhaps'
1907 flash(_('%s repository is not mapped to db perhaps'
1875 ' it was created or renamed from the filesystem'
1908 ' it was created or renamed from the filesystem'
1876 ' please run the application again'
1909 ' please run the application again'
1877 ' in order to rescan repositories') % repo_name, category='error')
1910 ' in order to rescan repositories') % repo_name, category='error')
1878
1911
1879
1912
1880 def ip_range(ip_addr):
1913 def ip_range(ip_addr):
1881 from rhodecode.model.db import UserIpMap
1914 from rhodecode.model.db import UserIpMap
1882 s, e = UserIpMap._get_ip_range(ip_addr)
1915 s, e = UserIpMap._get_ip_range(ip_addr)
1883 return '%s - %s' % (s, e)
1916 return '%s - %s' % (s, e)
1884
1917
1885
1918
1886 def form(url, method='post', needs_csrf_token=True, **attrs):
1919 def form(url, method='post', needs_csrf_token=True, **attrs):
1887 """Wrapper around webhelpers.tags.form to prevent CSRF attacks."""
1920 """Wrapper around webhelpers.tags.form to prevent CSRF attacks."""
1888 if method.lower() != 'get' and needs_csrf_token:
1921 if method.lower() != 'get' and needs_csrf_token:
1889 raise Exception(
1922 raise Exception(
1890 'Forms to POST/PUT/DELETE endpoints should have (in general) a ' +
1923 'Forms to POST/PUT/DELETE endpoints should have (in general) a ' +
1891 'CSRF token. If the endpoint does not require such token you can ' +
1924 'CSRF token. If the endpoint does not require such token you can ' +
1892 'explicitly set the parameter needs_csrf_token to false.')
1925 'explicitly set the parameter needs_csrf_token to false.')
1893
1926
1894 return wh_form(url, method=method, **attrs)
1927 return wh_form(url, method=method, **attrs)
1895
1928
1896
1929
1897 def secure_form(url, method="POST", multipart=False, **attrs):
1930 def secure_form(url, method="POST", multipart=False, **attrs):
1898 """Start a form tag that points the action to an url. This
1931 """Start a form tag that points the action to an url. This
1899 form tag will also include the hidden field containing
1932 form tag will also include the hidden field containing
1900 the auth token.
1933 the auth token.
1901
1934
1902 The url options should be given either as a string, or as a
1935 The url options should be given either as a string, or as a
1903 ``url()`` function. The method for the form defaults to POST.
1936 ``url()`` function. The method for the form defaults to POST.
1904
1937
1905 Options:
1938 Options:
1906
1939
1907 ``multipart``
1940 ``multipart``
1908 If set to True, the enctype is set to "multipart/form-data".
1941 If set to True, the enctype is set to "multipart/form-data".
1909 ``method``
1942 ``method``
1910 The method to use when submitting the form, usually either
1943 The method to use when submitting the form, usually either
1911 "GET" or "POST". If "PUT", "DELETE", or another verb is used, a
1944 "GET" or "POST". If "PUT", "DELETE", or another verb is used, a
1912 hidden input with name _method is added to simulate the verb
1945 hidden input with name _method is added to simulate the verb
1913 over POST.
1946 over POST.
1914
1947
1915 """
1948 """
1916 from webhelpers.pylonslib.secure_form import insecure_form
1949 from webhelpers.pylonslib.secure_form import insecure_form
1917 form = insecure_form(url, method, multipart, **attrs)
1950 form = insecure_form(url, method, multipart, **attrs)
1918 token = csrf_input()
1951 token = csrf_input()
1919 return literal("%s\n%s" % (form, token))
1952 return literal("%s\n%s" % (form, token))
1920
1953
1921 def csrf_input():
1954 def csrf_input():
1922 return literal(
1955 return literal(
1923 '<input type="hidden" id="{}" name="{}" value="{}">'.format(
1956 '<input type="hidden" id="{}" name="{}" value="{}">'.format(
1924 csrf_token_key, csrf_token_key, get_csrf_token()))
1957 csrf_token_key, csrf_token_key, get_csrf_token()))
1925
1958
1926 def dropdownmenu(name, selected, options, enable_filter=False, **attrs):
1959 def dropdownmenu(name, selected, options, enable_filter=False, **attrs):
1927 select_html = select(name, selected, options, **attrs)
1960 select_html = select(name, selected, options, **attrs)
1928 select2 = """
1961 select2 = """
1929 <script>
1962 <script>
1930 $(document).ready(function() {
1963 $(document).ready(function() {
1931 $('#%s').select2({
1964 $('#%s').select2({
1932 containerCssClass: 'drop-menu',
1965 containerCssClass: 'drop-menu',
1933 dropdownCssClass: 'drop-menu-dropdown',
1966 dropdownCssClass: 'drop-menu-dropdown',
1934 dropdownAutoWidth: true%s
1967 dropdownAutoWidth: true%s
1935 });
1968 });
1936 });
1969 });
1937 </script>
1970 </script>
1938 """
1971 """
1939 filter_option = """,
1972 filter_option = """,
1940 minimumResultsForSearch: -1
1973 minimumResultsForSearch: -1
1941 """
1974 """
1942 input_id = attrs.get('id') or name
1975 input_id = attrs.get('id') or name
1943 filter_enabled = "" if enable_filter else filter_option
1976 filter_enabled = "" if enable_filter else filter_option
1944 select_script = literal(select2 % (input_id, filter_enabled))
1977 select_script = literal(select2 % (input_id, filter_enabled))
1945
1978
1946 return literal(select_html+select_script)
1979 return literal(select_html+select_script)
1947
1980
1948
1981
1949 def get_visual_attr(tmpl_context_var, attr_name):
1982 def get_visual_attr(tmpl_context_var, attr_name):
1950 """
1983 """
1951 A safe way to get a variable from visual variable of template context
1984 A safe way to get a variable from visual variable of template context
1952
1985
1953 :param tmpl_context_var: instance of tmpl_context, usually present as `c`
1986 :param tmpl_context_var: instance of tmpl_context, usually present as `c`
1954 :param attr_name: name of the attribute we fetch from the c.visual
1987 :param attr_name: name of the attribute we fetch from the c.visual
1955 """
1988 """
1956 visual = getattr(tmpl_context_var, 'visual', None)
1989 visual = getattr(tmpl_context_var, 'visual', None)
1957 if not visual:
1990 if not visual:
1958 return
1991 return
1959 else:
1992 else:
1960 return getattr(visual, attr_name, None)
1993 return getattr(visual, attr_name, None)
1961
1994
1962
1995
1963 def get_last_path_part(file_node):
1996 def get_last_path_part(file_node):
1964 if not file_node.path:
1997 if not file_node.path:
1965 return u''
1998 return u''
1966
1999
1967 path = safe_unicode(file_node.path.split('/')[-1])
2000 path = safe_unicode(file_node.path.split('/')[-1])
1968 return u'../' + path
2001 return u'../' + path
1969
2002
1970
2003
1971 def route_path(*args, **kwds):
2004 def route_path(*args, **kwds):
1972 """
2005 """
1973 Wrapper around pyramids `route_path` function. It is used to generate
2006 Wrapper around pyramids `route_path` function. It is used to generate
1974 URLs from within pylons views or templates. This will be removed when
2007 URLs from within pylons views or templates. This will be removed when
1975 pyramid migration if finished.
2008 pyramid migration if finished.
1976 """
2009 """
1977 req = get_current_request()
2010 req = get_current_request()
1978 return req.route_path(*args, **kwds)
2011 return req.route_path(*args, **kwds)
1979
2012
1980
2013
1981 def route_path_or_none(*args, **kwargs):
2014 def route_path_or_none(*args, **kwargs):
1982 try:
2015 try:
1983 return route_path(*args, **kwargs)
2016 return route_path(*args, **kwargs)
1984 except KeyError:
2017 except KeyError:
1985 return None
2018 return None
1986
2019
1987
2020
1988 def static_url(*args, **kwds):
2021 def static_url(*args, **kwds):
1989 """
2022 """
1990 Wrapper around pyramids `route_path` function. It is used to generate
2023 Wrapper around pyramids `route_path` function. It is used to generate
1991 URLs from within pylons views or templates. This will be removed when
2024 URLs from within pylons views or templates. This will be removed when
1992 pyramid migration if finished.
2025 pyramid migration if finished.
1993 """
2026 """
1994 req = get_current_request()
2027 req = get_current_request()
1995 return req.static_url(*args, **kwds)
2028 return req.static_url(*args, **kwds)
1996
2029
1997
2030
1998 def resource_path(*args, **kwds):
2031 def resource_path(*args, **kwds):
1999 """
2032 """
2000 Wrapper around pyramids `route_path` function. It is used to generate
2033 Wrapper around pyramids `route_path` function. It is used to generate
2001 URLs from within pylons views or templates. This will be removed when
2034 URLs from within pylons views or templates. This will be removed when
2002 pyramid migration if finished.
2035 pyramid migration if finished.
2003 """
2036 """
2004 req = get_current_request()
2037 req = get_current_request()
2005 return req.resource_path(*args, **kwds)
2038 return req.resource_path(*args, **kwds)
@@ -1,254 +1,255 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2017 RhodeCode GmbH
3 # Copyright (C) 2010-2017 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 # Import early to make sure things are patched up properly
21 # Import early to make sure things are patched up properly
22 from setuptools import setup, find_packages
22 from setuptools import setup, find_packages
23
23
24 import os
24 import os
25 import sys
25 import sys
26 import pkgutil
26 import pkgutil
27 import platform
27 import platform
28
28
29 from pip.download import PipSession
29 from pip.download import PipSession
30 from pip.req import parse_requirements
30 from pip.req import parse_requirements
31
31
32 from codecs import open
32 from codecs import open
33
33
34
34
35 if sys.version_info < (2, 7):
35 if sys.version_info < (2, 7):
36 raise Exception('RhodeCode requires Python 2.7 or later')
36 raise Exception('RhodeCode requires Python 2.7 or later')
37
37
38 here = os.path.abspath(os.path.dirname(__file__))
38 here = os.path.abspath(os.path.dirname(__file__))
39
39
40 # defines current platform
40 # defines current platform
41 __platform__ = platform.system()
41 __platform__ = platform.system()
42 __license__ = 'AGPLv3, and Commercial License'
42 __license__ = 'AGPLv3, and Commercial License'
43 __author__ = 'RhodeCode GmbH'
43 __author__ = 'RhodeCode GmbH'
44 __url__ = 'https://code.rhodecode.com'
44 __url__ = 'https://code.rhodecode.com'
45 is_windows = __platform__ in ('Windows',)
45 is_windows = __platform__ in ('Windows',)
46
46
47
47
48 def _get_requirements(req_filename, exclude=None, extras=None):
48 def _get_requirements(req_filename, exclude=None, extras=None):
49 extras = extras or []
49 extras = extras or []
50 exclude = exclude or []
50 exclude = exclude or []
51
51
52 try:
52 try:
53 parsed = parse_requirements(
53 parsed = parse_requirements(
54 os.path.join(here, req_filename), session=PipSession())
54 os.path.join(here, req_filename), session=PipSession())
55 except TypeError:
55 except TypeError:
56 # try pip < 6.0.0, that doesn't support session
56 # try pip < 6.0.0, that doesn't support session
57 parsed = parse_requirements(os.path.join(here, req_filename))
57 parsed = parse_requirements(os.path.join(here, req_filename))
58
58
59 requirements = []
59 requirements = []
60 for ir in parsed:
60 for ir in parsed:
61 if ir.req and ir.name not in exclude:
61 if ir.req and ir.name not in exclude:
62 requirements.append(str(ir.req))
62 requirements.append(str(ir.req))
63 return requirements + extras
63 return requirements + extras
64
64
65
65
66 # requirements extract
66 # requirements extract
67 setup_requirements = ['PasteScript', 'pytest-runner']
67 setup_requirements = ['PasteScript', 'pytest-runner']
68 install_requirements = _get_requirements(
68 install_requirements = _get_requirements(
69 'requirements.txt', exclude=['setuptools'])
69 'requirements.txt', exclude=['setuptools'])
70 test_requirements = _get_requirements(
70 test_requirements = _get_requirements(
71 'requirements_test.txt', extras=['configobj'])
71 'requirements_test.txt', extras=['configobj'])
72
72
73 install_requirements = [
73 install_requirements = [
74 'Babel',
74 'Babel',
75 'Beaker',
75 'Beaker',
76 'FormEncode',
76 'FormEncode',
77 'Mako',
77 'Mako',
78 'Markdown',
78 'Markdown',
79 'MarkupSafe',
79 'MarkupSafe',
80 'MySQL-python',
80 'MySQL-python',
81 'Paste',
81 'Paste',
82 'PasteDeploy',
82 'PasteDeploy',
83 'PasteScript',
83 'PasteScript',
84 'Pygments',
84 'Pygments',
85 'pygments-markdown-lexer',
85 'pygments-markdown-lexer',
86 'Pylons',
86 'Pylons',
87 'Routes',
87 'Routes',
88 'SQLAlchemy',
88 'SQLAlchemy',
89 'Tempita',
89 'Tempita',
90 'URLObject',
90 'URLObject',
91 'WebError',
91 'WebError',
92 'WebHelpers',
92 'WebHelpers',
93 'WebHelpers2',
93 'WebHelpers2',
94 'WebOb',
94 'WebOb',
95 'WebTest',
95 'WebTest',
96 'Whoosh',
96 'Whoosh',
97 'alembic',
97 'alembic',
98 'amqplib',
98 'amqplib',
99 'anyjson',
99 'anyjson',
100 'appenlight-client',
100 'appenlight-client',
101 'authomatic',
101 'authomatic',
102 'backport_ipaddress',
102 'backport_ipaddress',
103 'celery',
103 'celery',
104 'channelstream',
104 'channelstream',
105 'colander',
105 'colander',
106 'decorator',
106 'decorator',
107 'deform',
107 'deform',
108 'docutils',
108 'docutils',
109 'gevent',
109 'gevent',
110 'gunicorn',
110 'gunicorn',
111 'infrae.cache',
111 'infrae.cache',
112 'ipython',
112 'ipython',
113 'iso8601',
113 'iso8601',
114 'kombu',
114 'kombu',
115 'msgpack-python',
115 'msgpack-python',
116 'nbconvert',
116 'packaging',
117 'packaging',
117 'psycopg2',
118 'psycopg2',
118 'py-gfm',
119 'py-gfm',
119 'pycrypto',
120 'pycrypto',
120 'pycurl',
121 'pycurl',
121 'pyparsing',
122 'pyparsing',
122 'pyramid',
123 'pyramid',
123 'pyramid-debugtoolbar',
124 'pyramid-debugtoolbar',
124 'pyramid-mako',
125 'pyramid-mako',
125 'pyramid-beaker',
126 'pyramid-beaker',
126 'pysqlite',
127 'pysqlite',
127 'python-dateutil',
128 'python-dateutil',
128 'python-ldap',
129 'python-ldap',
129 'python-memcached',
130 'python-memcached',
130 'python-pam',
131 'python-pam',
131 'recaptcha-client',
132 'recaptcha-client',
132 'repoze.lru',
133 'repoze.lru',
133 'requests',
134 'requests',
134 'simplejson',
135 'simplejson',
135 'subprocess32',
136 'subprocess32',
136 'waitress',
137 'waitress',
137 'zope.cachedescriptors',
138 'zope.cachedescriptors',
138 'dogpile.cache',
139 'dogpile.cache',
139 'dogpile.core',
140 'dogpile.core',
140 'psutil',
141 'psutil',
141 'py-bcrypt',
142 'py-bcrypt',
142 ]
143 ]
143
144
144
145
145 def get_version():
146 def get_version():
146 version = pkgutil.get_data('rhodecode', 'VERSION')
147 version = pkgutil.get_data('rhodecode', 'VERSION')
147 return version.strip()
148 return version.strip()
148
149
149
150
150 # additional files that goes into package itself
151 # additional files that goes into package itself
151 package_data = {
152 package_data = {
152 '': ['*.txt', '*.rst'],
153 '': ['*.txt', '*.rst'],
153 'configs': ['*.ini'],
154 'configs': ['*.ini'],
154 'rhodecode': ['VERSION', 'i18n/*/LC_MESSAGES/*.mo', ],
155 'rhodecode': ['VERSION', 'i18n/*/LC_MESSAGES/*.mo', ],
155 }
156 }
156
157
157 description = 'Source Code Management Platform'
158 description = 'Source Code Management Platform'
158 keywords = ' '.join([
159 keywords = ' '.join([
159 'rhodecode', 'mercurial', 'git', 'svn',
160 'rhodecode', 'mercurial', 'git', 'svn',
160 'code review',
161 'code review',
161 'repo groups', 'ldap', 'repository management', 'hgweb',
162 'repo groups', 'ldap', 'repository management', 'hgweb',
162 'hgwebdir', 'gitweb', 'serving hgweb',
163 'hgwebdir', 'gitweb', 'serving hgweb',
163 ])
164 ])
164
165
165
166
166 # README/DESCRIPTION generation
167 # README/DESCRIPTION generation
167 readme_file = 'README.rst'
168 readme_file = 'README.rst'
168 changelog_file = 'CHANGES.rst'
169 changelog_file = 'CHANGES.rst'
169 try:
170 try:
170 long_description = open(readme_file).read() + '\n\n' + \
171 long_description = open(readme_file).read() + '\n\n' + \
171 open(changelog_file).read()
172 open(changelog_file).read()
172 except IOError as err:
173 except IOError as err:
173 sys.stderr.write(
174 sys.stderr.write(
174 "[WARNING] Cannot find file specified as long_description (%s)\n "
175 "[WARNING] Cannot find file specified as long_description (%s)\n "
175 "or changelog (%s) skipping that file" % (readme_file, changelog_file))
176 "or changelog (%s) skipping that file" % (readme_file, changelog_file))
176 long_description = description
177 long_description = description
177
178
178
179
179 setup(
180 setup(
180 name='rhodecode-enterprise-ce',
181 name='rhodecode-enterprise-ce',
181 version=get_version(),
182 version=get_version(),
182 description=description,
183 description=description,
183 long_description=long_description,
184 long_description=long_description,
184 keywords=keywords,
185 keywords=keywords,
185 license=__license__,
186 license=__license__,
186 author=__author__,
187 author=__author__,
187 author_email='marcin@rhodecode.com',
188 author_email='marcin@rhodecode.com',
188 url=__url__,
189 url=__url__,
189 setup_requires=setup_requirements,
190 setup_requires=setup_requirements,
190 install_requires=install_requirements,
191 install_requires=install_requirements,
191 tests_require=test_requirements,
192 tests_require=test_requirements,
192 zip_safe=False,
193 zip_safe=False,
193 packages=find_packages(exclude=["docs", "tests*"]),
194 packages=find_packages(exclude=["docs", "tests*"]),
194 package_data=package_data,
195 package_data=package_data,
195 include_package_data=True,
196 include_package_data=True,
196 classifiers=[
197 classifiers=[
197 'Development Status :: 6 - Mature',
198 'Development Status :: 6 - Mature',
198 'Environment :: Web Environment',
199 'Environment :: Web Environment',
199 'Intended Audience :: Developers',
200 'Intended Audience :: Developers',
200 'Operating System :: OS Independent',
201 'Operating System :: OS Independent',
201 'Topic :: Software Development :: Version Control',
202 'Topic :: Software Development :: Version Control',
202 'License :: OSI Approved :: Affero GNU General Public License v3 or later (AGPLv3+)',
203 'License :: OSI Approved :: Affero GNU General Public License v3 or later (AGPLv3+)',
203 'Programming Language :: Python :: 2.7',
204 'Programming Language :: Python :: 2.7',
204 ],
205 ],
205 message_extractors={
206 message_extractors={
206 'rhodecode': [
207 'rhodecode': [
207 ('**.py', 'python', None),
208 ('**.py', 'python', None),
208 ('**.js', 'javascript', None),
209 ('**.js', 'javascript', None),
209 ('templates/**.mako', 'mako', {'input_encoding': 'utf-8'}),
210 ('templates/**.mako', 'mako', {'input_encoding': 'utf-8'}),
210 ('templates/**.html', 'mako', {'input_encoding': 'utf-8'}),
211 ('templates/**.html', 'mako', {'input_encoding': 'utf-8'}),
211 ('public/**', 'ignore', None),
212 ('public/**', 'ignore', None),
212 ]
213 ]
213 },
214 },
214 paster_plugins=['PasteScript', 'Pylons'],
215 paster_plugins=['PasteScript', 'Pylons'],
215 entry_points={
216 entry_points={
216 'enterprise.plugins1': [
217 'enterprise.plugins1': [
217 'crowd=rhodecode.authentication.plugins.auth_crowd:plugin_factory',
218 'crowd=rhodecode.authentication.plugins.auth_crowd:plugin_factory',
218 'headers=rhodecode.authentication.plugins.auth_headers:plugin_factory',
219 'headers=rhodecode.authentication.plugins.auth_headers:plugin_factory',
219 'jasig_cas=rhodecode.authentication.plugins.auth_jasig_cas:plugin_factory',
220 'jasig_cas=rhodecode.authentication.plugins.auth_jasig_cas:plugin_factory',
220 'ldap=rhodecode.authentication.plugins.auth_ldap:plugin_factory',
221 'ldap=rhodecode.authentication.plugins.auth_ldap:plugin_factory',
221 'pam=rhodecode.authentication.plugins.auth_pam:plugin_factory',
222 'pam=rhodecode.authentication.plugins.auth_pam:plugin_factory',
222 'rhodecode=rhodecode.authentication.plugins.auth_rhodecode:plugin_factory',
223 'rhodecode=rhodecode.authentication.plugins.auth_rhodecode:plugin_factory',
223 'token=rhodecode.authentication.plugins.auth_token:plugin_factory',
224 'token=rhodecode.authentication.plugins.auth_token:plugin_factory',
224 ],
225 ],
225 'paste.app_factory': [
226 'paste.app_factory': [
226 'main=rhodecode.config.middleware:make_pyramid_app',
227 'main=rhodecode.config.middleware:make_pyramid_app',
227 'pylons=rhodecode.config.middleware:make_app',
228 'pylons=rhodecode.config.middleware:make_app',
228 ],
229 ],
229 'paste.app_install': [
230 'paste.app_install': [
230 'main=pylons.util:PylonsInstaller',
231 'main=pylons.util:PylonsInstaller',
231 'pylons=pylons.util:PylonsInstaller',
232 'pylons=pylons.util:PylonsInstaller',
232 ],
233 ],
233 'paste.global_paster_command': [
234 'paste.global_paster_command': [
234 'make-config=rhodecode.lib.paster_commands.make_config:Command',
235 'make-config=rhodecode.lib.paster_commands.make_config:Command',
235 'setup-rhodecode=rhodecode.lib.paster_commands.setup_rhodecode:Command',
236 'setup-rhodecode=rhodecode.lib.paster_commands.setup_rhodecode:Command',
236 'update-repoinfo=rhodecode.lib.paster_commands.update_repoinfo:Command',
237 'update-repoinfo=rhodecode.lib.paster_commands.update_repoinfo:Command',
237 'cache-keys=rhodecode.lib.paster_commands.cache_keys:Command',
238 'cache-keys=rhodecode.lib.paster_commands.cache_keys:Command',
238 'ishell=rhodecode.lib.paster_commands.ishell:Command',
239 'ishell=rhodecode.lib.paster_commands.ishell:Command',
239 'upgrade-db=rhodecode.lib.dbmigrate:UpgradeDb',
240 'upgrade-db=rhodecode.lib.dbmigrate:UpgradeDb',
240 'celeryd=rhodecode.lib.celerypylons.commands:CeleryDaemonCommand',
241 'celeryd=rhodecode.lib.celerypylons.commands:CeleryDaemonCommand',
241 ],
242 ],
242 'pytest11': [
243 'pytest11': [
243 'pylons=rhodecode.tests.pylons_plugin',
244 'pylons=rhodecode.tests.pylons_plugin',
244 'enterprise=rhodecode.tests.plugin',
245 'enterprise=rhodecode.tests.plugin',
245 ],
246 ],
246 'console_scripts': [
247 'console_scripts': [
247 'rcserver=rhodecode.rcserver:main',
248 'rcserver=rhodecode.rcserver:main',
248 ],
249 ],
249 'beaker.backends': [
250 'beaker.backends': [
250 'memorylru_base=rhodecode.lib.memory_lru_debug:MemoryLRUNamespaceManagerBase',
251 'memorylru_base=rhodecode.lib.memory_lru_debug:MemoryLRUNamespaceManagerBase',
251 'memorylru_debug=rhodecode.lib.memory_lru_debug:MemoryLRUNamespaceManagerDebug'
252 'memorylru_debug=rhodecode.lib.memory_lru_debug:MemoryLRUNamespaceManagerDebug'
252 ]
253 ]
253 },
254 },
254 )
255 )
General Comments 0
You need to be logged in to leave comments. Login now