Coverage for src / lexigram / contracts / cli / generators.py: 94%

18 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-08-19 05:41 +0800

1"""Code generator contracts for Lexigram CLI extensions.""" 

2 

3from __future__ import annotations 

4 

5from dataclasses import dataclass, field 

6import json 

7from pathlib import Path 

8from typing import Any, Protocol, runtime_checkable 

9 

10 

11def _json_dumps(data: dict[str, Any], sort_keys: bool = False) -> bytes: 

12 """Serialize dict to JSON bytes using the stdlib json module.""" 

13 return json.dumps(data, sort_keys=sort_keys).encode("utf-8") 

14 

15 

16@dataclass(slots=True, frozen=True) 

17class GenerationResult: 

18 """Result of a generation operation.""" 

19 

20 files_created: list[Path] = field(default_factory=list) 

21 files_skipped: list[Path] = field(default_factory=list) 

22 files_overwritten: list[Path] = field(default_factory=list) 

23 

24 

25@runtime_checkable 

26class GeneratorProtocol(Protocol): 

27 """Protocol for code generators used by CLI extensions.""" 

28 

29 name: str 

30 description: str 

31 

32 def generate(self, name: str, **kwargs: Any) -> GenerationResult: 

33 """Generate files for the given name. 

34 

35 Args: 

36 name: The name to generate code for (e.g. module name, provider name). 

37 **kwargs: Additional generation parameters. 

38 

39 Returns: 

40 A ``GenerationResult`` describing which files were created/skipped. 

41 """ 

42 ... 

43 

44 

45__all__ = ["GenerationResult", "GeneratorProtocol"]