Coverage for src/lexigram/web/cli/generators/webhook.py: 56%

18 statements  

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

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

2 

3from __future__ import annotations 

4 

5from lexigram.codegen import GenerationResult, GeneratorBase, parse_fields 

6 

7 

8class WebhookGenerator(GeneratorBase): 

9 """Generate a webhook handler scaffold.""" 

10 

11 name = "webhook" 

12 description = "Generate a webhook handler" 

13 default_output_dir = "src/webhooks" 

14 

15 def __init__(self, output_dir: str = "src/webhooks") -> None: 

16 super().__init__(output_dir=output_dir) 

17 

18 def generate( 

19 self, 

20 name: str, 

21 *, 

22 fields_str: str | None = None, 

23 dry_run: bool = False, 

24 force: bool = False, 

25 **options: object, 

26 ) -> GenerationResult: 

27 file_path = self.output_dir / f"{self._to_snake_case(name)}_webhook.py" 

28 content = self.render_template( 

29 "webhook.py.jinja2", 

30 { 

31 "webhook_name": self._to_pascal_case(name), 

32 "webhook_name_snake": self._to_snake_case(name), 

33 "package_name": self._package_name(), 

34 "fields": parse_fields(fields_str or ""), 

35 }, 

36 ) 

37 return self.write_file(file_path, content, dry_run=dry_run, force=force) 

38 

39 def _package_name(self) -> str: 

40 parts = self.output_dir.parts 

41 if parts[:1] == ("src",): 

42 parts = parts[1:] 

43 return ".".join(parts) if parts else "app" 

44 

45 

46__all__ = ["WebhookGenerator"]