def __init__(self, task): super(_InternalTask, self).__init__( task.Name, Interface.CreateCulledCallable(task.Functor), ) # Working data self.output = '' self.result = 0 self.time_delta_string = '' self.status = None self.status_lock = threading.Lock() self.complete = threading.Event()
def Transform( items, functor, # def Func(item) -> transformed item optional_output_stream, display_exception_callstack=False, display_errors=True, num_concurrent_tasks=None, name_functor=None, # def Func(index, item) -> string ): """ Applies the functor to each item in the list of items, returning a list of transformed items. The operation is considered to be atomic, and will raise an exception if one or more of the functor invocations fail. """ assert items assert functor functor = Interface.CreateCulledCallable(functor) name_functor = name_functor or (lambda index, item: "Results from {} [{}]".format(str(item), index)) transformed_items = [ None, ] * len(items) # ---------------------------------------------------------------------- def Impl(task_index, on_status_update): transformed_items[task_index] = functor(OrderedDict([ ( "item", items[task_index] ), ( "on_status_update", on_status_update ), ])) # ---------------------------------------------------------------------- Execute( [ Task(name_functor(index, item), Impl) for index, item in enumerate(items) ], output_stream=optional_output_stream, progress_bar=bool(optional_output_stream), raise_on_error=True, display_exception_callstack=display_exception_callstack, display_errors=display_errors, num_concurrent_tasks=num_concurrent_tasks, ) return transformed_items
def _Impl( display_sentinel, json_filename, result_filename, first, output_stream, method_name, parser, ): output_stream = StreamDecorator( output_stream, line_prefix=display_sentinel, ) with open(json_filename) as f: try: data = parser(f.read(), is_root=True) except Exception as ex: output_stream.write("ERROR: {} ({})\n".format(str(ex), ex.stack)) return -1 output_stream.write("Parsing dependencies...") with output_stream.DoneManager(): dependencies = ActivationData.Load(None, None, None).PrioritizedRepositories has_config_specific = False output_stream.write("Validating...") with output_stream.DoneManager() as dm: for index, repository_info in enumerate(dependencies): dm.stream.write("Processing '{}' ({} of {})...".format( repository_info.Name, index + 1, len(dependencies), )) with dm.stream.DoneManager() as this_dm: with Utilities.CustomMethodManager(os.path.join(repository_info.Root, Constants.HOOK_ENVIRONMENT_CUSTOMIZATION_FILENAME), method_name) as method: if not method: continue args = OrderedDict([ ( "data", data ), ( "output_stream", this_dm.stream ), ]) # Get the method args to see if a configuration is requried func_code = six.get_function_code(method) if "configuration" in func_code.co_varnames[:func_code.co_argcount]: args["configuration"] = repository_info.Configuration has_config_specific = True elif not first: # Don't call a config-agnostic method more than once continue try: this_dm.result = Interface.CreateCulledCallable(method)(args) or 0 except Exception as ex: this_dm.stream.write(StringHelpers.LeftJustify( "ERROR: {}\n".format(str(ex).rstrip()), len("ERROR: "), )) this_dm.result = -1 with open(result_filename, 'w') as f: f.write('-1' if dm.result != 0 else '1' if has_config_specific else '0') return dm.result