Exemple #1
0
    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()
Exemple #2
0
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