Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: run_tests.py

Issue 4895499043733504: Issue 510 - [Typed objects] Don`t hardcode script load order in unit tests (Closed)
Patch Set: Created Jan. 10, 2015, 12:13 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # coding: utf-8 2 # coding: utf-8
3 3
4 # This file is part of Adblock Plus <http://adblockplus.org/>, 4 # This file is part of Adblock Plus <http://adblockplus.org/>,
5 # Copyright (C) 2006-2014 Eyeo GmbH 5 # Copyright (C) 2006-2014 Eyeo GmbH
6 # 6 #
7 # Adblock Plus is free software: you can redistribute it and/or modify 7 # Adblock Plus is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License version 3 as 8 # it under the terms of the GNU General Public License version 3 as
9 # published by the Free Software Foundation. 9 # published by the Free Software Foundation.
10 # 10 #
11 # Adblock Plus is distributed in the hope that it will be useful, 11 # Adblock Plus is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details. 14 # GNU General Public License for more details.
15 # 15 #
16 # You should have received a copy of the GNU General Public License 16 # You should have received a copy of the GNU General Public License
17 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. 17 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
18 18
19 import flask 19 import flask
20 import os 20 import os
21 import re 21 import re
22 from urlparse import urlparse 22 import io
Felix Dahlke 2015/02/03 06:21:16 Nit: The import statements seem to be ordered alph
Sebastian Noack 2015/02/03 09:21:10 Note that according to PEP-8, third-party module i
Wladimir Palant 2015/02/03 16:26:04 Done.
23 import urlparse
23 24
24 app = flask.Flask(__name__) 25 app = flask.Flask(__name__)
25 26
27 def get_scripts(dir, reldir = ""):
Felix Dahlke 2015/02/03 06:21:16 This would be a bit shorter (and IMHO easier to re
Sebastian Noack 2015/02/03 09:21:10 Even more compact: import glob ... def get_scri
Wladimir Palant 2015/02/03 16:26:04 This won't find anything in subdirectories. Perso
28 for name in os.listdir(dir):
29 path = os.path.join(dir, name)
30 relpath = reldir + "/" + name
31 if os.path.isdir(path):
32 for path, relpath in get_scripts(path, relpath):
33 yield (path, relpath)
34 elif os.path.splitext(path)[1] == ".js":
35 yield (path, relpath)
36
26 def js_encode(str): 37 def js_encode(str):
27 return re.sub(r"(['\\])", r"\\\1", str) 38 return (str.replace("\\", "\\\\").replace("'", "\\'")
39 .replace("\r", "\\r").replace("\n", "\\n"))
Felix Dahlke 2015/02/03 06:21:16 Makes me wonder if we'll run into trouble when usi
Wladimir Palant 2015/02/03 16:26:04 No, these should be fine within a string. See http
40
41 def script_as_string(path, sourceURL, backcompat):
42 if backcompat:
43 from jshydra.abp_rewrite import doRewrite
44 data = doRewrite([os.path.abspath(path)], []).decode("utf-8")
45 else:
46 with io.open(path, "r", encoding="utf-8") as handle:
47 data = handle.read()
48 data += "\n//# sourceURL=%s" % sourceURL
49 return js_encode(data)
28 50
29 @app.route("/<path:path>", methods = ["GET"]) 51 @app.route("/<path:path>", methods = ["GET"])
30 @app.route("/", methods = ["GET"]) 52 @app.route("/", methods = ["GET"])
31 def multiplex(path=""): 53 def multiplex(path=""):
32 request_url = urlparse(flask.request.url) 54 request_url = urlparse.urlparse(flask.request.url)
33 request_path = request_url.path 55 request_path = request_url.path
34 islib = request_path.startswith("/lib/") 56 islib = request_path.startswith("/lib/")
35 backcompat = request_url.query == "backcompat" 57 backcompat = request_url.query == "backcompat"
36 58
37 rootdir = os.path.dirname(__file__) 59 rootdir = os.path.dirname(__file__)
38 if not islib: 60 if request_path == "/lib.js":
39 rootdir = os.path.join("test") 61 data = ""
40 62 for path, relpath in get_scripts(os.path.join(rootdir, "lib")):
41 if islib or backcompat: 63 url = urlparse.urljoin(flask.request.url, "/lib" + relpath)
42 path = flask.safe_join(rootdir, request_path.lstrip("/")) 64 data += "require.modules['%s'] = '%s';\n" % (
43 if not os.path.isfile(path): 65 os.path.splitext(relpath)[0][1:],
44 return flask.abort(404) 66 script_as_string(path, url, backcompat)
45 67 )
46 module = os.path.splitext(request_path[len("/lib/"):])[0] 68 return (data, 200, {"Content-Type": "application/javascript; charset=utf-8"} )
47 if backcompat: 69 elif request_path == "/tests.js":
48 from jshydra.abp_rewrite import doRewrite 70 data = "var tests = ["
49 data = doRewrite([os.path.abspath(path)], ["module=true"] if islib else [] ) 71 for path, relpath in get_scripts(os.path.join(rootdir, "test", "tests")):
50 data = re.sub(r"require\.scopes\[.*?\]", "require.scopes['%s']" % module, data) 72 url = urlparse.urljoin(flask.request.url, "/tests" + relpath)
51 else: 73 data += " '%s',\n" % script_as_string(path, url, backcompat)
52 with open(path, "rb") as file: 74 data += "];"
53 data = "require.scopes['%s'] = function(){var exports={};%s\nreturn expo rts;}();" % (module, file.read())
54 return (data, 200, {"Content-Type": "application/javascript; charset=utf-8"} ) 75 return (data, 200, {"Content-Type": "application/javascript; charset=utf-8"} )
55 else: 76 else:
77 if request_path.startswith("/lib/"):
78 rootdir = os.path.join(rootdir, "lib")
79 else:
80 rootdir = os.path.join(rootdir, "test")
56 if request_path.endswith("/"): 81 if request_path.endswith("/"):
57 request_path += "index.html" 82 request_path += "index.html"
58 return flask.send_from_directory(rootdir, request_path.lstrip("/")) 83 return flask.send_from_directory(rootdir, request_path.lstrip("/"))
59 84
60 if __name__ == "__main__": 85 if __name__ == "__main__":
61 app.run(debug=True) 86 app.run(debug=True)
OLDNEW

Powered by Google App Engine
This is Rietveld