Skip to content

Commit 6f42994

Browse files
authored
Use evaluated annotations from sigtools (#83)
1 parent 85f3459 commit 6f42994

File tree

3 files changed

+35
-34
lines changed

3 files changed

+35
-34
lines changed

clize/parser.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -997,8 +997,9 @@ def from_signature(cls, sig, extra=(), **kwargs):
997997
@classmethod
998998
def convert_parameter(cls, param):
999999
"""Convert a Python parameter to a CLI parameter."""
1000+
param_annotation = param.upgraded_annotation.source_value()
10001001
if param.annotation != param.empty:
1001-
annotations = util.maybe_iter(param.annotation)
1002+
annotations = util.maybe_iter(param_annotation)
10021003
else:
10031004
annotations = []
10041005

clize/tests/test_parser.py

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,13 @@
1313
from clize.tests.util import Fixtures
1414

1515

16-
pathlib_name = "pathlib"
17-
18-
1916
_ic = parser._implicit_converters
2017

2118

2219
class FromSigTests(Fixtures):
23-
def _test(self, sig_str, typ, str_rep, attrs, *, future_features=()):
24-
pre_code = ("import pathlib; from clize import"
25-
" Parameter")
26-
sig = support.s(sig_str, pre=pre_code, future_features=future_features)
20+
def _test(self, sig_str, typ, str_rep, attrs):
21+
pre_code = "import pathlib; from clize import Parameter"
22+
sig = self._support_s(sig_str, pre=pre_code)
2723
return self._do_test(sig, typ, str_rep, attrs)
2824

2925
def _do_test(self, sig, typ, str_rep, attrs):
@@ -37,6 +33,8 @@ def _do_test(self, sig, typ, str_rep, attrs):
3733
)
3834
self.assertEqual(p_attrs, attrs)
3935

36+
def _support_s(self, *args, **kwargs):
37+
return support.s(*args, **kwargs)
4038

4139
pos = 'one', parser.PositionalParameter, 'one', {
4240
'conv': parser.identity, 'default': util.UNSET, 'required': True,
@@ -104,7 +102,7 @@ def test_vconverter(self):
104102
@parser.value_converter
105103
def converter(value):
106104
raise NotImplementedError
107-
sig = support.s('*, par: conv', locals={'conv': converter})
105+
sig = self._support_s('*, par: conv', globals={'conv': converter})
108106
self._do_test(sig, parser.OptionParameter, '--par=CONVERTER', {
109107
'conv': converter,
110108
})
@@ -115,7 +113,7 @@ class FancyDefault(object):
115113
def __init__(self, arg):
116114
self.arg = arg
117115
deft = FancyDefault('ham')
118-
sig = support.s('*, par=default', locals={'default': deft})
116+
sig = self._support_s('*, par=default', globals={'default': deft})
119117
self._do_test(sig, parser.OptionParameter, '[--par=FANCYDEFAULT]', {
120118
'conv': FancyDefault,
121119
'default': deft,
@@ -125,7 +123,7 @@ def test_bad_default_good_conv(self):
125123
class UnknownDefault(object):
126124
pass
127125
deft = UnknownDefault()
128-
sig = support.s('*, par:str=default', locals={'default': deft})
126+
sig = self._support_s('*, par:str=default', globals={'default': deft})
129127
self._do_test(sig, parser.OptionParameter, '[--par=STR]', {
130128
'conv': parser.identity,
131129
'default': deft,
@@ -137,7 +135,7 @@ def method(self, arg):
137135
return self
138136
s = Spam()
139137
conv = parser.value_converter(s.method, name='TCONV')
140-
sig = support.s('*, par: conv', locals={'conv': conv})
138+
sig = self._support_s('*, par: conv', globals={'conv': conv})
141139
self._do_test(sig, parser.OptionParameter, '--par=TCONV', {
142140
'conv': conv
143141
})
@@ -156,7 +154,7 @@ def conv(arg):
156154
aliases=['--par']
157155
)
158156
self.assertEqual(param.get_all_names(), '--par[=CONV]')
159-
sig = support.s('*, par: p, o=False', locals={'p': param})
157+
sig = self._support_s('*, par: p, o=False', globals={'p': param})
160158
self._do_test(sig, parser.FlagParameter, '[--par[=CONV]]', {
161159
'conv': conv,
162160
})
@@ -177,7 +175,7 @@ def conv(arg):
177175
aliases=['--par', '-p']
178176
)
179177
self.assertEqual(param.get_all_names(), '-p, --par[=CONV]')
180-
sig = support.s('*, par: p, o=False', locals={'p': param})
178+
sig = self._support_s('*, par: p, o=False', globals={'p': param})
181179
self._do_test(sig, parser.FlagParameter, '[-p]', {
182180
'conv': conv,
183181
})
@@ -189,7 +187,7 @@ def conv(arg):
189187
{'par': 'eggs', 'o': True})
190188

191189
def test_alias_multi(self):
192-
sig = support.s('*, one: a', locals={'a': ('a', 'b', 'abc')})
190+
sig = self._support_s('*, one: a', globals={'a': ('a', 'b', 'abc')})
193191
param = list(sig.parameters.values())[0]
194192
cparam = parser.CliSignature.convert_parameter(param)
195193
self.assertEqual(type(cparam), parser.OptionParameter)
@@ -199,7 +197,7 @@ def test_alias_multi(self):
199197

200198
def test_param_inst(self):
201199
param = parser.Parameter('abc')
202-
sig = support.s('xyz: p', locals={'p': param})
200+
sig = self._support_s('xyz: p', globals={'p': param})
203201
sparam = list(sig.parameters.values())[0]
204202
cparam = parser.CliSignature.convert_parameter(sparam)
205203
self.assertTrue(cparam is param)
@@ -215,8 +213,8 @@ def noop_converter(param, annotations):
215213
raise NotImplementedError
216214

217215
sigs = [
218-
support.s('o: c', locals={'c': converter}),
219-
support.s('*, o: a', locals={'a': ("abc", converter)})
216+
self._support_s('o: c', globals={'c': converter}),
217+
self._support_s('*, o: a', globals={'a': ("abc", converter)})
220218
]
221219
for sig in sigs:
222220
sparam = list(sig.parameters.values())[0]
@@ -231,7 +229,7 @@ def test_parameterflag_repr(self):
231229

232230
class SigTests(Fixtures):
233231
def _test(self, sig_str, *args, **kwargs):
234-
sig = support.s(sig_str, locals={'P': parser.Parameter})
232+
sig = support.s(sig_str, globals={'P': parser.Parameter})
235233
self._do_test(sig, *args, **kwargs)
236234

237235
def _do_test(self, sig, str_rep, args, posargs, kwargs):
@@ -339,7 +337,7 @@ def test_converter_ignore(self):
339337
@parser.parameter_converter
340338
def conv(param, annotations):
341339
return parser.Parameter.IGNORE
342-
sig = support.s('one:conv', locals={'conv': conv})
340+
sig = support.s('one:conv', globals={'conv': conv})
343341
csig = parser.CliSignature.from_signature(sig)
344342
self.assertEqual(str(csig), '')
345343

@@ -369,39 +367,39 @@ def test_posparam_set_value_parameter_not_present(self):
369367

370368
def test_posparam_set_value_only(self):
371369
param = parser.PositionalParameter(argument_name='one', display_name='one')
372-
sig = support.s('one:par', locals={'par': param})
370+
sig = support.s('one:par', globals={'par': param})
373371
csig = parser.CliSignature.from_signature(sig)
374372
ba = parser.CliBoundArguments(csig, [], 'func', args=[])
375373
param.set_value(ba, 'inserted')
376374
self.assertEqual(ba.args, ['inserted'])
377375

378376
def test_posparam_set_value_already_set(self):
379377
param = parser.PositionalParameter(argument_name='two', display_name='two')
380-
sig = support.s('one, two:par', locals={'par': param})
378+
sig = support.s('one, two:par', globals={'par': param})
381379
csig = parser.CliSignature.from_signature(sig)
382380
ba = parser.CliBoundArguments(csig, [], 'func', args=['one', 'two'])
383381
param.set_value(ba, 'inserted')
384382
self.assertEqual(ba.args, ['one', 'inserted'])
385383

386384
def test_posparam_set_value_after_set(self):
387385
param = parser.PositionalParameter(argument_name='two', display_name='two')
388-
sig = support.s('one, two:par', locals={'par': param})
386+
sig = support.s('one, two:par', globals={'par': param})
389387
csig = parser.CliSignature.from_signature(sig)
390388
ba = parser.CliBoundArguments(csig, [], 'func', args=['one'])
391389
param.set_value(ba, 'inserted')
392390
self.assertEqual(ba.args, ['one', 'inserted'])
393391

394392
def test_posparam_set_value_after_default(self):
395393
param = parser.PositionalParameter(argument_name='two', display_name='two', default="two")
396-
sig = support.s('one="one", two:par="two"', locals={'par': param})
394+
sig = support.s('one="one", two:par="two"', globals={'par': param})
397395
csig = parser.CliSignature.from_signature(sig)
398396
ba = parser.CliBoundArguments(csig, [], 'func', args=[])
399397
param.set_value(ba, 'inserted')
400398
self.assertEqual(ba.args, ['one', 'inserted'])
401399

402400
def test_posparam_set_value_after_missing(self):
403401
param = parser.PositionalParameter(argument_name='two', display_name='two')
404-
sig = support.s('one, two:par', locals={'par': param})
402+
sig = support.s('one, two:par', globals={'par': param})
405403
csig = parser.CliSignature.from_signature(sig)
406404
ba = parser.CliBoundArguments(csig, [], 'func', args=[])
407405
with self.assertRaises(ValueError):
@@ -411,29 +409,29 @@ def test_vconverter_keep_default(self):
411409
@parser.value_converter
412410
def conv(arg):
413411
return 'converted'
414-
sig = support.s('*, par:conv="default"', locals={'conv': conv})
412+
sig = support.s('*, par:conv="default"', globals={'conv': conv})
415413
self._do_test(sig, '[--par=CONV]', (), [], {})
416414

417415
def test_vconverter_convert_value(self):
418416
@parser.value_converter(convert_default=True)
419417
def conv(arg):
420418
return 'c{}c'.format(arg)
421-
sig = support.s('*, par:conv="default"', locals={'conv': conv})
419+
sig = support.s('*, par:conv="default"', globals={'conv': conv})
422420
self._do_test(sig, '[--par=CONV]', ('--par=A',), [], {'par': 'cAc'})
423421
self._do_test(sig, '[--par=CONV]', ('--par', 'A',), [], {'par': 'cAc'})
424422

425423
def test_vconverter_convert_default(self):
426424
@parser.value_converter(convert_default=True)
427425
def conv(arg):
428426
return 'converted'
429-
sig = support.s('*, par:conv="default"', locals={'conv': conv})
427+
sig = support.s('*, par:conv="default"', globals={'conv': conv})
430428
self._do_test(sig, '[--par=CONV]', (), [], {'par': 'converted'})
431429

432430
def test_vconverter_convert_default_after_pos(self):
433431
@parser.value_converter(convert_default=True)
434432
def conv(arg):
435433
return 'converted'
436-
sig = support.s('first="otherdefault", par:conv="default"', locals={'conv': conv})
434+
sig = support.s('first="otherdefault", par:conv="default"', globals={'conv': conv})
437435
self._do_test(sig, '[first] [par]', (), ['otherdefault', 'converted'], {})
438436

439437

@@ -578,11 +576,13 @@ def func(*args):
578576
)
579577

580578

581-
@unittest.skip("mix of failing tests for now")
582579
@unittest.skipUnless(has_future_annotations, "__future__.annotations only available certain python versions")
583580
class FromSigTestsStringAnnotations(FromSigTests):
584581
def _test(self, *args, **kwargs):
585-
super()._test(*args, future_features=("annotations",), **kwargs)
582+
return super()._test(*args, **kwargs)
583+
584+
def _support_s(self, *args, **kwargs):
585+
return super()._support_s(*args, future_features=("annotations",), **kwargs)
586586

587587

588588
class UnknownAnnotation(object):
@@ -595,8 +595,8 @@ def __init__(self, arg):
595595

596596

597597
class BadParamTests(Fixtures):
598-
def _test(self, sig_str, locals, exp_msg):
599-
sig = support.s(sig_str, pre='from clize import Parameter', locals=locals)
598+
def _test(self, sig_str, globals, exp_msg):
599+
sig = support.s(sig_str, pre='from clize import Parameter', globals=globals)
600600
params = list(sig.parameters.values())
601601
with self.assertRaises(ValueError) as ar:
602602
parser.CliSignature.convert_parameter(params[0])

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
author_email='kaiser.yann@gmail.com',
2424
python_requires='>=3.6',
2525
install_requires=[
26-
'sigtools ~= 3.0.0rc4',
26+
'sigtools ~= 4.0.0a2',
2727
'attrs>=19.1.0',
2828
'od',
2929
'docutils >= 0.17.0',

0 commit comments

Comments
 (0)