Skip to content

Commit 0dcbd0e

Browse files
authored
Merge pull request #17 from SunDoge/fix-pylance
Fix pylance
2 parents 8bbc47a + ea698c5 commit 0dcbd0e

19 files changed

+464
-222
lines changed

.github/workflows/python-package.yml

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,28 @@ name: Python package
55

66
on:
77
push:
8-
branches: [ "master" ]
8+
branches: ["main"]
99
pull_request:
10-
branches: [ "master" ]
10+
branches: ["main"]
1111

1212
jobs:
1313
build:
14-
1514
runs-on: ubuntu-latest
1615
strategy:
1716
fail-fast: false
1817
matrix:
19-
python-version: ["3.8", "3.9", "3.10"]
18+
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
2019

2120
steps:
22-
- uses: actions/checkout@v3
23-
- name: Set up Python ${{ matrix.python-version }}
24-
uses: actions/setup-python@v3
25-
with:
26-
python-version: ${{ matrix.python-version }}
27-
- uses: Gr1N/setup-poetry@v8
28-
- uses: actions/cache@v2
29-
with:
30-
path: ~/.cache/pypoetry/virtualenvs
31-
key: ${{ runner.os }}-poetry-${{ hashFiles('poetry.lock') }}
32-
- run: poetry --version
33-
- name: Install dependencies
34-
run: poetry install
35-
- name: Test with pytest
36-
run: |
37-
poetry run pytest
38-
21+
- uses: actions/checkout@v4
22+
23+
- name: Install the latest version of uv
24+
uses: astral-sh/setup-uv@v3
25+
with:
26+
enable-cache: true
27+
28+
- name: Set up Python
29+
run: uv python install ${{ matrix.python-version }}
30+
31+
- name: Test with pytest
32+
run: uv run --frozen pytest

_test_v0_6.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,46 +6,46 @@
66

77
@ta.dataclass
88
class Group1:
9-
x2: str = ta.add_argument('--x2')
10-
x3: str = ta.add_argument('--x3')
9+
x2: str = ta.add_argument("--x2")
10+
x3: str = ta.add_argument("--x3")
1111

1212

1313
@ta.dataclass
1414
class Group2:
15-
x4: str = ta.add_argument('--x4')
15+
x4: str = ta.add_argument("--x4")
1616
"""
1717
x4 in group2
1818
"""
1919

20-
x5: str = ta.add_argument('--x5')
20+
x5: str = ta.add_argument("--x5")
2121
"""x5 in group2"""
2222

2323

2424
@ta.dataclass
2525
class Cmd1:
26-
x6: str = ta.add_argument('--x6')
27-
x7: str = ta.add_argument('--x7')
26+
x6: str = ta.add_argument("--x6")
27+
x7: str = ta.add_argument("--x7")
2828

2929

3030
@ta.dataclass
3131
class Cmd2:
32-
x6: str = ta.add_argument('--x6')
33-
x7: str = ta.add_argument('--x7')
34-
x8: str = ta.add_argument('--x8')
32+
x6: str = ta.add_argument("--x6")
33+
x7: str = ta.add_argument("--x7")
34+
x8: str = ta.add_argument("--x8")
3535

3636

3737
class SubCommands(ta.SubcommandEnum):
38-
CMD1: Cmd1 = ta.add_parser('cmd1')
39-
CMD2: Cmd2 = ta.add_parser('cmd2')
38+
CMD1: Cmd1 = ta.add_parser("cmd1")
39+
CMD2: Cmd2 = ta.add_parser("cmd2")
4040

4141

42-
@ta.argument_parser(prog='dddd')
42+
@ta.argument_parser(prog="dddd")
4343
class Args(ta.TypedArgs):
4444
x1: str = ta.add_argument()
4545
group1: Group1 = ta.add_argument_group()
4646
group2: Group2 = ta.add_argument_group()
4747
sub_cmd: SubCommands = ta.add_subparsers()
48-
x9: int = ta.add_argument('--x9', type=int)
48+
x9: int = ta.add_argument("--x9", type=int)
4949

5050

5151
def test():
@@ -59,5 +59,5 @@ def test():
5959
pickle.dumps(args)
6060

6161

62-
if __name__ == '__main__':
62+
if __name__ == "__main__":
6363
test()

examples/prog.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,21 @@ class Args(ta.TypedArgs):
99
"""
1010

1111
integers: List[int] = ta.add_argument(
12-
metavar='N', type=int, nargs='+',
12+
metavar="N",
13+
type=int,
14+
nargs="+",
1315
# help='an integer for the accumulator'
1416
)
1517
"""
1618
an integer for the accumulator
1719
"""
1820

1921
accumulate: Callable[[List[int]], int] = ta.add_argument(
20-
'--sum',
21-
action='store_const',
22-
const=sum, default=max,
23-
help='sum the integers (default: find the max)'
22+
"--sum",
23+
action="store_const",
24+
const=sum,
25+
default=max,
26+
help="sum the integers (default: find the max)",
2427
)
2528

2629

pyproject.toml

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
1-
[tool.poetry]
1+
[project]
22
name = "typed-args"
3-
version = "0.6.4"
3+
version = "0.6.5"
44
description = "Parse command line arguments by defining dataclasses"
5-
license = "BSD-3-Clause"
6-
authors = ["SunDoge <[email protected]>"]
5+
license = { file = "LICENSE" }
76
readme = "README.md"
8-
homepage = "https://github.com/SunDoge/typed-args"
9-
repository = "https://github.com/SunDoge/typed-args"
10-
keywords = ["argparse", "cli"]
7+
requires-python = ">=3.6"
8+
dependencies = []
119
classifiers = [
1210
"Operating System :: OS Independent",
1311
"License :: OSI Approved :: MIT License",
1412
"Programming Language :: Python :: 3",
1513
]
14+
keywords = ["argparse", "cli"]
1615

17-
[tool.poetry.dependencies]
18-
python = "^3.6"
19-
20-
[tool.poetry.dev-dependencies]
21-
toml = "^0.10.2"
22-
pytest = "^6.2.5"
2316

2417
[build-system]
25-
requires = ["poetry-core>=1.0.0"]
26-
build-backend = "poetry.core.masonry.api"
18+
requires = ["hatchling"]
19+
build-backend = "hatchling.build"
20+
21+
[tool.uv]
22+
dev-dependencies = [
23+
"pytest",
24+
"icecream",
25+
]

pyproject.toml.bak

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
[tool.poetry]
2+
name = "typed-args"
3+
version = "0.6.4"
4+
description = "Parse command line arguments by defining dataclasses"
5+
license = "BSD-3-Clause"
6+
authors = ["SunDoge <[email protected]>"]
7+
readme = "README.md"
8+
homepage = "https://github.com/SunDoge/typed-args"
9+
repository = "https://github.com/SunDoge/typed-args"
10+
keywords = ["argparse", "cli"]
11+
classifiers = [
12+
"Operating System :: OS Independent",
13+
"License :: OSI Approved :: MIT License",
14+
"Programming Language :: Python :: 3",
15+
]
16+
17+
[tool.poetry.dependencies]
18+
python = "^3.6"
19+
20+
[tool.poetry.dev-dependencies]
21+
toml = "^0.10.2"
22+
pytest = "^6.2.5"
23+
24+
[build-system]
25+
requires = ["poetry-core>=1.0.0"]
26+
build-backend = "poetry.core.masonry.api"

pyrightconfig.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"venvPath": ".",
3+
"venv": ".venv"
4+
}

src/typed_args/__init__.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
try:
2+
from dataclasses import dataclass
3+
except ImportError as e:
4+
import warnings
5+
6+
warnings.warn("Please `pip install dataclasses` if you are using Python 3.5 or 3.6")
7+
raise e
8+
9+
10+
from ._core import parse_args, parse_known_args, argument_parser, TypedArgs
11+
from ._parser import add_argument, add_argument_group, add_parser, add_subparsers
12+
from ._utils import SubcommandEnum, DefaultHelpFormatter
13+
from argparse import SUPPRESS, OPTIONAL, ZERO_OR_MORE, ONE_OR_MORE, REMAINDER
14+
15+
16+
__all__ = [
17+
"dataclass",
18+
"parse_args",
19+
"parse_known_args",
20+
"argument_parser",
21+
"TypedArgs",
22+
"add_argument",
23+
"add_argument_group",
24+
"add_parser",
25+
"add_subparsers",
26+
"SubcommandEnum",
27+
"DefaultHelpFormatter",
28+
"SUPPRESS",
29+
"OPTIONAL",
30+
"ZERO_OR_MORE",
31+
"ONE_OR_MORE",
32+
"REMAINDER",
33+
]

typed_args/_assigner.py renamed to src/typed_args/_assigner.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ def _set_attr(x, paths: List[str], value):
1313
elif len(paths) > 1:
1414
dataclass_fields = get_dataclass_fields(x)
1515
field = dataclass_fields.get(paths[0])
16-
action = field.metadata['action']
17-
if action == 'add_argument_group':
16+
action = field.metadata["action"]
17+
if action == "add_argument_group":
1818
group = getattr(x, paths[0])
1919
if group is None:
2020
group = field.type()
2121
setattr(x, paths[0], group)
2222
_set_attr(group, paths[1:], value)
23-
elif action == 'add_subparsers':
23+
elif action == "add_subparsers":
2424
annotations = get_annotations(field.type)
2525
key = paths[1]
2626
sub_command_enum: SubcommandEnum = getattr(x, paths[0])
@@ -36,4 +36,4 @@ def _set_attr(x, paths: List[str], value):
3636
def assign(x, ns: argparse.Namespace):
3737
kv = vars(ns)
3838
for key, value in kv.items():
39-
_set_attr(x, key.split('.'), value)
39+
_set_attr(x, key.split("."), value)

typed_args/_core.py renamed to src/typed_args/_core.py

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@
1111

1212
logger = logging.getLogger(__name__)
1313

14-
T = TypeVar('T')
14+
T = TypeVar("T")
1515

1616

1717
def _make_parser(klass) -> argparse.ArgumentParser:
18-
if hasattr(klass, '__make_parser'):
19-
parser = getattr(klass, '__make_parser')()
18+
if hasattr(klass, "__make_parser"):
19+
parser = getattr(klass, "__make_parser")()
2020
else:
2121
parser = argparse.ArgumentParser()
2222
return parser
@@ -26,10 +26,9 @@ def parse_args(
2626
klass: Type[T],
2727
parser: Optional[argparse.ArgumentParser] = None,
2828
args: Optional[Sequence[str]] = None,
29-
namespace: Optional[argparse.Namespace] = None,
29+
namespace: Optional[argparse.Namespace] = None,
3030
) -> T:
31-
assert dataclasses.is_dataclass(
32-
klass), "{} must be dataclass".format(klass)
31+
assert dataclasses.is_dataclass(klass), "{} must be dataclass".format(klass)
3332
if not parser:
3433
parser = _make_parser(klass)
3534
parse(parser, klass)
@@ -43,10 +42,9 @@ def parse_known_args(
4342
klass: Type[T],
4443
parser: Optional[argparse.ArgumentParser] = None,
4544
args: Optional[Sequence[str]] = None,
46-
namespace: Optional[argparse.Namespace] = None,
45+
namespace: Optional[argparse.Namespace] = None,
4746
) -> Tuple[T, List[str]]:
48-
assert dataclasses.is_dataclass(
49-
klass), "{} must be dataclass".format(klass)
47+
assert dataclasses.is_dataclass(klass), "{} must be dataclass".format(klass)
5048
if not parser:
5149
parser = _make_parser(klass)
5250
parse(parser, klass)
@@ -57,34 +55,33 @@ def parse_known_args(
5755

5856

5957
class TypedArgs:
60-
6158
@classmethod
6259
def parse_args(
6360
cls: Type[T],
6461
args: Optional[Sequence[str]] = None,
65-
namespace: Optional[argparse.Namespace] = None
62+
namespace: Optional[argparse.Namespace] = None,
6663
) -> T:
6764
return parse_args(cls, args=args, namespace=namespace)
6865

6966
@classmethod
7067
def parse_known_args(
7168
cls: Type[T],
7269
args: Optional[Sequence[str]] = None,
73-
namespace: Optional[argparse.Namespace] = None
70+
namespace: Optional[argparse.Namespace] = None,
7471
) -> Tuple[T, List[str]]:
7572
return parse_known_args(cls, args=args, namespace=namespace)
7673

7774

7875
@overload
7976
def argument_parser(
80-
prog: str = None,
81-
usage: str = None,
82-
description: str = None,
83-
epilog: str = None,
84-
parents: List[argparse.ArgumentParser] = None,
85-
formatter_class: argparse.HelpFormatter = None,
86-
prefix_chars: str = '-',
87-
fromfile_prefix_chars: str = None,
77+
prog: str = ...,
78+
usage: str = ...,
79+
description: str = ...,
80+
epilog: str = ...,
81+
parents: List[argparse.ArgumentParser] = ...,
82+
formatter_class: argparse.HelpFormatter = ...,
83+
prefix_chars: str = "-",
84+
fromfile_prefix_chars: str = ...,
8885
argument_default=None,
8986
conflict_handler=None,
9087
add_help: bool = True,
@@ -94,13 +91,12 @@ def argument_parser(
9491

9592

9693
def argument_parser(**kwargs):
97-
9894
def f(klass):
9995
description = get_doc(klass)
10096

10197
def make_parser():
102-
if 'description' not in kwargs and description is not None:
103-
logger.debug('Get description from __doc__: %s', description)
98+
if "description" not in kwargs and description is not None:
99+
logger.debug("Get description from __doc__: %s", description)
104100
return argparse.ArgumentParser(description=description, **kwargs)
105101
else:
106102
return argparse.ArgumentParser(**kwargs)
@@ -109,7 +105,7 @@ def make_parser():
109105
logger.debug("make %s a dataclass", klass)
110106
klass = dataclasses.dataclass(klass)
111107

112-
setattr(klass, '__make_parser', make_parser)
108+
setattr(klass, "__make_parser", make_parser)
113109
return klass
114110

115111
return f

0 commit comments

Comments
 (0)