CleverSwarm API invocation example
This commit is contained in:
@@ -14,14 +14,30 @@ class RouteDatabase:
|
||||
return self.routes
|
||||
|
||||
def pattern(self, routing_key: str) -> re.Pattern:
|
||||
regex = r"\.".join(
|
||||
[
|
||||
r".*" if token == "" else r"#" if token == "#" else token
|
||||
for token in routing_key.split(".")
|
||||
]
|
||||
)
|
||||
if routing_key.endswith("."):
|
||||
regex += r"\."
|
||||
breaker = False
|
||||
tokens = routing_key.split('.')
|
||||
counter = len(tokens)
|
||||
regex_parts = []
|
||||
|
||||
for token in tokens:
|
||||
counter -= 1
|
||||
if not breaker:
|
||||
if token == "":
|
||||
res = "[^\\.]*"
|
||||
elif token == "#":
|
||||
breaker = True
|
||||
res = ".*$"
|
||||
else:
|
||||
res = token
|
||||
if counter > 0 and not breaker:
|
||||
res += "\\."
|
||||
regex_parts.append(res)
|
||||
else:
|
||||
regex_parts.append("")
|
||||
|
||||
regex = "".join(filter(lambda x: x != "", regex_parts))
|
||||
if not routing_key:
|
||||
return re.compile(".*")
|
||||
return re.compile(regex)
|
||||
|
||||
def matches(self, routing_key_from_route: str, routing_key_from_message: str) -> bool:
|
||||
|
||||
@@ -1,24 +1,103 @@
|
||||
from unittest import TestCase
|
||||
|
||||
import pytest
|
||||
|
||||
from amqp.adapter.amq_message_factory import AMQMessageFactory
|
||||
from amqp.adapter.amq_route_factory import AMQRouteFactory
|
||||
from amqp.model.model import AMQRoute
|
||||
from amqp.router.route_database import RouteDatabase
|
||||
|
||||
ROUTE_1 = "amq::amq1:clever1.book.localhost.#:5:0"
|
||||
ROUTE_2 = "amq::amq2:clever2.book.localhost.#:5:0"
|
||||
ROUTE_3 = "amq::amq3:clever3.book.localhost.#:5:0"
|
||||
ROUTE_7 = "amq::amq7:clever7.book.localhost.#:5:0"
|
||||
|
||||
|
||||
class TestRouteDatabase(TestCase):
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def setup_each_test(self):
|
||||
self._database = RouteDatabase()
|
||||
if len(self._database.get_routes()) == 0:
|
||||
r1 = AMQRouteFactory.from_string(ROUTE_1)
|
||||
r2 = AMQRouteFactory.from_string(ROUTE_2)
|
||||
r3 = AMQRouteFactory.from_string(ROUTE_3)
|
||||
self._database.add_route(r1)
|
||||
self._database.add_route(r2)
|
||||
self._database.add_route(r3)
|
||||
|
||||
def test_get_routes(self):
|
||||
self.fail()
|
||||
_amq_factory = AMQRouteFactory()
|
||||
_route: AMQRoute = _amq_factory.from_string("amq-clever-pybook::clever-pybook:clever.pybook.localhost.#:5:0")
|
||||
_routes = self._database.get_routes()
|
||||
self.assertIsNotNone(_routes)
|
||||
self.assertEqual(3, len(_routes))
|
||||
self._database.add_route(_route)
|
||||
_routes = self._database.get_routes()
|
||||
self.assertTrue(_route in _routes, "Route was not added")
|
||||
self.assertEqual(4, len(_routes))
|
||||
|
||||
def test_pattern(self):
|
||||
self.fail()
|
||||
pattern = self._database.pattern("")
|
||||
self.assertEqual(".*", pattern.pattern)
|
||||
pattern = self._database.pattern("..")
|
||||
self.assertEqual("[^\\.]*\\.[^\\.]*\\.[^\\.]*", pattern.pattern)
|
||||
pattern = self._database.pattern(".#.#")
|
||||
self.assertEqual("[^\\.]*\\..*$", pattern.pattern)
|
||||
pattern = self._database.pattern("..#")
|
||||
self.assertEqual("[^\\.]*\\.[^\\.]*\\..*$", pattern.pattern)
|
||||
pattern = self._database.pattern("#")
|
||||
self.assertEqual(".*$", pattern.pattern)
|
||||
pattern = self._database.pattern("ba.dc.")
|
||||
self.assertEqual("ba\\.dc\\.[^\\.]*", pattern.pattern)
|
||||
pattern = self._database.pattern(".cd.")
|
||||
self.assertEqual("[^\\.]*\\.cd\\.[^\\.]*", pattern.pattern)
|
||||
pattern = self._database.pattern("de")
|
||||
self.assertEqual("de", pattern.pattern)
|
||||
|
||||
def test_matches(self):
|
||||
self.fail()
|
||||
self.assertTrue(self._database.matches("..", "aa.bb.cc"))
|
||||
self.assertFalse(self._database.matches("..", "aa.bb."))
|
||||
self.assertFalse(self._database.matches("..", "aa.bb"))
|
||||
self.assertFalse(self._database.matches("..", "aa"))
|
||||
self.assertTrue(self._database.matches("..#", "aa.bb.cc"))
|
||||
self.assertFalse(self._database.matches("..#", "aa.bb."))
|
||||
self.assertFalse(self._database.matches("..#", "aa.bb"))
|
||||
self.assertFalse(self._database.matches("..#", "aa"))
|
||||
self.assertTrue(self._database.matches(".#", "aa.bb.cc"))
|
||||
self.assertTrue(self._database.matches(".#", "aa.bb."))
|
||||
self.assertTrue(self._database.matches(".#", "aa.bb"))
|
||||
self.assertFalse(self._database.matches(".#", "aa"))
|
||||
|
||||
def test_wrap_routes(self):
|
||||
self.fail()
|
||||
wrap = self._database.wrap_routes()
|
||||
self.assertTrue(ROUTE_1 in wrap)
|
||||
self.assertTrue(ROUTE_2 in wrap)
|
||||
|
||||
def test_find_route(self):
|
||||
self.fail()
|
||||
message = AMQMessageFactory.get_instance(111).create_request_message(
|
||||
"POST", "clever3-book.localhost",
|
||||
"/aa/bb?cc=d", {}, ""
|
||||
)
|
||||
route = self._database.find_route(message.domain, message.path)
|
||||
self.assertIsNotNone(route)
|
||||
self.assertEqual(ROUTE_3, route.as_string())
|
||||
route = self._database.find_route("clever3.book.localhost", "/three-hot-dogs")
|
||||
self.assertIsNotNone(route)
|
||||
self.assertEqual(ROUTE_3, route.as_string())
|
||||
route = self._database.find_route("clever-5.book.localhost", "/three-hot-dogs")
|
||||
self.assertIsNone(route)
|
||||
|
||||
def test_add_route(self):
|
||||
self.fail()
|
||||
origSize = len(self._database.get_routes())
|
||||
route = AMQRouteFactory.from_string(ROUTE_7)
|
||||
self._database.add_route(route)
|
||||
self.assertEqual(origSize + 1, len(self._database.get_routes()))
|
||||
|
||||
def test_remove_route(self):
|
||||
self.fail()
|
||||
origSize = len(self._database.get_routes())
|
||||
route = AMQRouteFactory.from_string(ROUTE_7)
|
||||
self._database.add_route(route)
|
||||
self.assertEqual(origSize + 1, len(self._database.get_routes()))
|
||||
self._database.remove_route(route)
|
||||
self.assertEqual(origSize, len(self._database.get_routes()))
|
||||
|
||||
@@ -1,39 +1,122 @@
|
||||
from typing import Set
|
||||
from unittest import TestCase
|
||||
|
||||
import pytest
|
||||
|
||||
from amqp.adapter.amq_message_factory import AMQMessageFactory
|
||||
from amqp.adapter.amq_route_factory import AMQRouteFactory
|
||||
from amqp.model.model import AMQRoute
|
||||
from amqp.router.router_base import RouterBase
|
||||
from amqp.router.utils import sanitize_as_rabbitmq_name
|
||||
|
||||
ROUTE_1 = "amq::amq1:clever1.book.localhost.#:5:0"
|
||||
ROUTE_2 = "amq::amq2:clever2.book.localhost.#:5:0"
|
||||
ROUTE_3 = "amq::amq3:clever3.book.localhost.#:5:0"
|
||||
ROUTE_6 = "amq::amq6:clever6.book.localhost.#:5:0"
|
||||
ROUTE_7 = "amq::amq7:clever7.book.localhost.#:5:0"
|
||||
ROUTE_8 = "amq::amq8:clever8.book.localhost.#:5:0"
|
||||
ROUTE_9 = "amq::amq9:clever9.book.localhost.#:5:0"
|
||||
|
||||
|
||||
class TestRouterBase(TestCase):
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def setup_each_test(self):
|
||||
self.base = RouterBase()
|
||||
self.factory = AMQMessageFactory.get_instance(111)
|
||||
if len(self.base.get_routes()) == 0:
|
||||
r1 = AMQRouteFactory.from_string(ROUTE_1)
|
||||
r2 = AMQRouteFactory.from_string(ROUTE_2)
|
||||
r3 = AMQRouteFactory.from_string(ROUTE_3)
|
||||
self.base.add_route(r1)
|
||||
self.base.add_route(r2)
|
||||
self.base.add_route(r3)
|
||||
|
||||
def test_sanitize_as_rabbitmq_name(self):
|
||||
self.assertEqual("aa.bb.cc", sanitize_as_rabbitmq_name("aa.bb/cc"))
|
||||
self.assertEqual("aa.bb.cc", sanitize_as_rabbitmq_name("aa-bb/cc"))
|
||||
self.assertEqual("aa", sanitize_as_rabbitmq_name("aa&bb/cc"))
|
||||
self.assertEqual("aa", sanitize_as_rabbitmq_name("aa+bb/cc"))
|
||||
self.assertEqual("aa", sanitize_as_rabbitmq_name("aa%bb/cc"))
|
||||
self.assertEqual("aa#bb.cc", sanitize_as_rabbitmq_name("aa#bb/cc"))
|
||||
self.assertEqual("aa#bb.cc.#", sanitize_as_rabbitmq_name("aa#bb/cc.#"))
|
||||
self.assertEqual("aa", sanitize_as_rabbitmq_name("aa?bb////cc"))
|
||||
self.assertEqual("aa.bb.cc", sanitize_as_rabbitmq_name("aa///bb////cc"))
|
||||
|
||||
def test_get_routing_key(self):
|
||||
self.fail()
|
||||
message = self.factory.create_request_message("POST", "test.me.localhost", "/aa/bb?cc=d", {}, "")
|
||||
rk = self.base.get_routing_key(message)
|
||||
self.assertEqual("test.me.localhost.aa.bb", rk)
|
||||
|
||||
def test_wrap_routes(self):
|
||||
self.fail()
|
||||
wrap = self.base.wrap_routes()
|
||||
self.assertTrue(ROUTE_1 in wrap)
|
||||
self.assertTrue(ROUTE_2 in wrap)
|
||||
|
||||
def test_wrap_own_routes(self):
|
||||
self.fail()
|
||||
_route: AMQRoute = AMQRouteFactory.from_string(ROUTE_7)
|
||||
self.base.add_own_route(_route)
|
||||
o_route = self.base.wrap_own_routes()
|
||||
self.assertEqual(ROUTE_7, o_route)
|
||||
|
||||
def test_unwrap_route_list(self):
|
||||
self.fail()
|
||||
_routes = self.base.get_routes()
|
||||
wrapped = self.base.wrap_routes()
|
||||
unwrapped = self.base.unwrap_route_list(wrapped)
|
||||
self.assertEqual(len(_routes), len(unwrapped))
|
||||
self.assertTrue(unwrapped.pop() in _routes)
|
||||
self.assertTrue(unwrapped.pop() in _routes)
|
||||
|
||||
def test_get_routes(self):
|
||||
self.fail()
|
||||
_routes = self.base.get_routes()
|
||||
self.assertEqual(3, len(_routes))
|
||||
|
||||
def test_find_route(self):
|
||||
self.fail()
|
||||
_route = self.base.find_route("clever3.book.localhost", "/three-hot-dogs")
|
||||
self.assertIsNotNone(_route)
|
||||
self.assertEqual(_route.as_string(), ROUTE_3)
|
||||
_route = self.base.find_route("clever-5.book.localhost", "/three-hot-dogs")
|
||||
self.assertIsNone(_route)
|
||||
|
||||
def test_find_route_by_message(self):
|
||||
self.fail()
|
||||
message = AMQMessageFactory.get_instance(111).create_request_message(
|
||||
"POST", "clever3-book.localhost",
|
||||
"/aa/bb?cc=d", {}, ""
|
||||
)
|
||||
_route: AMQRoute = self.base.find_route_by_message(message)
|
||||
self.assertIsNotNone(_route)
|
||||
self.assertEqual(_route.as_string(), ROUTE_3)
|
||||
|
||||
def test_add_routes(self):
|
||||
self.fail()
|
||||
init_routes: Set[AMQRoute] = self.base.get_routes().copy()
|
||||
self.base.add_routes(ROUTE_6 + ",amq-dlq:DLX:DeadLetterQueue:#:0:0,:::::,:::")
|
||||
modified = self.base.get_routes()
|
||||
self.assertEqual(len(init_routes)+1, len(modified))
|
||||
wr = self.base.wrap_routes()
|
||||
self.assertFalse("DLX" in wr)
|
||||
|
||||
def test_remove_routes(self):
|
||||
self.fail()
|
||||
init_routes: Set[AMQRoute] = self.base.get_routes().copy()
|
||||
toRemove: AMQRoute = init_routes.pop()
|
||||
self.base.remove_routes(toRemove.as_string())
|
||||
modified = self.base.get_routes()
|
||||
self.assertEqual(len(init_routes), len(modified))
|
||||
|
||||
def test_remove_route(self):
|
||||
self.fail()
|
||||
origSize = len(self.base.get_routes())
|
||||
_route = AMQRouteFactory.from_string(ROUTE_7)
|
||||
self.base.add_route(_route)
|
||||
self.assertEqual(origSize + 1, len(self.base.get_routes()))
|
||||
self.base.remove_route(_route)
|
||||
self.assertEqual(origSize, len(self.base.get_routes()))
|
||||
|
||||
def test_add_route(self):
|
||||
self.fail()
|
||||
origSize = len(self.base.get_routes())
|
||||
_route = AMQRouteFactory.from_string(ROUTE_7)
|
||||
self.base.add_route(_route)
|
||||
self.assertEqual(origSize + 1, len(self.base.get_routes()))
|
||||
|
||||
def test_add_own_route(self):
|
||||
self.fail()
|
||||
_route = AMQRouteFactory.from_string(ROUTE_8)
|
||||
self.base.add_own_route(_route)
|
||||
self.assertTrue(ROUTE_8 in self.base.wrap_own_routes())
|
||||
|
||||
+13
-3
@@ -1,9 +1,19 @@
|
||||
import re
|
||||
|
||||
pattern = re.compile(r"[^a-zA-Z0-9.#/\-]")
|
||||
|
||||
|
||||
def sanitize_as_rabbitmq_name(input_str: str) -> str:
|
||||
pattern = re.compile(r"[^a-zA-Z0-9.#/\-]")
|
||||
matcher = pattern.search(input_str)
|
||||
token = input_str[:matcher.start()] if matcher else input_str
|
||||
step1 = re.sub(r"[^A-Za-z0-9#]", ".", token)
|
||||
return re.sub(r"\.+", ".", step1)
|
||||
return sanitize_as_rabbitmq_domain_name(token)
|
||||
|
||||
|
||||
def sanitize_as_rabbitmq_domain_name(token: str) -> str:
|
||||
# Step 1: Replace non-alphanumeric characters (except periods) with a period
|
||||
step1 = re.sub(r'[^A-Za-z0-9.#]', '.', token)
|
||||
# Step 2: Replace multiple consecutive periods with a single period
|
||||
step2 = re.sub(r'\.+', '.', step1)
|
||||
# Step 3: Remove trailing '.' character, if applicable
|
||||
step_last_char = len(step2) - 1
|
||||
return step2[:-1] if step_last_char > 0 and step2[step_last_char] == '.' else step2
|
||||
|
||||
Reference in New Issue
Block a user