Coverage for gws-app/gws/lib/vendor/dog/server.py: 0%
60 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-16 22:59 +0200
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-16 22:59 +0200
1import livereload
3from . import builder, util
4from .options import Options
7class Server:
8 liveServer: livereload.Server
10 def __init__(self, opts: Options | dict):
11 self.b = builder.Builder(opts)
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 script = f'<script src="//{self.b.options.serverHost}:{self.b.options.serverPort}/livereload.js?port={self.b.options.serverPort}"></script>'
27 content = str(content) + '\n' + script
29 if isinstance(content, str):
30 content = content.encode('utf8')
32 headers = [
33 ('Content-type', mime),
34 ('Cache-Control', 'must-revalidate, max-age=0, no-cache, no-store'),
35 ('Expires', 'Tue, 01 Jan 1980 12:34:56 GMT'),
36 ('Content-Length', len(content))
37 ]
38 start_response('200 OK', headers)
39 return [content]
41 def rebuild(self):
42 util.time_start('rebuild')
43 self.b.build_html(write=False)
44 util.time_end()
46 def watch_docs(self, args=None):
47 util.log.debug(f'watch_docs: {args!r}')
48 if args:
49 self.rebuild()
51 def watch_assets(self, args=None):
52 util.log.debug(f'watch_assets: {args!r}')
54 def initialize(self):
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 def start(self):
84 self.rebuild()
85 self.initialize()
87 util.log.info(f'http://{self.b.options.serverHost}:{self.b.options.serverPort}{self.b.options.webRoot}/')
89 self.liveServer.serve(
90 host=self.b.options.serverHost,
91 port=self.b.options.serverPort,
92 debug=True,
93 restart_delay=1,
94 open_url_delay=None,
95 )