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
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 04:37 +0800
1"""Webhook generator for the web package."""
3from __future__ import annotations
5from lexigram.codegen import GenerationResult, GeneratorBase, parse_fields
8class WebhookGenerator(GeneratorBase):
9 """Generate a webhook handler scaffold."""
11 name = "webhook"
12 description = "Generate a webhook handler"
13 default_output_dir = "src/webhooks"
15 def __init__(self, output_dir: str = "src/webhooks") -> None:
16 super().__init__(output_dir=output_dir)
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)
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"
46__all__ = ["WebhookGenerator"]