diff --git a/gramhopper/configuration/boolean_helper.py b/gramhopper/configuration/boolean_helper.py index edc23a8..09d32c9 100644 --- a/gramhopper/configuration/boolean_helper.py +++ b/gramhopper/configuration/boolean_helper.py @@ -1,6 +1,6 @@ from typing import Union, Callable from boolean import boolean -from ruamel.yaml.comments import CommentedMap +from .partial_ruamel_yaml import CommentedMap from .globals_dict import GlobalsDict from .boolean_operators import OPERATOR_TYPE_TO_FUNCTION from .trigger_response import TriggerResponse diff --git a/gramhopper/configuration/partial_ruamel_yaml.py b/gramhopper/configuration/partial_ruamel_yaml.py new file mode 100644 index 0000000..cd4ea00 --- /dev/null +++ b/gramhopper/configuration/partial_ruamel_yaml.py @@ -0,0 +1,18 @@ +""" +This file is a dirty hack to handle ruamel_yaml import problem +In certain distributions, the module name is ruamel_yaml, while in others it's ruamel.yaml. +As you can easily understand, that made us very sad :( +A fallback import wasn't enough to solve it since the same imports were done in 3 different files, +so we decided to create this file, which is a *very* partial accessor to ruamel_yaml. +""" + +try: + from ruamel_yaml import YAML + from ruamel_yaml.comments import CommentedMap +except ImportError: + from ruamel.yaml import YAML + from ruamel.yaml.comments import CommentedMap + + +YAML = YAML +CommentedMap = CommentedMap # pylint: disable=invalid-name diff --git a/gramhopper/configuration/rules_parser.py b/gramhopper/configuration/rules_parser.py index 360a490..9400516 100644 --- a/gramhopper/configuration/rules_parser.py +++ b/gramhopper/configuration/rules_parser.py @@ -1,5 +1,5 @@ -from ruamel.yaml import YAML -from ruamel.yaml.comments import CommentedMap +from .partial_ruamel_yaml import YAML +from .partial_ruamel_yaml import CommentedMap from .rules_parsing_helper import RulesParsingHelper from ..handlers.handler import Handler from .trigger_response_params import TriggerParams, ResponseParams diff --git a/gramhopper/configuration/rules_parsing_helper.py b/gramhopper/configuration/rules_parsing_helper.py index 15ad679..ef90f92 100644 --- a/gramhopper/configuration/rules_parsing_helper.py +++ b/gramhopper/configuration/rules_parsing_helper.py @@ -1,4 +1,4 @@ -from ruamel.yaml.comments import CommentedMap +from .partial_ruamel_yaml import CommentedMap from .boolean_helper import BooleanHelper from .trigger_response import TriggerResponse from .trigger_response_params import TriggerResponseParams diff --git a/gramhopper/configuration/triggers_reponses_parsers.py b/gramhopper/configuration/triggers_reponses_parsers.py index b1509b3..2910160 100644 --- a/gramhopper/configuration/triggers_reponses_parsers.py +++ b/gramhopper/configuration/triggers_reponses_parsers.py @@ -19,10 +19,14 @@ def parse_single(cls, config, global_elements): # pylint: disable=unused-argume if 'name' in config_copy: config_copy.pop('name') - mapping_cls = cls.mapping_class() - element_cls = mapping_cls[config_copy.pop('type')] - - return element_cls(**config_copy) + mapping_class = cls.mapping_class() + element = mapping_class[config_copy.pop('type')] + + # Some triggers (most of them) are classes and some are instances (mostly filter triggers). + # This allows both cases to be used. + if isclass(element): + return element(**config_copy) + return element @classmethod def parse_many(cls, config, global_elements): diff --git a/setup.py b/setup.py index f009838..5d5b98d 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setup( name='gramhopper', - version='1.0.4', + version='1.0.5', description='A bot platform for automatic responses based on various triggers', long_description=LONG_DESCRIPTION,