def test_override(self): '''Ensure we can track overrides from one file or another''' shovel = Shovel() for name in ['one', 'two']: pth = 'test/examples/overrides/%s' % name shovel.read(pth, pth) self.assertNotEqual(shovel, None) self.assertNotEqual(shovel['foo.bar'].overrides, None)
def test_multi_load(self): '''Load from multiple paths''' shovel = Shovel() shovel.read('test/examples/multiple/one/', 'test/examples/multiple/one/') shovel.read('test/examples/multiple/two/', 'test/examples/multiple/two/') keys = [ 'whiz', 'bar.bar' ] self.assertEqual(set(shovel.keys()), set(keys))
def test_errors(self): '''Make sure getting non-existant tasks throws errors''' shovel = Shovel() self.assertRaises(KeyError, shovel.__getitem__, 'foo.bar.whiz') self.assertRaises(KeyError, shovel.__getitem__, 'foo') self.assertFalse('foo' in shovel) # We can't have functor classes that take arguments shovel.read('test/examples/errors/') self.assertFalse('Foo' in shovel) self.assertRaises(TypeError, Task, 'foo')
def run(*args): '''Run the normal shovel functionality''' import os import sys import argparse import pkg_resources # First off, read the arguments parser = argparse.ArgumentParser(description='Rake, for Python') parser.add_argument('method', help='The task to run') parser.add_argument('--verbose', dest='verbose', action='store_true', help='Be extra talkative') parser.add_argument('--dry-run', dest='dryRun', action='store_true', help='Show the args that would be used') ver = pkg_resources.require('shovel')[0].version parser.add_argument('--version', action='version', version='Shovel v %s' % ver, help='print the version of Shovel.') # Parse our arguments if args: clargs, remaining = parser.parse_known_args(args=args) else: # pragma: no cover clargs, remaining = parser.parse_known_args() if clargs.verbose: logger.setLevel(logging.DEBUG) args, kwargs = parse(remaining) # Import all of the files we want shovel = Shovel() # Read in any tasks that have already been defined shovel.extend(Task.clear()) for path in [ os.path.expanduser('~/.shovel.py'), os.path.expanduser('~/.shovel')]: if os.path.exists(path): # pragma: no cover shovel.read(path, os.path.expanduser('~/')) for path in ['shovel.py', 'shovel']: if os.path.exists(path): shovel.read(path) # If it's help we're looking for, look no further if clargs.method == 'help': print(help.shovel_help(shovel, *args, **kwargs)) elif clargs.method == 'tasks': tasks = list(v for _, v in shovel.items()) if not tasks: print('No tasks found!') else: names = list(t.fullname for t in tasks) docs = list(t.doc for t in tasks) # The width of the screen width = 80 import shutil try: width, _ = shutil.get_terminal_size(fallback=(0, width)) except AttributeError: pass # Create the format with padding for the longest name, and to # accomodate the screen width format = '%%-%is # %%-%is' % ( max(len(name) for name in names), width) for name, doc in zip(names, docs): print(format % (name, doc)) elif clargs.method: # Try to get the first command provided try: tasks = shovel.tasks(clargs.method) except KeyError: print('Could not find task "%s"' % clargs.method, file=sys.stderr) exit(1) if len(tasks) > 1: print('Specifier "%s" matches multiple tasks:' % clargs.method, file=sys.stderr) for task in tasks: print('\t%s' % task.fullname, file=sys.stderr) exit(2) task = tasks[0] if clargs.dryRun: print(task.dry(*args, **kwargs)) else: task(*args, **kwargs)