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)
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'))