simplify get_message
This commit is contained in:
parent
db8bdf4a6d
commit
efb8f22872
@ -1,4 +1,3 @@
|
|||||||
from collections import OrderedDict
|
|
||||||
from os.path import join, basename, dirname
|
from os.path import join, basename, dirname
|
||||||
from glob import glob
|
from glob import glob
|
||||||
|
|
||||||
@ -9,8 +8,11 @@ from tiramisu import StrOption, IntOption, BoolOption, ChoiceOption, OptionDescr
|
|||||||
from yaml import load, SafeLoader
|
from yaml import load, SafeLoader
|
||||||
from os import listdir
|
from os import listdir
|
||||||
from os.path import isfile
|
from os.path import isfile
|
||||||
from ..config import get_config
|
|
||||||
from ..utils import _
|
|
||||||
|
from .config import get_config
|
||||||
|
from .utils import _
|
||||||
|
|
||||||
|
|
||||||
MESSAGE_ROOT_PATH = get_config()['global']['message_root_path']
|
MESSAGE_ROOT_PATH = get_config()['global']['message_root_path']
|
||||||
CUSTOMTYPES = {}
|
CUSTOMTYPES = {}
|
||||||
@ -42,14 +44,16 @@ class MessageDefinition:
|
|||||||
A MessageDefinition is a representation of a message in the Zephir application messaging context
|
A MessageDefinition is a representation of a message in the Zephir application messaging context
|
||||||
"""
|
"""
|
||||||
__slots__ = ('version',
|
__slots__ = ('version',
|
||||||
'uri',
|
'message',
|
||||||
'description',
|
'description',
|
||||||
'parameters',
|
'parameters',
|
||||||
'default_roles',
|
'default_roles',
|
||||||
'errors',
|
'errors',
|
||||||
'pattern',
|
'pattern',
|
||||||
'related',
|
'related',
|
||||||
'response')
|
'response',
|
||||||
|
'options',
|
||||||
|
)
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
raw_def,
|
raw_def,
|
||||||
@ -57,17 +61,18 @@ class MessageDefinition:
|
|||||||
message):
|
message):
|
||||||
# default value for non mandatory key
|
# default value for non mandatory key
|
||||||
self.version = version
|
self.version = version
|
||||||
self.parameters = OrderedDict()
|
self.parameters = {}
|
||||||
self.errors = []
|
self.errors = []
|
||||||
self.related = []
|
self.related = []
|
||||||
self.default_roles = []
|
self.default_roles = []
|
||||||
self.response = None
|
self.response = None
|
||||||
self.uri = message
|
self.message = message
|
||||||
|
self.options = None
|
||||||
|
|
||||||
# loads yaml information into object
|
# loads yaml information into object
|
||||||
for key, value in raw_def.items():
|
for key, value in raw_def.items():
|
||||||
if key == 'uri':
|
if key == 'message':
|
||||||
raise Exception('uri in not allowed in message')
|
raise Exception('message in not allowed in message')
|
||||||
if isinstance(value, str):
|
if isinstance(value, str):
|
||||||
value = value.strip()
|
value = value.strip()
|
||||||
if key == 'pattern':
|
if key == 'pattern':
|
||||||
@ -83,8 +88,10 @@ class MessageDefinition:
|
|||||||
elif key == 'response':
|
elif key == 'response':
|
||||||
value = ResponseDefinition(value,
|
value = ResponseDefinition(value,
|
||||||
self.version)
|
self.version)
|
||||||
elif key == 'errors':
|
elif key == 'description':
|
||||||
value = _parse_error_definition(value)
|
value = value.strip().rstrip()
|
||||||
|
if value.endswith('.'):
|
||||||
|
value = value[:-1]
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
# check mandatory keys
|
# check mandatory keys
|
||||||
for key in self.__slots__:
|
for key in self.__slots__:
|
||||||
@ -130,6 +137,9 @@ class ParameterDefinition:
|
|||||||
else:
|
else:
|
||||||
self._valid_type(value)
|
self._valid_type(value)
|
||||||
#self._valid_type(value)
|
#self._valid_type(value)
|
||||||
|
elif key == 'description':
|
||||||
|
if value.endswith('.'):
|
||||||
|
value = value[:-1]
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
# check mandatory keys
|
# check mandatory keys
|
||||||
for key in self.__slots__:
|
for key in self.__slots__:
|
||||||
@ -182,6 +192,9 @@ class ResponseDefinition:
|
|||||||
value = CUSTOMTYPES[version][value].type
|
value = CUSTOMTYPES[version][value].type
|
||||||
else:
|
else:
|
||||||
self._valid_type(value)
|
self._valid_type(value)
|
||||||
|
elif key == 'description':
|
||||||
|
if value.endswith('.'):
|
||||||
|
value = value[:-1]
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
# check mandatory keys
|
# check mandatory keys
|
||||||
for key in self.__slots__:
|
for key in self.__slots__:
|
||||||
@ -197,29 +210,9 @@ class ResponseDefinition:
|
|||||||
raise Exception(_('unknown parameter type: {}').format(typ))
|
raise Exception(_('unknown parameter type: {}').format(typ))
|
||||||
|
|
||||||
|
|
||||||
class ErrorDefinition:
|
|
||||||
"""
|
|
||||||
An ErrorDefinition is a representation of an error in the Zephir application messaging context
|
|
||||||
"""
|
|
||||||
__slots__ = ('uri',)
|
|
||||||
|
|
||||||
def __init__(self, raw_err):
|
|
||||||
extra_keys = set(raw_err) - set(self.__slots__)
|
|
||||||
if extra_keys:
|
|
||||||
raise Exception(_('extra keys for errors: {}').format(extra_keys))
|
|
||||||
self.uri = raw_err['uri']
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_error_definition(raw_defs):
|
|
||||||
new_value = []
|
|
||||||
for raw_err in raw_defs:
|
|
||||||
new_value.append(ErrorDefinition(raw_err))
|
|
||||||
return new_value
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_parameters(raw_defs,
|
def _parse_parameters(raw_defs,
|
||||||
version):
|
version):
|
||||||
parameters = OrderedDict()
|
parameters = {}
|
||||||
for name, raw_def in raw_defs.items():
|
for name, raw_def in raw_defs.items():
|
||||||
parameters[name] = ParameterDefinition(name,
|
parameters[name] = ParameterDefinition(name,
|
||||||
version,
|
version,
|
||||||
@ -228,7 +221,8 @@ def _parse_parameters(raw_defs,
|
|||||||
|
|
||||||
|
|
||||||
def get_message(uri: str,
|
def get_message(uri: str,
|
||||||
current_module_names: str):
|
current_module_names: str,
|
||||||
|
) -> MessageDefinition:
|
||||||
try:
|
try:
|
||||||
version, message = uri.split('.', 1)
|
version, message = uri.split('.', 1)
|
||||||
path = get_message_file_path(version,
|
path = get_message_file_path(version,
|
||||||
@ -299,6 +293,9 @@ class CustomParam:
|
|||||||
value = self._convert_type(value, raw_def)
|
value = self._convert_type(value, raw_def)
|
||||||
elif key == 'items':
|
elif key == 'items':
|
||||||
continue
|
continue
|
||||||
|
elif key == 'description':
|
||||||
|
if value.endswith('.'):
|
||||||
|
value = value[:-1]
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
|
|
||||||
# check mandatory keys
|
# check mandatory keys
|
||||||
@ -331,7 +328,7 @@ class CustomParam:
|
|||||||
|
|
||||||
|
|
||||||
def _parse_custom_params(raw_defs, required):
|
def _parse_custom_params(raw_defs, required):
|
||||||
parameters = OrderedDict()
|
parameters = {}
|
||||||
for name, raw_def in raw_defs.items():
|
for name, raw_def in raw_defs.items():
|
||||||
parameters[name] = CustomParam(name, raw_def, required)
|
parameters[name] = CustomParam(name, raw_def, required)
|
||||||
return parameters
|
return parameters
|
||||||
@ -357,6 +354,9 @@ class CustomType:
|
|||||||
value = self._convert_type(value, raw_def)
|
value = self._convert_type(value, raw_def)
|
||||||
elif key == 'properties':
|
elif key == 'properties':
|
||||||
value = _parse_custom_params(value, raw_def.get('required', {}))
|
value = _parse_custom_params(value, raw_def.get('required', {}))
|
||||||
|
elif key == 'description':
|
||||||
|
if value.endswith('.'):
|
||||||
|
value = value[:-1]
|
||||||
|
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
# check mandatory keys
|
# check mandatory keys
|
||||||
@ -435,6 +435,7 @@ def _get_option(name,
|
|||||||
props = []
|
props = []
|
||||||
if not hasattr(arg, 'default'):
|
if not hasattr(arg, 'default'):
|
||||||
props.append('mandatory')
|
props.append('mandatory')
|
||||||
|
if select_option:
|
||||||
props.append(Calculation(calc_value,
|
props.append(Calculation(calc_value,
|
||||||
Params(ParamValue('disabled'),
|
Params(ParamValue('disabled'),
|
||||||
kwargs={'condition': ParamOption(select_option, todict=True),
|
kwargs={'condition': ParamOption(select_option, todict=True),
|
||||||
@ -472,7 +473,6 @@ def _get_option(name,
|
|||||||
|
|
||||||
def get_options(message_def,
|
def get_options(message_def,
|
||||||
file_path,
|
file_path,
|
||||||
needs,
|
|
||||||
select_option,
|
select_option,
|
||||||
optiondescription,
|
optiondescription,
|
||||||
load_shortarg):
|
load_shortarg):
|
||||||
@ -496,7 +496,7 @@ def _parse_responses(message_def,
|
|||||||
"""build option with returns
|
"""build option with returns
|
||||||
"""
|
"""
|
||||||
if message_def.response.parameters is None:
|
if message_def.response.parameters is None:
|
||||||
raise Exception('uri "{}" did not returned any valid parameters.'.format(message_def.uri))
|
raise Exception('message "{}" did not returned any valid parameters.'.format(message_def.message))
|
||||||
|
|
||||||
options = []
|
options = []
|
||||||
names = []
|
names = []
|
||||||
@ -518,41 +518,21 @@ def _parse_responses(message_def,
|
|||||||
# FIXME
|
# FIXME
|
||||||
'File': StrOption}.get(type_)
|
'File': StrOption}.get(type_)
|
||||||
if not option:
|
if not option:
|
||||||
raise Exception(f'unknown param type {obj.type} in responses of message {message_def.uri}')
|
raise Exception(f'unknown param type {obj.type} in responses of message {message_def.message}')
|
||||||
if hasattr(obj, 'default'):
|
if hasattr(obj, 'default'):
|
||||||
kwargs['default'] = obj.default
|
kwargs['default'] = obj.default
|
||||||
else:
|
else:
|
||||||
kwargs['properties'] = ('mandatory',)
|
kwargs['properties'] = ('mandatory',)
|
||||||
options.append(option(**kwargs))
|
options.append(option(**kwargs))
|
||||||
od = OptionDescription(message_def.uri,
|
od = OptionDescription(message_def.message,
|
||||||
message_def.response.description,
|
message_def.response.description,
|
||||||
options)
|
options)
|
||||||
od.impl_set_information('multi', message_def.response.multi)
|
od.impl_set_information('multi', message_def.response.multi)
|
||||||
return od
|
return od
|
||||||
|
|
||||||
|
|
||||||
def _getoptions_from_yml(message_def,
|
def _get_root_option(select_option,
|
||||||
optiondescriptions,
|
optiondescriptions):
|
||||||
file_path,
|
|
||||||
needs,
|
|
||||||
select_option,
|
|
||||||
load_shortarg):
|
|
||||||
if message_def.pattern == 'event' and message_def.response:
|
|
||||||
raise Exception('event with response?: {}'.format(file_path))
|
|
||||||
if message_def.pattern == 'rpc' and not message_def.response:
|
|
||||||
print('rpc without response?: {}'.format(file_path))
|
|
||||||
options = get_options(message_def,
|
|
||||||
file_path,
|
|
||||||
needs,
|
|
||||||
select_option,
|
|
||||||
message_def.uri,
|
|
||||||
load_shortarg)
|
|
||||||
name = message_def.uri
|
|
||||||
description = message_def.description.strip().rstrip()
|
|
||||||
optiondescriptions[name] = (description, options)
|
|
||||||
|
|
||||||
|
|
||||||
def _get_root_option(select_option, optiondescriptions):
|
|
||||||
"""get root option
|
"""get root option
|
||||||
"""
|
"""
|
||||||
def _get_od(curr_ods):
|
def _get_od(curr_ods):
|
||||||
@ -600,7 +580,6 @@ def get_messages(current_module_names,
|
|||||||
global CUSTOMTYPES
|
global CUSTOMTYPES
|
||||||
optiondescriptions = {}
|
optiondescriptions = {}
|
||||||
optiondescriptions_info = {}
|
optiondescriptions_info = {}
|
||||||
needs = {}
|
|
||||||
messages = list(list_messages(uris,
|
messages = list(list_messages(uris,
|
||||||
current_module_names,
|
current_module_names,
|
||||||
current_version))
|
current_version))
|
||||||
@ -618,25 +597,29 @@ def get_messages(current_module_names,
|
|||||||
load_customtypes(listdir(join(MESSAGE_ROOT_PATH, version)))
|
load_customtypes(listdir(join(MESSAGE_ROOT_PATH, version)))
|
||||||
else:
|
else:
|
||||||
load_customtypes(current_module_names)
|
load_customtypes(current_module_names)
|
||||||
for message_name in messages:
|
for uri in messages:
|
||||||
message_def = get_message(message_name,
|
message_def = get_message(uri,
|
||||||
current_module_names)
|
current_module_names,
|
||||||
optiondescriptions_info[message_def.uri] = {'pattern': message_def.pattern,
|
)
|
||||||
|
optiondescriptions_info[message_def.message] = {'pattern': message_def.pattern,
|
||||||
'default_roles': message_def.default_roles,
|
'default_roles': message_def.default_roles,
|
||||||
'version': message_name.split('.')[0]}
|
'version': message_def.version}
|
||||||
if message_def.pattern == 'rpc':
|
if message_def.pattern == 'rpc':
|
||||||
optiondescriptions_info[message_def.uri]['response'] = _parse_responses(message_def,
|
if not message_def.response:
|
||||||
message_name)
|
raise Exception(f'rpc without response is not allowed {uri}')
|
||||||
|
optiondescriptions_info[message_def.message]['response'] = _parse_responses(message_def,
|
||||||
|
uri)
|
||||||
elif message_def.response:
|
elif message_def.response:
|
||||||
raise Exception(f'response not allowed for {message_def.uri}')
|
raise Exception(f'response is not allowed for {uri}')
|
||||||
_getoptions_from_yml(message_def,
|
message_def.options = get_options(message_def,
|
||||||
optiondescriptions,
|
uri,
|
||||||
message_name,
|
|
||||||
needs,
|
|
||||||
select_option,
|
select_option,
|
||||||
|
message_def.message,
|
||||||
load_shortarg)
|
load_shortarg)
|
||||||
|
optiondescriptions[message_def.message] = (message_def.description, message_def.options)
|
||||||
|
|
||||||
root = _get_root_option(select_option, optiondescriptions)
|
root = _get_root_option(select_option,
|
||||||
|
optiondescriptions)
|
||||||
if current_module_names is None:
|
if current_module_names is None:
|
||||||
CUSTOMTYPES = {}
|
CUSTOMTYPES = {}
|
||||||
return optiondescriptions_info, root
|
return optiondescriptions_info, root
|
@ -1 +0,0 @@
|
|||||||
from .message import get_messages
|
|
Loading…
Reference in New Issue
Block a user