Coverage for .tox/coverage/lib/python3.11/site-packages/wuttaweb/cli/webapp.py: 100%

26 statements  

« prev     ^ index     » next       coverage.py v7.6.10, created at 2024-12-28 21:19 -0600

1# -*- coding: utf-8; -*- 

2################################################################################ 

3# 

4# wuttaweb -- Web App for Wutta Framework 

5# Copyright © 2024 Lance Edgar 

6# 

7# This file is part of Wutta Framework. 

8# 

9# Wutta Framework is free software: you can redistribute it and/or modify it 

10# under the terms of the GNU General Public License as published by the Free 

11# Software Foundation, either version 3 of the License, or (at your option) any 

12# later version. 

13# 

14# Wutta Framework is distributed in the hope that it will be useful, but 

15# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 

16# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 

17# more details. 

18# 

19# You should have received a copy of the GNU General Public License along with 

20# Wutta Framework. If not, see <http://www.gnu.org/licenses/>. 

21# 

22################################################################################ 

23""" 

24See also: :ref:`wutta-webapp` 

25""" 

26 

27import os 

28import sys 

29from typing_extensions import Annotated 

30 

31import typer 

32from pyramid.scripts import pserve 

33 

34from wuttjamaican.cli import wutta_typer 

35 

36 

37@wutta_typer.command() 

38def webapp( 

39 ctx: typer.Context, 

40 auto_reload: Annotated[ 

41 bool, 

42 typer.Option('--reload', '-r', 

43 help="Auto-reload web app when files change.")] = False, 

44): 

45 """ 

46 Run the configured web app 

47 """ 

48 config = ctx.parent.wutta_config 

49 

50 # we'll need config file(s) to specify for web app 

51 if not config.files_read: 

52 sys.stderr.write("no config files found!\n") 

53 sys.exit(1) 

54 

55 runner = config.get(f'{config.appname}.web.app.runner', default='pserve') 

56 if runner == 'pserve': 

57 

58 # run pserve 

59 argv = ['pserve', f'file+ini:{config.files_read[0]}'] 

60 if ctx.params['auto_reload']: 

61 argv.append('--reload') 

62 pserve.main(argv=argv) 

63 

64 elif runner == 'uvicorn': 

65 

66 import uvicorn 

67 

68 # need service details from config 

69 spec = config.require(f'{config.appname}.web.app.spec') 

70 kw = { 

71 'host': config.get(f'{config.appname}.web.app.host', default='127.0.0.1'), 

72 'port': config.get_int(f'{config.appname}.web.app.port', default=8000), 

73 'reload': ctx.params['auto_reload'], 

74 'reload_dirs': config.get_list(f'{config.appname}.web.app.reload_dirs'), 

75 'factory': config.get_bool(f'{config.appname}.web.app.factory', default=False), 

76 'interface': config.get(f'{config.appname}.web.app.interface', default='auto'), 

77 } 

78 

79 # also must inject our config files to env, since there is no 

80 # other way to specify when running via uvicorn 

81 os.environ['WUTTA_CONFIG_FILES'] = os.pathsep.join(config.files_read) 

82 

83 # run uvicorn 

84 uvicorn.run(spec, **kw) 

85 

86 else: 

87 sys.stderr.write(f"unknown web app runner: {runner}\n") 

88 sys.exit(2)