Module misty2py.action

This module's function is to send action requests via the action keywords matching to Misty's API endpoints, sending action requests and matching data shortcuts.

Classes

class Action (ip: str,
protocol: str,
custom_allowed_actions: Dict = {},
custom_allowed_data: Dict = {})
Expand source code
class Action(BodyRequest):
    """A class representing an action request for Misty."""

    def perform_action(
        self, action_name: str, data: Union[str, Dict], data_method: str
    ) -> Misty2pyResponse:
        """Sends an action request to Misty.

        Args:
            action_name (str): The action keyword specifying which action is requested.
            data (Union[str, Dict]): The data shortcut representing the data supplied in the body of the request or the json dictionary to be supplied in the body of the request.
            data_method (str): "dict" if the data is supplied as a json dictionary, "string" if the data is supplied as a data shortcut.

        Returns:
            Misty2pyResponse: A Misty2pyResponse object with Misty2py sub-response and Misty REST API sub-response.
        """

        if action_name not in self.allowed_actions.keys():
            return Misty2pyResponse(
                False,
                error_msg="Command `%s` not supported." % action_name,
                error_type=Misty2pyErrorType.COMMAND,
            )

        if data_method == "dict":
            try:
                return super().perform_action(
                    self.allowed_actions[action_name]["endpoint"],
                    data,
                    request_method=(self.allowed_actions[action_name]["method"]),
                )

            except Exception as e:
                return unknown_error(e)

        if data_method == "string" and data in self.allowed_data:
            try:
                return super().perform_action(
                    self.allowed_actions[action_name]["endpoint"],
                    self.allowed_data[data],
                    request_method=(self.allowed_actions[action_name]["method"]),
                )

            except Exception as e:
                return unknown_error(e)

        else:
            return Misty2pyResponse(
                False,
                error_type=Misty2pyErrorType.DATA_SHORTCUT,
                error_msg="Data shortcut `%s` is not supported." % data,
            )

    def action_handler(
        self, action_name: str, data: Union[Dict, str]
    ) -> Misty2pyResponse:
        """Sends Misty a request to perform an action.

        Args:
            action_name (str): The keyword specifying the action to perform.
            data (Union[Dict, str]): The data to send in the request body in the form of a data shortcut or a json dictionary.

        Returns:
            Misty2pyResponse: A Misty2pyResponse object with Misty2py sub-response and Misty REST API sub-response.
        """

        if (
            action_name == "led_trans"
            and isinstance(data, Dict)
            and len(data) >= 2
            and len(data) <= 4
        ):

            try:
                data = construct_transition_dict(data, self.allowed_data)

            except ValueError as e:
                return Misty2pyResponse(
                    False, error_msg=e, error_type=Misty2pyErrorType.DATA_FORMAT
                )

        data_method = "string"

        if isinstance(data, Dict):
            data_method = "dict"

        return self.perform_action(action_name, data, data_method)

A class representing an action request for Misty.

Initialises a Post object.

Args

ip : str
The IP address where the requests are sent.
protocol : str
The protocol for the URL where the requests are sent.
custom_allowed_actions : Dict, optional
The dictionary of action keywords. Defaults to {}.
custom_allowed_data : Dict, optional
The dictionary of data shortcuts. Defaults to {}.

Ancestors

Methods

def action_handler(self, action_name: str, data: Dict | str) ‑> Misty2pyResponse
Expand source code
def action_handler(
    self, action_name: str, data: Union[Dict, str]
) -> Misty2pyResponse:
    """Sends Misty a request to perform an action.

    Args:
        action_name (str): The keyword specifying the action to perform.
        data (Union[Dict, str]): The data to send in the request body in the form of a data shortcut or a json dictionary.

    Returns:
        Misty2pyResponse: A Misty2pyResponse object with Misty2py sub-response and Misty REST API sub-response.
    """

    if (
        action_name == "led_trans"
        and isinstance(data, Dict)
        and len(data) >= 2
        and len(data) <= 4
    ):

        try:
            data = construct_transition_dict(data, self.allowed_data)

        except ValueError as e:
            return Misty2pyResponse(
                False, error_msg=e, error_type=Misty2pyErrorType.DATA_FORMAT
            )

    data_method = "string"

    if isinstance(data, Dict):
        data_method = "dict"

    return self.perform_action(action_name, data, data_method)

Sends Misty a request to perform an action.

Args

action_name : str
The keyword specifying the action to perform.
data : Union[Dict, str]
The data to send in the request body in the form of a data shortcut or a json dictionary.

Returns

Misty2pyResponse
A Misty2pyResponse object with Misty2py sub-response and Misty REST API sub-response.
def perform_action(self, action_name: str, data: Dict | str, data_method: str) ‑> Misty2pyResponse
Expand source code
def perform_action(
    self, action_name: str, data: Union[str, Dict], data_method: str
) -> Misty2pyResponse:
    """Sends an action request to Misty.

    Args:
        action_name (str): The action keyword specifying which action is requested.
        data (Union[str, Dict]): The data shortcut representing the data supplied in the body of the request or the json dictionary to be supplied in the body of the request.
        data_method (str): "dict" if the data is supplied as a json dictionary, "string" if the data is supplied as a data shortcut.

    Returns:
        Misty2pyResponse: A Misty2pyResponse object with Misty2py sub-response and Misty REST API sub-response.
    """

    if action_name not in self.allowed_actions.keys():
        return Misty2pyResponse(
            False,
            error_msg="Command `%s` not supported." % action_name,
            error_type=Misty2pyErrorType.COMMAND,
        )

    if data_method == "dict":
        try:
            return super().perform_action(
                self.allowed_actions[action_name]["endpoint"],
                data,
                request_method=(self.allowed_actions[action_name]["method"]),
            )

        except Exception as e:
            return unknown_error(e)

    if data_method == "string" and data in self.allowed_data:
        try:
            return super().perform_action(
                self.allowed_actions[action_name]["endpoint"],
                self.allowed_data[data],
                request_method=(self.allowed_actions[action_name]["method"]),
            )

        except Exception as e:
            return unknown_error(e)

    else:
        return Misty2pyResponse(
            False,
            error_type=Misty2pyErrorType.DATA_SHORTCUT,
            error_msg="Data shortcut `%s` is not supported." % data,
        )

Sends an action request to Misty.

Args

action_name : str
The action keyword specifying which action is requested.
data : Union[str, Dict]
The data shortcut representing the data supplied in the body of the request or the json dictionary to be supplied in the body of the request.
data_method : str
"dict" if the data is supplied as a json dictionary, "string" if the data is supplied as a data shortcut.

Returns

Misty2pyResponse
A Misty2pyResponse object with Misty2py sub-response and Misty REST API sub-response.
class BodyRequest (ip: str,
protocol: str,
custom_allowed_actions: Dict = {},
custom_allowed_data: Dict = {})
Expand source code
class BodyRequest:
    """A class representing the url request methods with a body.

    Attributes:
        ip (str): The IP address for the URL where the requests are sent.
        protocol (str): The protocol for the URL where the requests are sent.
        allowed_actions (dict): The dictionary of custom action keywords matching to the Misty's REST API endpoints.
        allowed_data (dict): The dictionary of custom data shortcuts matching to the json dictionaries required by Misty's REST API.
    """

    def __init__(
        self,
        ip: str,
        protocol: str,
        custom_allowed_actions: Dict = {},
        custom_allowed_data: Dict = {},
    ) -> None:
        """Initialises a Post object.

        Args:
            ip (str): The IP address where the requests are sent.
            protocol (str): The protocol for the URL where the requests are sent.
            custom_allowed_actions (Dict, optional): The dictionary of action keywords. Defaults to `{}`.
            custom_allowed_data (Dict, optional): The dictionary of data shortcuts. Defaults to `{}`.
        """

        self.ip = ip
        self.protocol = protocol

        allowed_actions = custom_allowed_actions
        f = open(ACTIONS_JSON)
        allowed_actions.update(json.loads(f.read()))
        f.close()
        self.allowed_actions = allowed_actions

        allowed_data = custom_allowed_data
        f = open(DATA_JSON)
        allowed_data.update(json.loads(f.read()))
        f.close()
        self.allowed_data = allowed_data

    def perform_action(
        self, endpoint: str, data: Dict, request_method: str = "post"
    ) -> Misty2pyResponse:
        """Sends an action request.

        Args:
            endpoint (str): The REST API endpoint to which the request is sent.
            data (Dict): The json data supplied in the body of the request.
            request_method (str, optional): The request method. Defaults to `"post"`.

        Returns:
            Misty2pyResponse: A Misty2pyResponse object with Misty2py sub-response and Misty REST API sub-response.
        """

        if request_method.upper() not in VALID_HTTP_REQUEST_METHODS:
            return Misty2pyResponse(
                False,
                error_msg="Request method `%s` is not supported." % request_method,
                error_type=Misty2pyErrorType.REQUEST_METHOD,
            )

        response = requests.request(
            request_method.upper(),
            "%s://%s/%s" % (self.protocol, self.ip, endpoint),
            json=data,
        )

        try:
            return Misty2pyResponse(True, rest_response=response.json())

        except Exception as e:
            return Misty2pyResponse(
                False,
                rest_response=response.content,
                error_msg=e,
                error_type=Misty2pyErrorType.UNKNOWN,
            )

A class representing the url request methods with a body.

Attributes

ip : str
The IP address for the URL where the requests are sent.
protocol : str
The protocol for the URL where the requests are sent.
allowed_actions : dict
The dictionary of custom action keywords matching to the Misty's REST API endpoints.
allowed_data : dict
The dictionary of custom data shortcuts matching to the json dictionaries required by Misty's REST API.

Initialises a Post object.

Args

ip : str
The IP address where the requests are sent.
protocol : str
The protocol for the URL where the requests are sent.
custom_allowed_actions : Dict, optional
The dictionary of action keywords. Defaults to {}.
custom_allowed_data : Dict, optional
The dictionary of data shortcuts. Defaults to {}.

Subclasses

Methods

def perform_action(self, endpoint: str, data: Dict, request_method: str = 'post') ‑> Misty2pyResponse
Expand source code
def perform_action(
    self, endpoint: str, data: Dict, request_method: str = "post"
) -> Misty2pyResponse:
    """Sends an action request.

    Args:
        endpoint (str): The REST API endpoint to which the request is sent.
        data (Dict): The json data supplied in the body of the request.
        request_method (str, optional): The request method. Defaults to `"post"`.

    Returns:
        Misty2pyResponse: A Misty2pyResponse object with Misty2py sub-response and Misty REST API sub-response.
    """

    if request_method.upper() not in VALID_HTTP_REQUEST_METHODS:
        return Misty2pyResponse(
            False,
            error_msg="Request method `%s` is not supported." % request_method,
            error_type=Misty2pyErrorType.REQUEST_METHOD,
        )

    response = requests.request(
        request_method.upper(),
        "%s://%s/%s" % (self.protocol, self.ip, endpoint),
        json=data,
    )

    try:
        return Misty2pyResponse(True, rest_response=response.json())

    except Exception as e:
        return Misty2pyResponse(
            False,
            rest_response=response.content,
            error_msg=e,
            error_type=Misty2pyErrorType.UNKNOWN,
        )

Sends an action request.

Args

endpoint : str
The REST API endpoint to which the request is sent.
data : Dict
The json data supplied in the body of the request.
request_method : str, optional
The request method. Defaults to "post".

Returns

Misty2pyResponse
A Misty2pyResponse object with Misty2py sub-response and Misty REST API sub-response.