Package: px-pipeline
Pipeline runnerInstallationpipinstallpx-pipelineUsageSimple usage:frompx_pipelineimportStraightPipeline,StopFlowdefsecond_pipeline_handler(context:dict)->Optional[dict]:if'nothing'incontext:# You could return empty result so nothing would happen with context.return# You could mutate context with new datacontext['update']=True# Or return a chunk of data, that will update context object.return{'update':False}defflow_stopper(context):ifcontext.get('update',False):return{'stopped':False}# Or you could raise an error that will stop pipeline from further execution.raiseStopFlow({'stopped':True})pipeline=StraightPipeline((# Callables can be used in form of import strings.'some.path.to.your.execution_function',second_pipeline_handler,flow_stopper,))result=pipeline({})print(result['stopped'])# > Trueprint(result['update'])# > Falsepipeline=StraightPipeline((flow_stopper,lambdacontext:{'called':True},))result=pipeline({'update':True})print(result['stopped'])# > Falseprint(result['update'])# > Trueprint(result['called'])# > True# Here flow stopped and lambda function were not executed.result=pipeline({'update':False})print(result['stopped'])# > Trueprint(result['update'])# > Falseprint('called'inresult)# > FalseFilterIt's a wrapper aroundPipelineclass, by default it uses aStraightPipelinerunner. It works similarly to Django'sSignalAPI and gives the ability to add and remove handlers from pipeline runners.It might be useful when you have an breakpoints in your app/library that might be extended from outside. It not just an event that fires, and only informs about something, but you can also change incoming the data in some way that fits your logic.So based on previous code it could look like that:frompx_pipelineimportFilter,StraightPipelinetable_data_for_report_generated=Filter(# Initial pipeline that your app provides for this breakpoint.initial=('some.path.to.your.execution_function',second_pipeline_handler,),# Class that will handle pipeline running. Optional.pipeline_class=StraightPipeline,# Default priority which your handlers will have by default.default_priority=10,)# ...# Elsewhere outside your app you may add handlers to pipeline runner.# Handlers by default will be run in the order they was registered.table_data_for_report_generated.add(# Handle function.flow_stopper,# This function's priority. Optional.priority=10,# By default there are 3 layers of execution:#   1. PRECEDE - Those handlers that must be executed at first.#   2. AVERAGE - Default layer where all handlers executes.#   3. FINAL - Those handlers that must be executed at the end.# Layers are just another type priority separation.# Optional.layer=table_data_for_report_generated.Layer.PRECEDE,)# ...# Somewhere in your code you run this filter.# Runs `pipeline_class` that you were provided previously(or default one).result=table_data_for_report_generated({})print(result['stopped'])# > Trueprint(result['update'])# > FalseChangelogAll notable changes to this project will be documented in this file.The format is based onKeep a Changelog,
and this project adheres toSemantic Versioning.[Unreleased][0.1.2]FixedFixed empty filter run.[0.1.1]AddedFilters API.[0.1.0]Initial version.