|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
| 3 | +import sys |
3 | 4 | from typing import Optional |
4 | 5 |
|
5 | | -from pydantic import BaseModel, dataclasses |
6 | 6 | from typing_extensions import Annotated |
7 | 7 |
|
8 | 8 | import cappa |
9 | 9 | from tests.utils import Backend, backends, parse |
10 | 10 |
|
| 11 | +if sys.version_info < (3, 14): |
| 12 | + from pydantic import BaseModel, dataclasses |
11 | 13 |
|
12 | | -class PydanticCommand(BaseModel): |
13 | | - name: str |
14 | | - foo: Annotated[int, cappa.Arg(short=True)] |
| 14 | + class PydanticCommand(BaseModel): |
| 15 | + name: str |
| 16 | + foo: Annotated[int, cappa.Arg(short=True)] |
15 | 17 |
|
| 18 | + @backends |
| 19 | + def test_base_model(backend: Backend): |
| 20 | + result = parse(PydanticCommand, "meow", "-f", "4", backend=backend) |
| 21 | + assert result == PydanticCommand(name="meow", foo=4) |
16 | 22 |
|
17 | | -@backends |
18 | | -def test_base_model(backend: Backend): |
19 | | - result = parse(PydanticCommand, "meow", "-f", "4", backend=backend) |
20 | | - assert result == PydanticCommand(name="meow", foo=4) |
| 23 | + @dataclasses.dataclass |
| 24 | + class DataclassCommand: |
| 25 | + name: str |
| 26 | + foo: Annotated[int, cappa.Arg(short=True)] |
21 | 27 |
|
| 28 | + @backends |
| 29 | + def test_dataclass(backend: Backend): |
| 30 | + result = parse(DataclassCommand, "meow", "-f", "4", backend=backend) |
| 31 | + assert result == DataclassCommand(name="meow", foo=4) |
22 | 32 |
|
23 | | -@dataclasses.dataclass |
24 | | -class DataclassCommand: |
25 | | - name: str |
26 | | - foo: Annotated[int, cappa.Arg(short=True)] |
| 33 | + class OptSub(BaseModel): |
| 34 | + name: Optional[str] = None |
27 | 35 |
|
| 36 | + class OptionalSubcommand(BaseModel): |
| 37 | + sub: cappa.Subcommands[Optional[OptSub]] = None |
28 | 38 |
|
29 | | -@backends |
30 | | -def test_dataclass(backend: Backend): |
31 | | - result = parse(DataclassCommand, "meow", "-f", "4", backend=backend) |
32 | | - assert result == DataclassCommand(name="meow", foo=4) |
| 39 | + @backends |
| 40 | + def test_optional_subcommand(backend: Backend): |
| 41 | + result = parse(OptionalSubcommand, backend=backend) |
| 42 | + assert result == OptionalSubcommand(sub=None) |
33 | 43 |
|
| 44 | + result = parse(OptionalSubcommand, "opt-sub", backend=backend) |
| 45 | + assert result == OptionalSubcommand(sub=OptSub(name=None)) |
34 | 46 |
|
35 | | -class OptSub(BaseModel): |
36 | | - name: Optional[str] = None |
37 | | - |
38 | | - |
39 | | -class OptionalSubcommand(BaseModel): |
40 | | - sub: cappa.Subcommands[Optional[OptSub]] = None |
41 | | - |
42 | | - |
43 | | -@backends |
44 | | -def test_optional_subcommand(backend: Backend): |
45 | | - result = parse(OptionalSubcommand, backend=backend) |
46 | | - assert result == OptionalSubcommand(sub=None) |
47 | | - |
48 | | - result = parse(OptionalSubcommand, "opt-sub", backend=backend) |
49 | | - assert result == OptionalSubcommand(sub=OptSub(name=None)) |
50 | | - |
51 | | - result = parse(OptionalSubcommand, "opt-sub", "foo", backend=backend) |
52 | | - assert result == OptionalSubcommand(sub=OptSub(name="foo")) |
| 47 | + result = parse(OptionalSubcommand, "opt-sub", "foo", backend=backend) |
| 48 | + assert result == OptionalSubcommand(sub=OptSub(name="foo")) |
0 commit comments