def test_tagger_factory_tags_known_tags(self): # Given. code = 'import sys; print("args:"+sys.argv[1]'\ '+"\nlength:10\ncompleted:yes\n")' command = "python -c %r" % code factory = TaggerFactory(command=command) p = Project(name='test', path=self.root) p.add_tags([ TagInfo(name='args', type='string'), TagInfo(name='length', type='int') ]) p.scan() # When jobs = factory.make_jobs(p.keys(), p) for job in jobs: job.run() job.thread.join() # Then. self.assertEqual(len(jobs), 5) for job in jobs: self.assertEqual(job.status, 'success') for key in p.keys(): media = p.get(key) self.assertEqual(media.tags['completed'], True) expect = "%s" % (media.path) self.assertEqual(media.tags['args'], expect) self.assertEqual(media.tags['length'], 10) # When jobs = factory.make_jobs(p.keys(), p) # Then self.assertEqual(len(jobs), 0) # When. data = dump(factory) f1 = load(data) # Then. # The _tag_types should not be dumped. self.assertEqual(f1._tag_types, None) self.assertNotIn('_tag_types', data[1]) f = factory for attr in ['command', '_done']: self.assertEqual(getattr(f1, attr), getattr(f, attr))
def test_update_tags_handles_type_changes_for_existing_tag(self): # Given tags = [ TagInfo(name='completed', type='bool'), TagInfo(name='foo', type='string') ] p = Project(name='test', path=self.root, tags=tags) p.scan() key = 'root.txt' m = p.get(key) m.tags['completed'] = True m.tags['foo'] = 'hello world' # When new_tags = [ TagInfo(name='foo', type='int'), TagInfo(name='completed', type='bool') ] p.update_tags(new_tags) # Then self.assertEqual(p.tags, new_tags) self.assertEqual(m.tags['completed'], True) self.assertEqual(m.tags['foo'], 0) for key in p.keys(): m = p.get(key) self.assertEqual(type(m.tags['completed']), bool) self.assertEqual(m.tags['foo'], 0)
def test_python_function_factory(self): # Given. from textwrap import dedent code = dedent(""" def process(relpath, media, dest): media.tags['completed'] = True media.tags['args'] = "%s %s"%(relpath, dest) """) factory = PythonFunctionFactory(code=code, dest=self.root1) p = Project(name='test', path=self.root) p.add_tags([TagInfo(name='args', type='string')]) p.scan() # When jobs = factory.make_jobs(p.keys(), p) for job in jobs: job.run() job.thread.join() # Then. self.assertEqual(len(jobs), 5) for key in p.keys(): media = p.get(key) self.assertEqual(media.tags['completed'], True) expect = "%s %s" % (key, self.root1) self.assertEqual(media.tags['args'], expect) # When jobs = factory.make_jobs(p.keys(), p) # Then self.assertEqual(len(jobs), 0) # When. data = dump(factory) f1 = load(data) # Then. # The func should not be dumped. self.assertEqual(f1._func, None) self.assertNotIn('_func', data[1]) f = factory for attr in ['code', '_done']: self.assertEqual(getattr(f1, attr), getattr(f, attr))
def test_setting_root_extensions_limits_files(self): # Given p = Project(name='test', path=self.root, extensions=['.py']) # When p.scan() # Then self.assertEqual(p.number_of_files, 1) self.assertEqual(list(p.keys())[0], 'hello.py')
def test_command_factory_jobs(self): # Given. import sys command = """\ %r -c 'import shutil;shutil.copy("$input", "$output")'\ """ % sys.executable cf = CommandFactory(dest=self.root1, input_extension='.py', output_extension='.rst', command=command, copy_timestamps=True) p = Project(name='test', path=self.root) p.scan() # When jobs = cf.make_jobs(p.keys(), p) job = jobs[0] job.run() job.thread.join() # Then. self.assertEqual(len(jobs), 1) self.assertEqual(job.status, 'success') m = p.get('hello.py') dest = os.path.join(self.root1, 'hello.rst') self.assertTrue(os.path.exists(dest)) self.assertEqual(cf._done[dest], True) s_stat = os.stat(m.path) d_stat = os.stat(dest) self.assertTrue(abs(s_stat.st_mtime - d_stat.st_mtime) < 2) self.assertTrue(abs(s_stat.st_ctime - d_stat.st_ctime) < 2) jobs = cf.make_jobs(p.keys(), p) self.assertEqual(len(jobs), 0) # When. data = dump(cf) cf1 = load(data) # Then. for attr in cf.__dict__.keys(): self.assertEqual(getattr(cf1, attr), getattr(cf, attr))
def test_tagger_factory_skips_unknown_tags(self): # Given. code = 'import sys; print("\nlength:10\nxxx:yes\n")' command = "python -c %r" % code factory = TaggerFactory(command=command) p = Project(name='test', path=self.root) p.scan() # When jobs = factory.make_jobs(p.keys(), p) for job in jobs: job.run() job.thread.join() # Then. self.assertEqual(len(jobs), 5) for key in p.keys(): media = p.get(key) self.assertTrue('length' not in media.tags) self.assertTrue('xxx' not in media.tags) self.assertEqual(media.tags['completed'], False)
def test_tagger_factory_tags_known_tags(self): # Given. code = 'import sys; print("args:"+sys.argv[1]'\ '+"\nlength:10\ncompleted:yes\n")' command = "python -c %r" % code factory = TaggerFactory(command=command) p = Project(name='test', path=self.root) p.add_tags( [ TagInfo(name='args', type='string'), TagInfo(name='length', type='int') ] ) p.scan() # When jobs = factory.make_jobs(p.keys(), p) for job in jobs: job.run() job.thread.join() # Then. self.assertEqual(len(jobs), 5) for job in jobs: self.assertEqual(job.status, 'success') for key in p.keys(): media = p.get(key) self.assertEqual(media.tags['completed'], True) expect = "%s" % (media.path) self.assertEqual(media.tags['args'], expect) self.assertEqual(media.tags['length'], 10) # When jobs = factory.make_jobs(p.keys(), p) # Then self.assertEqual(len(jobs), 0)
def test_command_factory_ignores_non_existing_paths(self): # Given. cf = CommandFactory(dest=self.root1, input_extension='.py', output_extension='.rst', command="echo $input $output") p = Project(name='test', path=self.root) p.scan() os.remove(os.path.join(self.root, 'hello.py')) # When jobs = cf.make_jobs(p.keys(), p) # Then. self.assertEqual(len(jobs), 0)
def test_update_tags_updates_existing_media(self): # Given p = Project(name='test', path=self.root) p.scan() # When new_tags = [TagInfo(name='foo', type='string')] p.update_tags(new_tags) # Then self.assertEqual(p.tags, new_tags) for key in p.keys(): m = p.get(key) self.assertEqual(m.tags['foo'], '') self.assertTrue('completed' not in m.tags)
def test_command_factory_commands(self): # Given. cf = CommandFactory(dest=self.root1, input_extension='.py', output_extension='.rst', command="echo $input $output") p = Project(name='test', path=self.root) p.scan() # When jobs = cf.make_jobs(p.keys(), p) # Then. self.assertEqual(len(jobs), 1) job = jobs[0] m = p.get('hello.py') dest = os.path.join(self.root1, 'hello.rst') expect = ('echo %s %s' % (m.path, dest)).replace('\\', '\\\\') self.assertEqual(job.args, [expect.split(), m.path, dest])