def test_ActionYesNo_parse_env(self):
        parser = example_parser()
        self.assertEqual(
            True,
            parser.parse_env({
                'APP_BOOLS__DEF_FALSE': 'true'
            }).bools.def_false)
        self.assertEqual(
            True,
            parser.parse_env({
                'APP_BOOLS__DEF_FALSE': 'yes'
            }).bools.def_false)
        self.assertEqual(
            False,
            parser.parse_env({
                'APP_BOOLS__DEF_TRUE': 'false'
            }).bools.def_true)
        self.assertEqual(
            False,
            parser.parse_env({
                'APP_BOOLS__DEF_TRUE': 'no'
            }).bools.def_true)

        parser = ArgumentParser(default_env=True, env_prefix='APP')
        parser.add_argument('--op', action=ActionYesNo, default=False)
        self.assertEqual(True, parser.parse_env({'APP_OP': 'true'}).op)
    def test_ActionParser(self):
        parser_lv3 = ArgumentParser(prog='lv3', default_env=False)
        parser_lv3.add_argument('--opt3', default='opt3_def')

        parser_lv2 = ArgumentParser(prog='lv2', default_env=False)
        parser_lv2.add_argument('--opt2', default='opt2_def')
        parser_lv2.add_argument('--inner3',
                                action=ActionParser(parser=parser_lv3))

        parser = ArgumentParser(prog='lv1',
                                default_env=True,
                                error_handler=None)
        parser.add_argument('--opt1', default='opt1_def')
        parser.add_argument('--inner2', action=ActionParser(parser=parser_lv2))

        tmpdir = os.path.join(self.tmpdir, 'subdir')
        os.mkdir(tmpdir)
        yaml_main_file = os.path.join(tmpdir, 'main.yaml')
        yaml_inner2_file = os.path.join(tmpdir, 'inner2.yaml')
        yaml_inner3_file = os.path.join(tmpdir, 'inner3.yaml')

        with open(yaml_main_file, 'w') as output_file:
            output_file.write('opt1: opt1_yaml\ninner2: inner2.yaml\n')
        with open(yaml_inner2_file, 'w') as output_file:
            output_file.write('opt2: opt2_yaml\ninner3: inner3.yaml\n')
        with open(yaml_inner3_file, 'w') as output_file:
            output_file.write('opt3: opt3_yaml\n')

        ## Check defaults
        cfg = parser.get_defaults()
        self.assertEqual('opt1_def', cfg.opt1)
        self.assertEqual('opt2_def', cfg.inner2.opt2)
        self.assertEqual('opt3_def', cfg.inner2.inner3.opt3)

        ## Check ActionParser with parse_path
        expected = {
            'opt1': 'opt1_yaml',
            'inner2': {
                'opt2': 'opt2_yaml',
                'inner3': {
                    'opt3': 'opt3_yaml'
                }
            }
        }
        cfg = parser.parse_path(yaml_main_file, with_meta=False)
        self.assertEqual(expected, cfg.as_dict())
        with open(yaml_main_file, 'w') as output_file:
            output_file.write(parser.dump(cfg))
        cfg2 = parser.parse_path(yaml_main_file, with_meta=False)
        self.assertEqual(expected, cfg2.as_dict())

        ## Check ActionParser inner environment variables
        self.assertEqual(
            'opt2_env',
            parser.parse_env({
                'LV1_INNER2__OPT2': 'opt2_env'
            }).inner2.opt2)
        self.assertEqual(
            'opt3_env',
            parser.parse_env({
                'LV1_INNER2__INNER3__OPT3': 'opt3_env'
            }).inner2.inner3.opt3)
        expected = {
            'opt1': 'opt1_def',
            'inner2': {
                'opt2': 'opt2_def',
                'inner3': {
                    'opt3': 'opt3_yaml'
                }
            }
        }
        cfg = parser.parse_env({'LV1_INNER2__INNER3': yaml_inner3_file},
                               with_meta=False)
        self.assertEqual(expected, cfg.as_dict())
        parser.parse_env({'LV1_INNER2': yaml_inner2_file})
        self.assertEqual(
            'opt2_yaml',
            parser.parse_env({
                'LV1_INNER2': yaml_inner2_file
            }).inner2.opt2)

        ## Check ActionParser as argument path
        expected = {
            'opt1': 'opt1_arg',
            'inner2': {
                'opt2': 'opt2_yaml',
                'inner3': {
                    'opt3': 'opt3_yaml'
                }
            }
        }
        cfg = parser.parse_args(
            ['--opt1', 'opt1_arg', '--inner2', yaml_inner2_file],
            with_meta=False)
        self.assertEqual(expected, cfg.as_dict())

        expected = {
            'opt1': 'opt1_def',
            'inner2': {
                'opt2': 'opt2_arg',
                'inner3': {
                    'opt3': 'opt3_yaml'
                }
            }
        }
        cfg = parser.parse_args(
            ['--inner2.opt2', 'opt2_arg', '--inner2.inner3', yaml_inner3_file],
            with_meta=False)
        self.assertEqual(expected, cfg.as_dict())

        expected = {
            'opt1': 'opt1_def',
            'inner2': {
                'opt2': 'opt2_def',
                'inner3': {
                    'opt3': 'opt3_arg'
                }
            }
        }
        cfg = parser.parse_args([
            '--inner2.inner3', yaml_inner3_file, '--inner2.inner3.opt3',
            'opt3_arg'
        ],
                                with_meta=False)
        self.assertEqual(expected, cfg.as_dict())

        ## Check ActionParser as argument string
        expected = {'opt2': 'opt2_str', 'inner3': {'opt3': 'opt3_str'}}
        cfg = parser.parse_args(['--inner2', json.dumps(expected)],
                                with_meta=False)
        self.assertEqual(expected, cfg.as_dict()['inner2'])

        expected = {'opt3': 'opt3_str'}
        cfg = parser.parse_args(
            ['--inner2.inner3', json.dumps(expected)], with_meta=False)
        self.assertEqual(expected, cfg.as_dict()['inner2']['inner3'])

        ## Check ActionParser with ActionConfigFile
        parser.add_argument('--cfg', action=ActionConfigFile)

        expected = {
            'opt1': 'opt1_yaml',
            'inner2': {
                'opt2': 'opt2_yaml',
                'inner3': {
                    'opt3': 'opt3_yaml'
                }
            }
        }
        cfg = parser.parse_args(['--cfg', yaml_main_file], with_meta=False)
        delattr(cfg, 'cfg')
        self.assertEqual(expected, cfg.as_dict())

        cfg = parser.parse_args([
            '--cfg', yaml_main_file, '--inner2.opt2', 'opt2_arg',
            '--inner2.inner3.opt3', 'opt3_arg'
        ])
        self.assertEqual('opt2_arg', cfg.inner2.opt2)
        self.assertEqual('opt3_arg', cfg.inner2.inner3.opt3)
Exemplo n.º 3
0
    def test_ActionOperators(self):
        parser = ArgumentParser(prog='app', error_handler=None)
        parser.add_argument('--le0', action=ActionOperators(expr=('<', 0)))
        parser.add_argument('--gt1.a.le4',
                            action=ActionOperators(expr=[('>', 1.0),
                                                         ('<=', 4.0)],
                                                   join='and',
                                                   type=float))
        parser.add_argument('--lt5.o.ge10.o.eq7',
                            action=ActionOperators(expr=[('<', 5), ('>=', 10),
                                                         ('==', 7)],
                                                   join='or',
                                                   type=int))

        def int_or_off(x):
            return x if x == 'off' else int(x)

        parser.add_argument('--ge0',
                            nargs=3,
                            action=ActionOperators(expr=('>=', 0)))

        self.assertEqual(1.5,
                         parser.parse_args(['--gt1.a.le4', '1.5']).gt1.a.le4)
        self.assertEqual(4.0,
                         parser.parse_args(['--gt1.a.le4', '4.0']).gt1.a.le4)
        self.assertRaises(ParserError,
                          lambda: parser.parse_args(['--gt1.a.le4', '1.0']))
        self.assertRaises(ParserError,
                          lambda: parser.parse_args(['--gt1.a.le4', '5.5']))

        self.assertEqual(
            1.5,
            parser.parse_string('gt1:\n  a:\n    le4: 1.5').gt1.a.le4)
        self.assertEqual(
            4.0,
            parser.parse_string('gt1:\n  a:\n    le4: 4.0').gt1.a.le4)
        self.assertRaises(
            ParserError,
            lambda: parser.parse_string('gt1:\n  a:\n    le4: 1.0'))
        self.assertRaises(
            ParserError,
            lambda: parser.parse_string('gt1:\n  a:\n    le4: 5.5'))

        self.assertEqual(
            1.5,
            parser.parse_env({
                'APP_GT1__A__LE4': '1.5'
            }).gt1.a.le4)
        self.assertEqual(
            4.0,
            parser.parse_env({
                'APP_GT1__A__LE4': '4.0'
            }).gt1.a.le4)
        self.assertRaises(ParserError,
                          lambda: parser.parse_env({'APP_GT1__A__LE4': '1.0'}))
        self.assertRaises(ParserError,
                          lambda: parser.parse_env({'APP_GT1__A__LE4': '5.5'}))

        self.assertEqual(
            2,
            parser.parse_args(['--lt5.o.ge10.o.eq7', '2']).lt5.o.ge10.o.eq7)
        self.assertEqual(
            7,
            parser.parse_args(['--lt5.o.ge10.o.eq7', '7']).lt5.o.ge10.o.eq7)
        self.assertEqual(
            10,
            parser.parse_args(['--lt5.o.ge10.o.eq7', '10']).lt5.o.ge10.o.eq7)
        self.assertRaises(
            ParserError,
            lambda: parser.parse_args(['--lt5.o.ge10.o.eq7', '5']))
        self.assertRaises(
            ParserError,
            lambda: parser.parse_args(['--lt5.o.ge10.o.eq7', '8']))

        self.assertEqual([0, 1, 2],
                         parser.parse_args(['--ge0', '0', '1', '2']).ge0)

        self.assertRaises(
            ValueError,
            lambda: parser.add_argument('--op1', action=ActionOperators))
        action = ActionOperators(expr=('<', 0))
        self.assertRaises(
            ValueError,
            lambda: parser.add_argument('--op2', type=float, action=action))
        self.assertRaises(
            ValueError,
            lambda: parser.add_argument('--op3', nargs=0, action=action))
        self.assertRaises(ValueError, lambda: ActionOperators())
        self.assertRaises(ValueError, lambda: ActionOperators(expr='<'))
        self.assertRaises(
            ValueError,
            lambda: ActionOperators(expr=[('<', 5), ('>=', 10)], join='xor'))