def collect_tasks_and_actions_and_initializers(self, project_module): for name in dir(project_module): candidate = getattr(project_module, name) if hasattr(candidate, NAME_ATTRIBUTE): name = getattr(candidate, NAME_ATTRIBUTE) elif hasattr(candidate, "__name__"): name = candidate.__name__ description = getattr(candidate, DESCRIPTION_ATTRIBUTE) if hasattr( candidate, DESCRIPTION_ATTRIBUTE) else "" if hasattr(candidate, TASK_ATTRIBUTE) and getattr( candidate, TASK_ATTRIBUTE): dependencies = getattr( candidate, DEPENDS_ATTRIBUTE) if hasattr( candidate, DEPENDS_ATTRIBUTE) else None required_dependencies = [] optional_dependencies = [] if dependencies: dependencies = list(as_list(dependencies)) for d in dependencies: if type(d) is optional: d = as_list(d()) optional_dependencies += d else: required_dependencies.append(d) self.logger.debug( "Found task '%s' with required dependencies %s and optional dependencies %s", name, required_dependencies, optional_dependencies) self.execution_manager.register_task( Task(name, candidate, required_dependencies, description, optional_dependencies)) elif hasattr(candidate, ACTION_ATTRIBUTE) and getattr( candidate, ACTION_ATTRIBUTE): before = getattr(candidate, BEFORE_ATTRIBUTE) if hasattr( candidate, BEFORE_ATTRIBUTE) else None after = getattr(candidate, AFTER_ATTRIBUTE) if hasattr( candidate, AFTER_ATTRIBUTE) else None only_once = False if hasattr(candidate, ONLY_ONCE_ATTRIBUTE): only_once = getattr(candidate, ONLY_ONCE_ATTRIBUTE) teardown = False if hasattr(candidate, TEARDOWN_ATTRIBUTE): teardown = getattr(candidate, TEARDOWN_ATTRIBUTE) self.logger.debug("Found action %s", name) self.execution_manager.register_action( Action(name, candidate, before, after, description, only_once, teardown)) elif hasattr(candidate, INITIALIZER_ATTRIBUTE) and getattr( candidate, INITIALIZER_ATTRIBUTE): environments = [] if hasattr(candidate, ENVIRONMENTS_ATTRIBUTE): environments = getattr(candidate, ENVIRONMENTS_ATTRIBUTE) self.execution_manager.register_initializer( Initializer(name, candidate, environments, description))
def test_should_initialize_fields(self): def callable(): pass action = Action("callable", callable, "before", "after", "description") self.assertEquals(["before"], action.execute_before) self.assertEquals(["after"], action.execute_after) self.assertEquals("description", action.description)
def collect_tasks_and_actions_and_initializers(self, project_module): for name in dir(project_module): candidate = getattr(project_module, name) if hasattr(candidate, NAME_ATTRIBUTE): name = getattr(candidate, NAME_ATTRIBUTE) elif hasattr(candidate, "__name__"): name = candidate.__name__ description = getattr(candidate, DESCRIPTION_ATTRIBUTE) if hasattr( candidate, DESCRIPTION_ATTRIBUTE) else "" if hasattr(candidate, TASK_ATTRIBUTE) and getattr( candidate, TASK_ATTRIBUTE): dependencies = getattr( candidate, DEPENDS_ATTRIBUTE) if hasattr( candidate, DEPENDS_ATTRIBUTE) else None self.logger.debug("Found task %s", name) self.execution_manager.register_task( Task(name, candidate, dependencies, description)) elif hasattr(candidate, ACTION_ATTRIBUTE) and getattr( candidate, ACTION_ATTRIBUTE): before = getattr(candidate, BEFORE_ATTRIBUTE) if hasattr( candidate, BEFORE_ATTRIBUTE) else None after = getattr(candidate, AFTER_ATTRIBUTE) if hasattr( candidate, AFTER_ATTRIBUTE) else None only_once = False if hasattr(candidate, ONLY_ONCE_ATTRIBUTE): only_once = getattr(candidate, ONLY_ONCE_ATTRIBUTE) self.logger.debug("Found action %s", name) self.execution_manager.register_action( Action(name, candidate, before, after, description, only_once)) elif hasattr(candidate, INITIALIZER_ATTRIBUTE) and getattr( candidate, INITIALIZER_ATTRIBUTE): environments = [] if hasattr(candidate, ENVIRONMENTS_ATTRIBUTE): environments = getattr(candidate, ENVIRONMENTS_ATTRIBUTE) self.execution_manager.register_initializer( Initializer(name, candidate, environments, description))
def collect_tasks_and_actions_and_initializers(self, project_module): injected_task_dependencies = dict() def normalize_candidate_name(candidate): if hasattr(candidate, NAME_ATTRIBUTE): return getattr(candidate, NAME_ATTRIBUTE) elif hasattr(candidate, "__name__"): return candidate.__name__ def add_task_dependency(names, depends_on, optional): for name in as_list(names): if not isinstance(name, basestring): name = normalize_candidate_name(name) if name not in injected_task_dependencies: injected_task_dependencies[name] = list() injected_task_dependencies[name].append( TaskDependency(depends_on, optional)) for name in dir(project_module): candidate = getattr(project_module, name) if hasattr(candidate, TASK_ATTRIBUTE) and getattr( candidate, TASK_ATTRIBUTE): dependents = getattr( candidate, DEPENDENTS_ATTRIBUTE) if hasattr( candidate, DEPENDENTS_ATTRIBUTE) else None if dependents: dependents = list(as_list(dependents)) for d in dependents: if isinstance(d, optional): d = d() add_task_dependency(d, candidate, True) else: add_task_dependency(d, candidate, False) for name in dir(project_module): candidate = getattr(project_module, name) name = normalize_candidate_name(candidate) description = getattr(candidate, DESCRIPTION_ATTRIBUTE) if hasattr( candidate, DESCRIPTION_ATTRIBUTE) else "" if hasattr(candidate, TASK_ATTRIBUTE) and getattr( candidate, TASK_ATTRIBUTE): dependencies = getattr( candidate, DEPENDS_ATTRIBUTE) if hasattr( candidate, DEPENDS_ATTRIBUTE) else None task_dependencies = list() if dependencies: dependencies = list(as_list(dependencies)) for d in dependencies: if isinstance(d, optional): d = as_list(d()) task_dependencies.extend( [TaskDependency(item, True) for item in d]) else: task_dependencies.append(TaskDependency(d)) # Add injected if name in injected_task_dependencies: task_dependencies.extend(injected_task_dependencies[name]) self.logger.debug("Found task '%s' with dependencies %s", name, task_dependencies) self.execution_manager.register_task( Task(name, candidate, task_dependencies, description)) elif hasattr(candidate, ACTION_ATTRIBUTE) and getattr( candidate, ACTION_ATTRIBUTE): before = getattr(candidate, BEFORE_ATTRIBUTE) if hasattr( candidate, BEFORE_ATTRIBUTE) else None after = getattr(candidate, AFTER_ATTRIBUTE) if hasattr( candidate, AFTER_ATTRIBUTE) else None only_once = False if hasattr(candidate, ONLY_ONCE_ATTRIBUTE): only_once = getattr(candidate, ONLY_ONCE_ATTRIBUTE) teardown = False if hasattr(candidate, TEARDOWN_ATTRIBUTE): teardown = getattr(candidate, TEARDOWN_ATTRIBUTE) self.logger.debug("Found action %s", name) self.execution_manager.register_action( Action(name, candidate, before, after, description, only_once, teardown)) elif hasattr(candidate, INITIALIZER_ATTRIBUTE) and getattr( candidate, INITIALIZER_ATTRIBUTE): environments = [] if hasattr(candidate, ENVIRONMENTS_ATTRIBUTE): environments = getattr(candidate, ENVIRONMENTS_ATTRIBUTE) self.execution_manager.register_initializer( Initializer(name, candidate, environments, description))
def collect_project_annotations(self, project_module): injected_task_dependencies = {} def add_task_dependency(names, depends_on, optional): for name in as_list(names): if not isinstance(name, basestring): name = self.normalize_candidate_name(name) if name not in injected_task_dependencies: injected_task_dependencies[name] = list() injected_task_dependencies[name].append( TaskDependency(depends_on, optional)) for name in dir(project_module): candidate = getattr(project_module, name) name = self.normalize_candidate_name(candidate) if getattr(candidate, TASK_ATTRIBUTE, None): dependents = getattr(candidate, DEPENDENTS_ATTRIBUTE, None) if dependents: dependents = list(as_list(dependents)) for d in dependents: if isinstance(d, optional): d = d() add_task_dependency(d, name, True) else: add_task_dependency(d, name, False) for name in dir(project_module): candidate = getattr(project_module, name) name = self.normalize_candidate_name(candidate) description = getattr(candidate, DESCRIPTION_ATTRIBUTE, "") if getattr(candidate, TASK_ATTRIBUTE, None): dependencies = getattr(candidate, DEPENDS_ATTRIBUTE, None) task_dependencies = list() if dependencies: dependencies = list(as_list(dependencies)) for d in dependencies: if isinstance(d, optional): d = as_list(d()) task_dependencies.extend( [TaskDependency(item, True) for item in d]) else: task_dependencies.append(TaskDependency(d)) # Add injected if name in injected_task_dependencies: task_dependencies.extend(injected_task_dependencies[name]) del injected_task_dependencies[name] self.logger.debug("Found task '%s' with dependencies %s", name, task_dependencies) self.execution_manager.register_task( Task(name, candidate, task_dependencies, description)) elif getattr(candidate, ACTION_ATTRIBUTE, None): before = getattr(candidate, BEFORE_ATTRIBUTE, None) after = getattr(candidate, AFTER_ATTRIBUTE, None) only_once = getattr(candidate, ONLY_ONCE_ATTRIBUTE, False) teardown = getattr(candidate, TEARDOWN_ATTRIBUTE, False) self.logger.debug("Found action %s", name) self.execution_manager.register_action( Action(name, candidate, before, after, description, only_once, teardown)) elif getattr(candidate, INITIALIZER_ATTRIBUTE, None): environments = getattr(candidate, ENVIRONMENTS_ATTRIBUTE, []) self.execution_manager.register_initializer( Initializer(name, candidate, environments, description)) elif getattr(candidate, FINALIZER_ATTRIBUTE, None): environments = getattr(candidate, ENVIRONMENTS_ATTRIBUTE, []) self.execution_manager.register_finalizer( Finalizer(name, candidate, environments, description)) self.execution_manager.register_late_task_dependencies( injected_task_dependencies)