def test_ActionPath_dump(self): parser = ArgumentParser() parser.add_argument('--path', action=ActionPath(mode='fc')) cfg = parser.parse_string('path: path') self.assertEqual(parser.dump(cfg), 'path: path\n') parser = ArgumentParser() parser.add_argument('--paths', nargs='+', action=ActionPath(mode='fc')) cfg = parser.parse_args(['--paths', 'path1', 'path2']) self.assertEqual(parser.dump(cfg), 'paths:\n- path1\n- path2\n')
def test_ActionJsonSchema(self): parser = ArgumentParser(prog='app', default_meta=False, error_handler=None) parser.add_argument('--op1', action=ActionJsonSchema(schema=schema1)) parser.add_argument('--op2', action=ActionJsonSchema(schema=schema2)) parser.add_argument('--op3', action=ActionJsonSchema(schema=schema3)) parser.add_argument('--cfg', action=ActionConfigFile) op1_val = [1, 2, 3, 4] op2_val = {'k1': 'one', 'k2': 2, 'k3': 3.3} self.assertEqual(op1_val, parser.parse_args(['--op1', str(op1_val)]).op1) self.assertRaises(ParserError, lambda: parser.parse_args(['--op1', '[1, "two"]'])) self.assertRaises(ParserError, lambda: parser.parse_args(['--op1', '[1.5, 2]'])) self.assertEqual(op2_val, parser.parse_args(['--op2', str(op2_val)]).op2) self.assertEqual(17, parser.parse_args(['--op2', '{"k2": 2}']).op2['k3']) self.assertRaises(ParserError, lambda: parser.parse_args(['--op2', '{"k1": 1}'])) self.assertRaises(ParserError, lambda: parser.parse_args(['--op2', '{"k2": "2"}'])) self.assertRaises(ParserError, lambda: parser.parse_args(['--op2', '{"k4": 4}'])) op1_file = os.path.join(self.tmpdir, 'op1.json') op2_file = os.path.join(self.tmpdir, 'op2.json') cfg1_file = os.path.join(self.tmpdir, 'cfg1.yaml') cfg3_file = os.path.join(self.tmpdir, 'cfg3.yaml') cfg2_str = 'op1:\n '+str(op1_val)+'\nop2:\n '+str(op2_val)+'\n' with open(op1_file, 'w') as f: f.write(str(op1_val)) with open(op2_file, 'w') as f: f.write(str(op2_val)) with open(cfg1_file, 'w') as f: f.write('op1:\n '+op1_file+'\nop2:\n '+op2_file+'\n') with open(cfg3_file, 'w') as f: f.write('op3:\n n1:\n - '+str(op2_val)+'\n') cfg = parser.parse_path(cfg1_file) self.assertEqual(op1_val, cfg['op1']) self.assertEqual(op2_val, cfg['op2']) cfg = parser.parse_string(cfg2_str) self.assertEqual(op1_val, cfg['op1']) self.assertEqual(op2_val, cfg['op2']) cfg = parser.parse_args(['--cfg', cfg3_file]) self.assertEqual(op2_val, cfg.op3['n1'][0]) parser.check_config(cfg, skip_none=True) if os.name == 'posix' and platform.python_implementation() == 'CPython': os.chmod(op1_file, 0) self.assertRaises(ParserError, lambda: parser.parse_path(cfg1_file))
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'))
def main(config_string): logger.debug("Parsing arguments...") parser = ArgumentParser() parser.add_argument('--cfg', action=ActionConfigFile) parser.add_argument('--lang', choices=['eng', 'nl'], nargs='?', default='nl', help='The language you want to hear.') parser.add_argument( '--duration_breath', type=int, default=0, help= 'Number of seconds that Tessa takes a breath before announcing the next exercise.' ) parser.add_argument('--max_times', type=int, default=3, help='The number of exercises per day.') parser.add_argument( '--warn_before', type=int, default=6, help='Seconds, before exercise starts, you get a warning.') parser.add_argument('--duration_exercise', action=ActionOperators(expr=('>', 15)), default=20, help='Seconds, duration of exercise.') parser.add_argument('--music.dir', action=ActionPath(mode='dr'), default=Path(os.path.join( str(libPath.home()), 'Music/iTunes/iTunes Media/Music'), mode='dr'), help='The root folder of your music files.') parser.add_argument( '--music.vol', type=float, default=0.19, help= 'The volume of the music (exponential scale, where 0 is silent, 1 is normal, up to 255 for very loud.' ) parser.add_argument( '--finished_work_at', type=int, default=19, help='When are you finished with work and want to stop exercises.') parser.add_argument( '--min_pause', type=int, default=0, help='Minutes, minimum how long your break between exercises takes.') parser.add_argument( '--max_pause', type=int, default=0, help='Minutes, maximum how long your break between exercises takes.') parser.add_argument( '--silent', action=ActionYesNo, default=False, help= 'Wether you want to run Tessa in silent mode. Music is played anyway.') parser.add_argument( '--skip_intro', action=ActionYesNo, default=True, help='If you want to restart Tessa and skip the intro.') args = parser.parse_string(config_string) speech = Speech(args) music = Music(args) start(args, speech, music)