diff --git a/clize/parser.py b/clize/parser.py index 0228293..132c97b 100644 --- a/clize/parser.py +++ b/clize/parser.py @@ -16,6 +16,14 @@ from clize import errors, util +try: + import pathlib +except ImportError: + try: + import pathlib2 as pathlib + except ImportError: + pathlib = None + class ParameterFlag(object): def __init__(self, name, prefix='clize.Parameter'): @@ -232,15 +240,26 @@ def is_true(arg): six.binary_type: identity, } +if pathlib: + @value_converter(name='PATH') + def path_converter(arg): + return pathlib.Path(arg) + + _implicit_converters[pathlib.PurePath] = path_converter + def get_value_converter(annotation): try: return _implicit_converters[annotation] except KeyError: pass - if not getattr(annotation, '_clize__value_converter', False): - raise ValueError('{0!r} is not a value converter'.format(annotation)) - return annotation + if getattr(annotation, '_clize__value_converter', False): + return annotation + if isinstance(annotation, type): + for ic in _implicit_converters: + if issubclass(annotation, ic): + return _implicit_converters[ic] + raise ValueError('{0!r} is not a value converter'.format(annotation)) class ParameterWithValue(Parameter): diff --git a/clize/tests/test_parser.py b/clize/tests/test_parser.py index 91c17f9..1cb6541 100644 --- a/clize/tests/test_parser.py +++ b/clize/tests/test_parser.py @@ -7,13 +7,22 @@ from clize import parser, errors, util from clize.tests.util import Fixtures +try: + import pathlib + pathlib_name = "pathlib" +except ImportError: + import pathlib2 as pathlib + pathlib_name = "pathlib2 as pathlib" + _ic = parser._implicit_converters class FromSigTests(Fixtures): def _test(self, sig_str, typ, str_rep, attrs): - sig = support.s(sig_str, pre='from clize import Parameter') + pre_code = ("import {}; from clize import" + " Parameter".format(pathlib_name)) + sig = support.s(sig_str, pre=pre_code) return self._do_test(sig, typ, str_rep, attrs) def _do_test(self, sig, typ, str_rep, attrs): @@ -44,6 +53,12 @@ def _do_test(self, sig, typ, str_rep, attrs): 'conv': _ic[int], 'default': 3, 'required': False, 'argument_name': 'one', 'display_name': 'one', 'undocumented': False, 'last_option': None} + pos_default_path = ( + 'file=pathlib.Path(\'/tmp\')', parser.PositionalParameter, '[file]', { + 'conv': _ic[pathlib.PurePath], + 'default': pathlib.Path('/tmp'), 'argument_name': 'file', + 'required': False, 'undocumented': False, + 'last_option': None, 'display_name': 'file'}) pos_default_but_required = ( 'one:Parameter.REQUIRED=3', parser.PositionalParameter, 'one', { 'conv': _ic[int], 'default': util.UNSET, 'required': True, diff --git a/tox.ini b/tox.ini index c712dc9..9c5ab56 100644 --- a/tox.ini +++ b/tox.ini @@ -13,6 +13,7 @@ usedevelop=True deps= unittest2 repeated_test + pathlib2 python-dateutil Pygments docs: sphinx