Metadata-Version: 2.1
Name: DemPipe
Version: 0.0.2
Summary: A simple Pipeline creator
Home-page: https://github.com/hmiladhia/DemPipe
Author: Dhia Hmila
Author-email: hmiladhia@hotmail.fr
License: UNKNOWN
Platform: UNKNOWN
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >= 3.6
Description-Content-Type: text/markdown
Requires-Dist: configDmanager (>=0.1.8)
Requires-Dist: Dmail (>=0.1.0)

# DemPipe

## Installation

A simple pip install will do :

```bash
python -m pip install DemPipe
```

## Use
```python
from DemPipe import PipeExecutor, Action

with PipeExecutor() as pipe:
    actions = [Action(lambda x: x**2, 2),  # returns 4
               Action(lambda x: x+3, ctx_in='last_value', ctx_out='my_result_name'),  # returns 4+3
               Action(lambda x: x*2, ctx_in='my_result_name')  # returns 2*7
              ]
    result = pipe.execute(actions)
    print('result:', result)  # 14
    print('result (from context):', pipe.context['last_value'])  # 14
    print('my_result_name:', pipe.context['my_result_name'])  # 7
```

You can also use a Trigger Action for conditional Actions in the pipeline ! 
```python
from DemPipe import PipeExecutor, Action, Trigger

with PipeExecutor() as pipe:
    actions = [Action(lambda x: x**2, 2),  # returns 4
               Trigger(lambda x: x==3,   # returns False -> executes the second action
                       Action(lambda x: x+3, ctx_in='last_value'),  # ignored
                       Action(lambda x: x+7, ctx_in='last_value'),  # returns 11
                       ctx_in='last_value')
              ]
    result = pipe.execute(actions)
    print('result:', result)  # 11
```

## Error Handling
In case an error occurs, you can configure an automatic e-mail to be sent with the traceback and the error message :
- Create a config file containing your credentials : 
```json
{
  "mail": {
    "mail_server": "smtp.gmail.com",
	"mail_port": 587,
	"mail_user": "${os_environ[user]}",
	"mail_password": "${os_environ[password]}",
	"mail_use_tls": true,
	"mail_default_receiver": "${os_environ[receiver]}"
  },
  "pipe_name": "My Pipe"
}
```

- Specify **config_file** to the **PipeExecutor**
```python
from DemPipe import PipeExecutor, Action

with PipeExecutor(config_file='ConfigsFolder.MyConfig') as pipe:
    pipe.execute(Action(lambda x: x/0, 2))  # raises ZeroDivisionException
```

## Other Types of actions

In addition to Trigger and Action there exist other kinds of actions :

- **ContextSetter**: Makes it easier to set context values :

  ```python
  actions = [ContextSetter(var1=5, var2="test string"),
             Action(lambda x: x**2, ctx_in='var1')]
  print(pipe.execute(actions))  # 25

  actions = [ContextSetter(lambda c: {'var1': c['var2'] * 3}, var2=4), 
             Action(lambda x: x**2, ctx_in='variable1')]
  print(pipe.execute(actions))  # 144
  ```

- **Procedure**: Same as an action but doesn't update the current context with its return value :

  ```python
  actions = [ContextSetter(last_value=3),
             Procedure(lambda x: x**2, ctx_in='last_value'),
             Action(lambda x: x + 2, ctx_in='last_value')]
  print(pipe.execute(actions))  # 5
  ```

