import time
import traceback
import base64
+
from tvcm import parse_deps
+from tvcm import project as project_module
from tvcm import generate
+from tvcm import resource_loader
import SocketServer
import SimpleHTTPServer
DEPS_CHECK_DELAY = 30
-def find_all_js_module_filenames(search_paths):
- all_filenames = []
-
- def ignored(x):
- if os.path.basename(x).startswith('.'):
- return True
- if os.path.splitext(x)[1] != ".js":
- return True
- return False
-
- for search_path in search_paths:
- for dirpath, dirnames, filenames in os.walk(search_path):
- for f in filenames:
- x = os.path.join(dirpath, f)
- if ignored(x):
- continue
- all_filenames.append(os.path.relpath(x, search_path))
-
- return all_filenames
-
class DevServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def __init__(self, *args, **kwargs):
SimpleHTTPServer.SimpleHTTPRequestHandler.__init__(self, *args, **kwargs)
def translate_path(self, path):
path = path.split('?',1)[0]
path = path.split('#',1)[0]
- for mapping in self.server.mapped_paths:
- if path.startswith(mapping.mapped_path):
- rel = os.path.relpath(path, mapping.mapped_path)
- return os.path.join(mapping.file_system_path, rel)
+ for mapped_path in self.server.project.source_paths:
+ rel = os.path.relpath(path, '/')
+ candidate = os.path.join(mapped_path, rel)
+ if os.path.exists(candidate):
+ return candidate
return ''
def log_error(self, format, *args):
+ if self.server._quiet:
+ return
if self.path == '/favicon.ico':
return
self.log_message("While processing %s: ", self.path)
# Dont spam the console unless it is important.
pass
-
def do_GET_json_tests(self):
- def is_test(x):
- basename = os.path.basename(x)
- if basename.startswith('.'):
- return False
-
- if basename.endswith('_test.js'):
- return True
- return False
-
- test_filenames = []
- for mapping in self.server.mapped_paths:
- for dirpath, dirnames, filenames in os.walk(mapping.file_system_path):
- for f in filenames:
- x = os.path.join(dirpath, f)
- y = os.path.join(mapping.mapped_path, os.path.relpath(x, mapping.file_system_path))
- if is_test(y):
- test_filenames.append(y)
+ test_module_names = self.server.project.FindAllTestModuleNames()
- test_filenames.sort()
-
- tests_as_json = json.dumps(test_filenames)
+ tests = {'test_module_names': test_module_names,
+ 'test_links': self.server.test_links}
+ tests_as_json = json.dumps(tests);
self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.end_headers()
self.wfile.write(tests_as_json)
+
def do_GET_deps(self):
try:
self.server.update_deps_and_templates()
return True
return False
-class MappedPath(object):
- def __init__(self, mapped_path, file_system_path, is_source):
- assert mapped_path.startswith('/')
- self.mapped_path = mapped_path
- self.file_system_path = file_system_path
- self.is_source = is_source
-
def do_GET_root(request):
request.send_response(301)
request.send_header("Location", request.server.default_path)
request.end_headers()
class DevServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
- def __init__(self, port):
+ def __init__(self, port, quiet=False, project=None):
BaseHTTPServer.HTTPServer.__init__(self, ('', port), DevServerHandler)
+ self._quiet = quiet
+ if port == 0:
+ port = self.server_address[1]
self._port = port
self._path_handlers = []
- self._mapped_paths = []
+ self._test_links = []
+ if project:
+ self._project = project
+ else:
+ self._project = project_module.Project([])
self._next_deps_check = -1
self.deps = None
self.AddPathHandler('/', do_GET_root)
self.AddPathHandler('', do_GET_root)
- self.default_path = '/src/tests.html' # TODO(nduca): This could be cleaner.
+ self.default_path = '/tvcm/tests.html'
- self.AddPathHandler('/json/tests', do_GET_json_tests)
- self.AddPathHandler('/templates', do_GET_templates)
- self.AddPathHandler('/deps.js', do_GET_deps)
+ # Redirect old tests.html places to the new location until folks have gotten used to its new
+ # location.
+ self.AddPathHandler('/src/tests.html', do_GET_root)
+ self.AddPathHandler('/tests.html', do_GET_root)
+
+ self.AddPathHandler('/tvcm/json/tests', do_GET_json_tests)
+ self.AddPathHandler('/tvcm/all_templates.html', do_GET_templates)
+ self.AddPathHandler('/tvcm/deps.js', do_GET_deps)
def AddPathHandler(self, path, handler, supports_get=True, supports_post=False):
self._path_handlers.append(PathHandler(path, handler, supports_get, supports_post))
return h.handler
return None
- def AddSourcePathMapping(self, mapped_path, file_system_path):
- self._mapped_paths.append(MappedPath(mapped_path, file_system_path, is_source=True))
+ def AddSourcePathMapping(self, file_system_path):
+ self._project.AddSourcePath(file_system_path)
+
+ def AddTestLink(self, path, title):
+ self._test_links.append({'path': path,
+ 'title': title})
- def AddDataPathMapping(self, mapped_path, file_system_path):
- self._mapped_paths.append(MappedPath(mapped_path, file_system_path, is_source=False))
+ @property
+ def test_links(self):
+ return self._test_links
@property
- def mapped_paths(self):
- return self._mapped_paths
+ def project(self):
+ return self._project
def update_deps_and_templates(self):
current_time = time.time()
if self._next_deps_check >= current_time:
return
- print 'Regenerating deps and templates'
- search_paths = [mapping.file_system_path for mapping in self._mapped_paths
- if mapping.is_source]
- all_js_module_filenames = find_all_js_module_filenames(search_paths)
- load_sequence = parse_deps.calc_load_sequence(
- all_js_module_filenames, search_paths)
- self.deps = generate.generate_deps_js(load_sequence)
+ if not self._quiet:
+ sys.stderr.write('Regenerating deps and templates\n')
+
+ load_sequence = self.project.calc_load_sequence()
+ self.deps = generate.generate_deps_js(
+ load_sequence, self.project)
self.templates = generate.generate_html_for_combined_templates(
load_sequence)
self._next_deps_check = current_time + DEPS_CHECK_DELAY
+ @property
+ def port(self):
+ return self._port
+
def serve_forever(self):
- sys.stderr.write("Now running on http://localhost:%i\n" % self._port)
+ if not self._quiet:
+ sys.stderr.write("Now running on http://localhost:%i\n" % self._port)
BaseHTTPServer.HTTPServer.serve_forever(self)