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

1import livereload 

2 

3from . import builder, util 

4from .options import Options 

5 

6 

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>' 

12 

13 def app(self, env, start_response): 

14 

15 url = env['PATH_INFO'] 

16 if url.endswith('/'): 

17 url += 'index.html' 

18 

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'] 

23 

24 mime, content = res 

25 if mime == 'text/html': 

26 content += self.liveScript 

27 

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] 

38 

39 def rebuild(self): 

40 util.time_start('rebuild') 

41 self.b.build_html(write=False) 

42 util.time_end() 

43 

44 def watch_docs(self, args=None): 

45 util.log.debug(f'watch_docs: {args!r}') 

46 if args: 

47 self.rebuild() 

48 

49 def watch_assets(self, args=None): 

50 util.log.debug(f'watch_assets: {args!r}') 

51 

52 def start(self): 

53 self.rebuild() 

54 

55 self.liveServer = livereload.Server(self.app) 

56 

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}') 

62 

63 for path in self.b.assetPaths: 

64 self.liveServer.watch(path, self.watch_assets, delay=0.1) 

65 

66 for path in self.b.options.extraAssets: 

67 self.liveServer.watch(path, self.watch_assets, delay=0.1) 

68 

69 try: 

70 self.liveServer.setHeader('Access-Control-Allow-Origin', '*') 

71 self.liveServer.setHeader('Access-Control-Allow-Methods', '*') 

72 except AttributeError: 

73 pass 

74 

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 

80 

81 tornado.autoreload._reload_hooks = ListNoAppend() 

82 

83 util.log.info(f'http://{self.b.options.serverHost}:{self.b.options.serverPort}{self.b.options.webRoot}/') 

84 

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 )