def prompt_gather(self, interface): # Resolve dependencies resolver = Resolver() for key in self._jobs.iterkeys(): depends = self._depends.get(key, []) resolver.add(key, *depends) # Build options options = {} for job in resolver.get_dependents(): suboptions = options dependencies = resolver.get_dependencies(job) for dependency in dependencies: suboptions = suboptions.setdefault(self._jobs[dependency], {}) # Build defaults defaults = self.persist.get("default") if defaults is None: defaults = copy.deepcopy(options) # Only prompt if not recovering if interface.direction == PREV or not self._recover: self._recover = False # Get results defaults = interface.show_tree(_("Select the suites to test"), options, defaults) self.persist.set("default", defaults) # Get tests to ignore def get_ignore_jobs(options, results): jobs = [] for k, v in options.iteritems(): if not v and k not in results: jobs.append(k) else: jobs.extend(get_ignore_jobs(options[k], results.get(k, {}))) return jobs ignore_jobs = get_ignore_jobs(options, defaults) self._manager.reactor.fire("ignore-jobs", ignore_jobs)
def prompt_gather(self, interface): # Resolve dependencies resolver = Resolver() for key in self._jobs.iterkeys(): depends = self._depends.get(key, []) resolver.add(key, *depends) # Build options options = {} for job in resolver.get_dependents(): suboptions = options dependencies = resolver.get_dependencies(job) for dependency in dependencies: value = self._statuses.get(dependency, {}) suboptions = suboptions.setdefault(self._jobs[dependency], value) # Build defaults defaults = self.persist.get("default") if defaults is None: defaults = copy.deepcopy(options) # Get results defaults = interface.show_tree(_("Select the suites to test"), options, defaults) self.persist.set("default", defaults) # Get tests to ignore def get_ignore_jobs(options, results): jobs = [] if isinstance(options,dict): for k, v in options.iteritems(): if v == UNINITIATED and k not in results: jobs.append(k) else: jobs.extend(get_ignore_jobs(options[k], results.get(k, {}))) return jobs ignore_jobs = get_ignore_jobs(options, defaults) self._manager.reactor.fire("ignore-jobs", ignore_jobs)
class ResolverTest(unittest.TestCase): def setUp(self): self.resolver = Resolver() def test_dependencies_none(self): try: self.resolver.get_dependencies('a') except Exception as error: self.assertTrue(error.args[0].startswith('no dependencies')) else: self.fail('non existing element accepted by resolver') def test_dependencies_one_level(self): self.resolver.add('a') results = self.resolver.get_dependencies('a') self.assertListEqual(results, ['a']) def test_dependencies_two_level(self): self.resolver.add('a') self.resolver.add('b', 'a') results = self.resolver.get_dependencies('b') self.assertListEqual(results, ['a', 'b']) def test_dependencies_multiple(self): self.resolver.add('a') # A appears as a dependency multiple times # in b and c, but isn't a circular dependency self.resolver.add('b', 'a') self.resolver.add('c', 'a', 'b') results = self.resolver.get_dependencies('c') self.assertListEqual(results, ['a', 'b', 'c']) def test_dependencies_circular(self): try: self.resolver.add('a', 'b') self.resolver.add('b', 'a') self.resolver.get_dependencies('a') except Exception as error: self.assertTrue(error.args[0].startswith('circular dependency')) else: self.fail('circular dependency not detected') def test_dependents_none(self): self.resolver.add('a') results = self.resolver.get_dependents('a') self.assertTrue(len(results) == 0) def test_dependents_one(self): self.resolver.add('a') self.resolver.add('b', 'a') results = self.resolver.get_dependents('a') self.assertListEqual(results, ['b']) def test_dependents_two(self): resolver = Resolver() resolver.add('a') resolver.add('b', 'a') resolver.add('c', 'b') results = resolver.get_dependents('a') self.assertListEqual(results, ['b', 'c']) def test_multiple_resolve_steps(self): self.resolver.add('a', 'b') results = self.resolver.get_dependents() self.assertListEqual(results, ['a']) self.resolver.add('b') results = self.resolver.get_dependents() self.assertListEqual(results, ['b', 'a'])