Coverage for gws-app/gws/lib/vendor/dog/server.py: 0%
58 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
1import livereload
3from . import builder, util
4from .options import Options
7class Server:
8 def __init__(self, opts: Options | dict):
9 self.b = builder.Builder(opts)
10 self.liveServer = None
11 self.liveScript = f'<script src="//{self.b.options.serverHost}:{self.b.options.serverPort}/livereload.js?port={self.b.options.serverPort}"></script>'
13 def app(self, env, start_response):
15 url = env['PATH_INFO']
16 if url.endswith('/'):
17 url += 'index.html'
19 res = self.b.content_for_url(url)
20 if not res:
21 start_response('404 Not Found', [('Content-type', 'text/html')])
22 return [b'Not Found']
24 mime, content = res
25 if mime == 'text/html':
26 content += self.liveScript
28 if isinstance(content, str):
29 content = content.encode('utf8')
30 headers = [
31 ('Content-type', mime),
32 ('Cache-Control', 'must-revalidate, max-age=0, no-cache, no-store'),
33 ('Expires', 'Tue, 01 Jan 1980 12:34:56 GMT'),
34 ('Content-Length', len(content))
35 ]
36 start_response('200 OK', headers)
37 return [content]
39 def rebuild(self):
40 util.time_start('rebuild')
41 self.b.build_html(write=False)
42 util.time_end()
44 def watch_docs(self, args=None):
45 util.log.debug(f'watch_docs: {args!r}')
46 if args:
47 self.rebuild()
49 def watch_assets(self, args=None):
50 util.log.debug(f'watch_assets: {args!r}')
52 def start(self):
53 self.rebuild()
55 self.liveServer = livereload.Server(self.app)
57 for root in self.b.options.docRoots:
58 for p in self.b.options.docPatterns:
59 path = root + '/**/' + p
60 self.liveServer.watch(path, self.watch_docs, delay=0.1)
61 util.log.info(f'watching {path}')
63 for path in self.b.assetPaths:
64 self.liveServer.watch(path, self.watch_assets, delay=0.1)
66 for path in self.b.options.extraAssets:
67 self.liveServer.watch(path, self.watch_assets, delay=0.1)
69 try:
70 self.liveServer.setHeader('Access-Control-Allow-Origin', '*')
71 self.liveServer.setHeader('Access-Control-Allow-Methods', '*')
72 except AttributeError:
73 pass
75 # hack around https://github.com/lepture/python-livereload/issues/176
76 import tornado.autoreload
77 class ListNoAppend(list):
78 def append(self, x):
79 pass
81 tornado.autoreload._reload_hooks = ListNoAppend()
83 util.log.info(f'http://{self.b.options.serverHost}:{self.b.options.serverPort}{self.b.options.webRoot}/')
85 self.liveServer.serve(
86 host=self.b.options.serverHost,
87 port=self.b.options.serverPort,
88 debug=True,
89 restart_delay=1,
90 open_url_delay=None,
91 )