Skip to content

Commit a1b2198

Browse files
author
SunDoge
authored
Merge pull request #15 from SunDoge/change-api
Change api
2 parents bce1240 + 7c70fb8 commit a1b2198

File tree

8 files changed

+58
-25
lines changed

8 files changed

+58
-25
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.6.3]
11+
12+
- Update `class TypedArgs`.
13+
1014
## [0.6.2]
1115

1216
- Add `ta.TypedArgs` for better intellisense.
@@ -73,6 +77,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7377
- Replace attributes by name
7478

7579
[unreleased]: https://github.com/SunDoge/typed-args
80+
[0.6.3]: https://github.com/SunDoge/typed-args/tree/v0.6.3
81+
[0.6.2]: https://github.com/SunDoge/typed-args/tree/v0.6.2
7682
[0.6.1]: https://github.com/SunDoge/typed-args/tree/v0.6.1
7783
[0.6.0]: https://github.com/SunDoge/typed-args/tree/v0.6.0
7884
[0.5.2]: https://github.com/SunDoge/typed-args/tree/v0.5.2

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "typed-args"
3-
version = "0.6.2"
3+
version = "0.6.3"
44
description = "Parse command line arguments by defining dataclasses"
55
authors = ["SunDoge <[email protected]>"]
66
readme = "README.md"

tests/test_add_argument.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class Args(ta.TypedArgs):
1818

1919
# with pytest.raises()
2020
with pytest.raises(SystemExit) as e:
21-
args3 = Args.parse_args(['--foo', 'FOO'])
21+
_args3 = Args.parse_args(['--foo', 'FOO'])
2222
assert e.value.code == 2
2323

2424

tests/test_append.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# class Args(TypedArgs):
1212
# foo: List[str] = add_argument('--foo', action='append')
1313

14-
# args = Args.from_args('--foo 1 --foo 2'.split())
14+
# args = Args.parse_args('--foo 1 --foo 2'.split())
1515

1616
# # assert args.foo == ['1', '2']
1717

@@ -28,7 +28,7 @@
2828
# # parser.add_argument('--str', dest='types', action='append_const', const=str)
2929
# # parser.add_argument('--int', dest='types', action='append_const', const=int)
3030

31-
# args = Args.from_args('--str --int'.split())
31+
# args = Args.parse_args('--str --int'.split())
3232
# # args = parser.parse_args('--str --int'.split())
3333
# # args = parser.parse_args('--int --str'.split())
3434

typed_args/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from ._utils import SubcommandEnum, DefaultHelpFormatter
1414
from argparse import SUPPRESS, OPTIONAL, ZERO_OR_MORE, ONE_OR_MORE, REMAINDER
1515

16-
__version__ = "0.6.2"
16+
__version__ = "0.6.3"
1717

1818
__all__ = [
1919
'dataclass',

typed_args/_core.py

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ def parse_args(
1818
args: Optional[Sequence[str]] = None,
1919
namespace: Optional[argparse.Namespace] = None,
2020
) -> T:
21+
assert dataclasses.is_dataclass(
22+
klass), "{} must be dataclass".format(klass)
2123
if not parser:
22-
parser = argparse.ArgumentParser()
24+
parser = _make_parser(klass)
2325
parse(parser, klass)
2426
ns = parser.parse_args(args=args, namespace=namespace)
2527
opts = klass()
@@ -33,8 +35,10 @@ def parse_known_args(
3335
args: Optional[Sequence[str]] = None,
3436
namespace: Optional[argparse.Namespace] = None,
3537
) -> Tuple[T, List[str]]:
38+
assert dataclasses.is_dataclass(
39+
klass), "{} must be dataclass".format(klass)
3640
if not parser:
37-
parser = argparse.ArgumentParser()
41+
parser = _make_parser(klass)
3842
parse(parser, klass)
3943
ns, unknown = parser.parse_known_args(args=args, namespace=namespace)
4044
opts = klass()
@@ -43,13 +47,22 @@ def parse_known_args(
4347

4448

4549
class TypedArgs:
50+
4651
@classmethod
47-
def parse_args(cls: Type[T], args: Optional[Sequence[str]] = None, namespace: Optional[argparse.Namespace] = None) -> T:
48-
pass
52+
def parse_args(
53+
cls: Type[T],
54+
args: Optional[Sequence[str]] = None,
55+
namespace: Optional[argparse.Namespace] = None
56+
) -> T:
57+
return parse_args(cls, args=args, namespace=namespace)
4958

5059
@classmethod
51-
def parse_known_args(cls: Type[T], args: Optional[Sequence[str]] = None, namespace: Optional[argparse.Namespace] = None) -> Tuple[T, List[str]]:
52-
pass
60+
def parse_known_args(
61+
cls: Type[T],
62+
args: Optional[Sequence[str]] = None,
63+
namespace: Optional[argparse.Namespace] = None
64+
) -> Tuple[T, List[str]]:
65+
return parse_known_args(cls, args=args, namespace=namespace)
5366

5467

5568
@overload
@@ -73,23 +86,22 @@ def argument_parser(
7386
def argument_parser(**kwargs):
7487

7588
def f(klass):
76-
def _make_parser():
89+
def make_parser():
7790
return argparse.ArgumentParser(**kwargs)
7891

79-
def _parse_args(args=None, namespace=None):
80-
parser = _make_parser()
81-
return parse_args(klass, parser=parser, args=args, namespace=namespace)
82-
83-
def _parse_known_args(args=None, namespace=None):
84-
parser = _make_parser()
85-
return parse_known_args(klass, parser=parser, args=args, namespace=namespace)
86-
8792
if not dataclasses.is_dataclass(klass):
8893
logger.debug("make %s a dataclass", klass)
8994
klass = dataclasses.dataclass(klass)
9095

91-
setattr(klass, 'parse_args', _parse_args)
92-
setattr(klass, 'parse_known_args', _parse_known_args)
96+
setattr(klass, '__make_parser', make_parser)
9397
return klass
9498

9599
return f
100+
101+
102+
def _make_parser(klass):
103+
if hasattr(klass, '__make_parser'):
104+
parser = getattr(klass, '__make_parser')()
105+
else:
106+
parser = argparse.ArgumentParser()
107+
return parser

typed_args/_parser.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ def add_argument(
6969

7070

7171
def add_argument(*args, **kwargs):
72-
return dataclasses.field(default=None, metadata=dict(args=args, kwargs=kwargs, action='add_argument'))
72+
return dataclasses.field(
73+
default=None,
74+
metadata=dict(args=args, kwargs=kwargs, action='add_argument')
75+
)
7376

7477

7578
@overload
@@ -80,7 +83,10 @@ def add_argument_group(
8083

8184

8285
def add_argument_group(*args, **kwargs):
83-
return dataclasses.field(default=None, metadata=dict(args=args, kwargs=kwargs, action='add_argument_group'))
86+
return dataclasses.field(
87+
default=None,
88+
metadata=dict(args=args, kwargs=kwargs, action='add_argument_group')
89+
)
8490

8591

8692
@overload
@@ -97,7 +103,10 @@ def add_subparsers(
97103

98104

99105
def add_subparsers(*args, **kwargs):
100-
return dataclasses.field(default=None, metadata=dict(args=args, kwargs=kwargs, action='add_subparsers'))
106+
return dataclasses.field(
107+
default=None,
108+
metadata=dict(args=args, kwargs=kwargs, action='add_subparsers')
109+
)
101110

102111

103112
@overload

typed_args/_utils.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,9 @@ def _get_default_metavar_for_optional(self, action: argparse.Action) -> str:
7474

7575
def _get_default_metavar_for_positional(self, action: argparse.Action) -> str:
7676
return action.dest.split('.')[-1]
77+
78+
79+
# @dataclasses.dataclass
80+
# class _Params:
81+
# args: tuple
82+
# kwargs: dict

0 commit comments

Comments
 (0)