Skip to content
requests.py 5.22 KiB
Newer Older
import re


class Requests:
    def __init__(self, variables, apiutils_variables):
        self.op = {
            'Create Entity Selecting Content Type': {
                'positions': [1, 3],
                'params': ['filename', 'content_type']
            },
            'Create Subscription': {
                'positions': [2, 3],
                'params': ['filename', 'content_type']
            },
            'Create Or Update Temporal Representation Of Entity Selecting Content Type':  {
                'positions': [2, 3],
                'params': ['filename', 'content_type']
            },
            'Batch Create Entities': {
                'positions': [2],
                'params': ['content_type']
            },
            'Create Context Source Registration With Return': {
                'positions': [1],
                'params': ['filename']

            }
        }
        self.description = {
            'Create Entity Selecting Content Type':
                Requests.create_entity_selecting_content_type,
            'Create Subscription':
                Requests.create_entity_selecting_content_type,
            'Create Or Update Temporal Representation Of Entity Selecting Content Type':
                Requests.create_entity_selecting_content_type,
            'Batch Create Entities':
                Requests.batch_create_entities,
            'Create Context Source Registration With Return':
                Requests.create_context_source_registration_with_return
            }
        self.variables = variables
        self.apiutils_variables = apiutils_variables

    def get_description(self, string):
        keys = self.op.keys()
        params = dict()

        index = None
        for k in keys:
            index = string.find(k)
            if index != -1:
                break

        pattern = f"^.*{k}.*\n"
        lines_starting_with_request = re.findall(pattern, string, re.MULTILINE)
        for line in lines_starting_with_request:
            data = line.strip().split("    ")
            if len(data) == 2:
                # We are in multiline definition
                params = self.find_attributes_next_line(string=string, position=index, request_name=k)
            else:
                # The definition of the request is in the same line
                params = self.find_attributes_in_the_same_line(request_name=k, params=data[1:])

        description = self.description[k](params)
        return description

    def find_attributes_in_the_same_line(self, request_name, params):
        param = dict()
        for i in range(0, len(self.op[request_name]['positions'])):
            param_position = self.op[request_name]['positions'][i]
            param_key = self.op[request_name]['params'][i]
            param_value = self.get_value(params=params, param_position=param_position)
            param[param_key] = param_value

        return param

    def find_attributes_next_line(self, string, position, request_name):
        aux = string[position+len(request_name)+1:].split('\n')

        params = list()
        for a in range(0, len(aux)):
            param = aux[a]
            if param.startswith("    ..."):
                params.append(param.split('    ')[-1])
            else:
                break

        param = dict()
        for i in range(0, len(self.op[request_name]['positions'])):
            print(i)
            param_position = self.op[request_name]['positions'][i] - 1
            param_value = self.get_value(params=params, param_position=param_position)
            param_key = self.op[request_name]['params'][i]
            param[param_key] = param_value

        return param

    @staticmethod
    def create_entity_selecting_content_type(kwargs) -> str:
        if 'filename' in kwargs and 'content_type' in kwargs:
            result = (f"Request Header['Content-Type'] set to '{kwargs['content_type']}' and\n "
                      f"payload defined in file: '{kwargs['filename']}'")
            return result
        else:
            raise Exception(f"ERROR, expected filename and content_type attributes, but received {kwargs}")

    @staticmethod
    def batch_create_entities(kwargs) -> str:
        if 'content_type' in kwargs:
            result = (f"Request Header['Content-Type'] set to '{kwargs['content_type']}' and\n "
                      f"payload set to a list of entities to be created")
            return result
        else:
            raise Exception(f"ERROR, expected content_type attribute, but received {kwargs}")

    @staticmethod
    def create_context_source_registration_with_return(kwargs) -> str:
        if 'filename' in kwargs:
            result = (f"Request Header['Content-Type'] set to 'application/ld+json' and\n "
                      f"payload defined in file: '{kwargs['filename']}'")
            return result
        else:
            raise Exception(f"ERROR, expected filename attribute, but received {kwargs}")

    def get_value(self, params, param_position):
        try:
            value = self.variables[params[param_position]]
            return value
        except KeyError:
            try:
                value = self.apiutils_variables[params[param_position]]
                return value
            except KeyError:
                return params[param_position]