blip-flowanalysis 0.6.1
A solution for chatbot constructors to identify problems in flow structure.
License: MIT License
Keywords: chatbot,flow,analysis

# Blip Flow Analysis
Blip Flow Analysis provides a solution for chatbot constructors to identify problems in flow structure 
that can be originated from bad structuring or poor organization.

# Installation
Use [pip](https://pip.pypa.io/en/stable/) to install:

```shell script
pip install blip_flowanalysis
```

# Usage

## Missing Trackings analysis

Using the `MissingTrackigns` analyser:

```python
import blip_flowanalysis as bfa

# Replace __chatbot_as_json__ parameter by your json bot.
bot_flow = bfa.Flow(__chatbot_as_json__)
analyser = bfa.MissingTrackings(minimum=1)

# Return `True` if amount of Trackings is above minimum, `False` otherwise.
print(analyser.analyse(bot_flow)) 
```

## Process HTTP Return Validation analysis

Using the `ProcessHTTPReturnValidation` analyser:

```python
# import json
import blip_flowanalysis as bfa

bot_json = str("Your chatbot json here.")
# bot_json = json.load("or your chatbot json file here")

bot_flow = bfa.Flow(bot_json)
http_analyser = bfa.ProcessHTTPReturnValidation()

# Report with "summary" and "details" with long scripts detections.
report = http_analyser.analyse(bot_flow)

print(report)
```

Output is like:

```
{
    "summary": {
        "process HTTP actions": n_process_http,
        "process HTTP actions regular": n_regular,
        "process HTTP actions missing status": n_missing_status,
        "process HTTP actions missing body": n_missing_body,
        "process HTTP actions improper declared body": n_improper_declared_body,
        "process HTTP actions any used body before status": n_any_used_body_before_status,
        "states count": n_states,
        "states with irregular process HTTP action": n_irregular_states
    },
    "details": [
        {
            "state id": state_id,  # State ID on bot flow.
            "state name": state_name,  # State name on bot flow.
            "io action": io_action,  # Any of inputActions and outputActions.
            "action number": action_number,  # Action position on actions list.
            "http method": http_method,  # Examples: GET, PUT, POST, ...
            "status variable": status_variable,  # Variable with response status value
            "body variable": body_variable,  # Variable with response body value
            "all paths used status": true/false,  # Check if all paths after process HTTP used status
            "all paths used body": true/false,  # Check if all paths after process HTTP used body
            "declared status": true/false,  # Check if status variable was declared
            "declared body": true/false,  # Check if body variable was declared
            "must use body": true/false,  # Check if HTTP method requires use body
            "must not declare body": true/false,  # Check if HTTP method requires not use body
            "paths with missing status": [  # Empty if "all paths used status" is true
                {
                    "path": [
                        {"id": state_id, "name": state_name},  # States on this path
                        ...
                    ],
                    "status use": {}  # On "paths with miss status" it is empty
                    "body use": {
                        "state": {"id": state_id, "name": state_name},  # State with first body use
                        "stage on state": stage,  # inputActions, outputs or outputActions
                        "index on stage": index  # Index on stage with first body use
                    }
                },
                ...
            ],
            "paths with missing body": [
                {
                    "path": [
                        {"id": state_id, "name": state_name},  # States on this path
                        ...
                    ],
                    "status use": {
                        "state": {"id": state_id, "name": state_name},  # State with first status use
                        "stage on state": stage,  # inputActions, outputs or outputActions
                        "index on stage": index  # Index on stage with first status use
                    }
                    "body use": {}  # On "paths with miss body" it is empty
                },
                ...
            ],
            "paths with body before status": [
                {
                    "path": [
                        {"id": state_id, "name": state_name},  # States on this path
                        ...
                    ],
                    "status use": {
                        "state": {"id": state_id, "name": state_name},  # State with first status use
                        "stage on state": stage,  # inputActions, outputs or outputActions
                        "index on stage": index  # Index on stage with first status use
                    }
                    "body use": {
                        "state": {"id": state_id, "name": state_name},  # State with first body use
                        "stage on state": stage,  # inputActions, outputs or outputActions
                        "index on stage": index  # Index on stage with first body use
                    }
                },
                ...
            ],
            "causes": causes  # Explain why this process HTTP return validation is irregular.
        },
        ...
    ]
}
```

## Long Scripts analysis

Using the `LongScript` analyser:

```python
# import json
import blip_flowanalysis as bfa

bot_json = str("Your chatbot json here.")
# bot_json = json.load("or your chatbot json file here")

bot_flow = bfa.Flow(bot_json)
ls_analyser = bfa.LongScript()

# Report with "summary" and "details" with long scripts detections.
report = ls_analyser.analyse(bot_flow)

print(report)
```

Output is like:

```
{
    "summary": {
        "scripts count": n_scripts,
        "scripts too long": n_long_scripts,
        "states count": n_states,
        "states with too long scripts": n_irregular_states
    },
    "details": [
        {
            "state id": state_id,  # State ID on bot flow.
            "state name": state_name,  # State name on bot flow.
            "io action": io_action,  # Any of inputActions and outputActions.
            "action number": action_number,  # Action position on actions list.
            "script": script,  # Script.
            "chars": length,  # Code characters quantity.
            "lines": lines,  # Not blank code lines quantity.
            "functions": functions,  # Top level functions quantity.
            "commands": commands,  # Commands quantity.
            "lines by commands": lines_by_commands,  # Lines commands ratio.
            "causes": cause  # Explain why this script was detected.
        },
        ...
    ]
}
```

## Duplicated Paths analysis

Using the `DuplicatedPaths` analyser:

```python
# import json
import blip_flowanalysis as bfa

bot_json = str("Your chatbot json here.")
# bot_json = json.load("or your chatbot json file here")

bot_flow = bfa.Flow(bot_json)
dp_analyser = bfa.DuplicatedPaths()

# Report with "summary" and "details" with long scripts detections.
report = dp_analyser.analyse(bot_flow)

print(report)
```

Output is like:

```
{
    "summary": {
        "pairs of duplicated paths": n_duplicated_paths,
        "states count": n_states,
        "states on duplicated paths": n_irregular_states
    },
    "details": [
        {
            "levels quantity": n_levels,  # Quantity of levels on path
            "states quantity": n_states_on_path,  # Quantity of states on path
            "root 0": {"id": state_id, "name": state_name},  # State as root on path 0
            "root 1": {"id": state_id, "name": state_name},  # State as root on path 1
            "path 0": {  # Path 0
                "level 0": [  # First level on path 0
                    {"id": state_id, "name": state_name},  # States on level 0 on path 0
                    ...  # Other states
                ],
                ...  # Other levels
            },
            "path 1": {  # Path 1
                "level 0": [  # First level on path 1
                    {"id": state_id, "name": state_name},  # States on level 0 on path 1
                    ...  # Other states
                ],
                ...  # Other levels
            },
        },
        ...
    ]
}
```

# Author
[Take Data&Analytics Research](anaytics.dar@take.net)

# License
[MIT License](LICENSE)