Coverage for src/lexigram/web/cli/generators/resource.py: 60%

25 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-25 04:37 +0800

1"""Resource generator for the web package.""" 

2 

3from __future__ import annotations 

4 

5from pathlib import Path 

6from typing import Any 

7 

8from lexigram.codegen import ( 

9 GenerationResult, 

10 ModelGenerator, 

11 ServiceGenerator, 

12) 

13from lexigram.web.cli.generators.controller import ControllerGenerator 

14 

15 

16class ResourceGenerator: 

17 """Generate a model, service, and web controller slice.""" 

18 

19 name = "resource" 

20 description = "Generate resource" 

21 default_output_dir = "src" 

22 model_generator_class = ModelGenerator 

23 service_generator_class = ServiceGenerator 

24 controller_generator_class = ControllerGenerator 

25 

26 def __init__( 

27 self, 

28 output_dir: str = "src", 

29 model_generator_class: type[Any] | None = None, 

30 service_generator_class: type[Any] | None = None, 

31 ) -> None: 

32 self.output_dir = Path(output_dir) 

33 if model_generator_class is not None: 

34 self.model_generator_class = model_generator_class 

35 if service_generator_class is not None: 

36 self.service_generator_class = service_generator_class 

37 

38 def generate( 

39 self, 

40 name: str, 

41 *, 

42 dry_run: bool = False, 

43 force: bool = False, 

44 **kwargs: object, 

45 ) -> GenerationResult: 

46 fields_str = str(kwargs.get("fields_str", "")) 

47 model_result = self.model_generator_class( 

48 output_dir=self.output_dir / "models", 

49 ).generate( 

50 name, 

51 fields_str=fields_str, 

52 dry_run=dry_run, 

53 force=force, 

54 ) 

55 service_result = self.service_generator_class( 

56 output_dir=self.output_dir / "services", 

57 ).generate( 

58 name, 

59 dry_run=dry_run, 

60 force=force, 

61 ) 

62 controller_result = self.controller_generator_class( 

63 output_dir=self.output_dir / "controllers", 

64 ).generate( 

65 name, 

66 dry_run=dry_run, 

67 force=force, 

68 ) 

69 return GenerationResult( 

70 files_created=( 

71 model_result.files_created 

72 + service_result.files_created 

73 + controller_result.files_created 

74 ), 

75 files_skipped=( 

76 model_result.files_skipped 

77 + service_result.files_skipped 

78 + controller_result.files_skipped 

79 ), 

80 files_overwritten=( 

81 model_result.files_overwritten 

82 + service_result.files_overwritten 

83 + controller_result.files_overwritten 

84 ), 

85 ) 

86 

87 

88__all__ = ["ResourceGenerator"]