diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..14e1c05 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,28 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'router' +copyright = '2023-2024, RemiZOffAlex' +author = 'RemiZOffAlex' +release = '0.1.0' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [] + +templates_path = ['_templates'] +exclude_patterns = [] + +language = 'ru' + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'alabaster' +html_static_path = ['_static'] diff --git a/docs/source/description.rst b/docs/source/description.rst new file mode 100644 index 0000000..94c5a4f --- /dev/null +++ b/docs/source/description.rst @@ -0,0 +1,22 @@ +Абстракция + +Брокер на основе правил принимает решение что вызывать, +как вызывать и какие параметры передать при вызове + +Описание + + +Правила (rule) - содержит описание правил +comparator - функция, которая имеет правила и которой передаются параметры запроса +Компаратор возвращает функцию и извлечённые из запроса параметры + +endpoint - вызываемая функция, которой передаются параметры + +rule = { + 'url': '/' +} +@broker.route( + comparator = comparator_flask(rule=rule) +) +def foo(): + return 'foo' diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..c22eb2e --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,20 @@ +.. router documentation master file, created by + sphinx-quickstart on Mon Oct 2 02:47:03 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Документация маршрутизатора +=========================== + +.. toctree:: + :maxdepth: 2 + :caption: Содержание: + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/progon.py b/progon.py index d65761e..c5b3e61 100755 --- a/progon.py +++ b/progon.py @@ -3,35 +3,64 @@ __author__ = 'RemiZOffAlex' __email__ = 'remizoffalex@mail.ru' +import logging + from router.broker import Broker +from router.compiler import Compiler from router.syntetic.url import rule_comparator - +log = logging.getLogger(__name__) broker = Broker() def comparator(rule, query): print('comparator') - print(rule['url']) + print(rule) print(query['url']) if rule['url']['value'] == query['url']: return {} -@broker.route( - rule = { - 'domain': { - 'value': '', - 'isregex': True +class Comparator: + def __init__(self, rule): + self.rule = rule + + def __call__(self, query): + log.error('Comparator.__call__') + log.error(self.rule) + compiler = Compiler() + log.error(compiler) + expression = compiler(self.rule) + log.error(expression) + result = expression(query) + log.error('result') + log.error(result) + return result + # if self.condition == 'AND': + # return all(map(lambda x: RuleGroup.get_rule_object(x).evaluate(obj), self.rules)) + # else: + # return any(map(lambda x: RuleGroup.get_rule_object(x).evaluate(obj), self.rules)) + + +rule={ + 'operator': 'and', + 'rules': [ + { + 'key': 'domain', + 'operator': 'regex', + 'value': '.*' }, - 'url': { - 'value': '', - 'isregex': True + { + 'key': 'url', + 'operator': 'equal', + 'value': '/' } - }, - comparator = comparator + ] +} +@broker.route( + comparator=Comparator(rule=rule) ) -def foo(): +def foo(request): return 'foo' @@ -45,30 +74,54 @@ def comparator_flask(rule, query): return result -@broker.route( - rule = { - 'url': '/' - }, - comparator = comparator_flask -) -def foo(): - return 'foo' +# rule={ +# 'key': 'url', +# 'operator': 'equal', +# 'value': '/' +# } +# @broker.route( +# comparator=comparator_flask(rule=rule) +# ) +# def foo(request): +# return 'foo' request = { - 'url': '/' + 'url': '/', + 'domain': 'example.org' } broker_response = broker(request) print('broker_response', broker_response) if broker_response is not None: - method, params = broker_response - print('method', 'params') - print(method, params) + method, response = broker_response + print(method) if method is None: print('Маршрут не найден') response = None else: - response = method(**params) + response = method(request) print(response) + +print('#'*80) +print('CICD') +import os +request = os.environ +print(request) +broker = Broker() + +rule={ + 'key': 'DESKTOP_SESSION', + 'operator': 'equal', + 'value': 'xfce' +} +@broker.route( + comparator=Comparator(rule=rule) +) +def foo(request): + return 'foo' + +broker_response = broker(request) +method, response = broker_response +print(method) diff --git a/router/broker.py b/router/broker.py index 85ea14a..ad6917f 100644 --- a/router/broker.py +++ b/router/broker.py @@ -20,8 +20,7 @@ class Broker: """ for route in self.routes: log.debug(route) - comparator = route.comparator - output = comparator(route.rule, query) + output = route.comparator(query) if output: return (route.endpoint, output) @@ -45,14 +44,11 @@ class Broker: def __repr__(self): return repr(self.methods) - def route(self, rule: dict, comparator: Callable, *args): + def route(self, comparator: Callable, *args): """Декоратор """ - assert rule is not None, 'Не указано имя метода' - def wrap(function): _route = Route( - rule=rule, comparator=comparator, endpoint=function ) diff --git a/router/route.py b/router/route.py index 634f07c..f8f63e5 100644 --- a/router/route.py +++ b/router/route.py @@ -3,13 +3,11 @@ __email__ = 'remizoffalex@mail.ru' class Route: - def __init__(self, rule, comparator, endpoint): + def __init__(self, comparator, endpoint): """ - :param rule: С чем сравнивать - :param : Как сравнивать - :param : Куда отправить + :param comparator: Как и с чем сравнивать + :param endpoint: Куда отправить """ print('Route.__init__') - self.rule = rule self.comparator = comparator self.endpoint = endpoint