diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..84eb256 --- /dev/null +++ b/Makefile @@ -0,0 +1,39 @@ +# Variables +PYTHONPATH := $(shell pwd) + +linter: format + poetry run bandit . && poetry run flake8 . && poetry run black --check . + +format: + poetry run isort . && poetry run black . + +build: + poetry build + +install: + poetry env use python3 + poetry lock + poetry install + +test: clean + @PYTHONPATH="${PYTHONPATH}" ENVIRONMENT=unittest poetry run -vvv coverage run -vvv -m pytest + +test-all: + @PYTHONPATH="${PYTHONPATH}" ENVIRONMENT=local python -m pytest tests + +update-poetry-and-all-dependencies: + poetry self update + poetry self add poetry-plugin-up + poetry up --latest + opentelemetry-bootstrap -a install + +clean: + @find . | egrep '.pyc|.pyo|pycache' | xargs rm -rf + @find . | egrep '.pyc|.pyo|pycache|pytest_cache' | xargs rm -rf + @rm -rf ./htmlcov + @rm -rf ./pycache + @rm -rf ./pycache + @rm -rf ./.pytest_cache + @rm -rf ./.mypy_cache + @find . -name 'unit_test.db' -exec rm -r -f {} + + @find . -name '.coverage' -exec rm -r -f {} + diff --git a/example/joe.py b/example/joe.py index bd249d7..bf5e4f5 100644 --- a/example/joe.py +++ b/example/joe.py @@ -2,35 +2,39 @@ Copyright 2022 Eigr. Licensed under the Apache License, Version 2.0. """ -from dataclasses import dataclass from domain.domain_pb2 import JoeState, Request, Reply -from spawn.entity import ActorContext, ActorEntity, ActorInit, ActorParams, Value +from spawn.eigr.functions.actors.api.actor import Actor +from spawn.eigr.functions.actors.api.settings import ActorSettings +from spawn.eigr.functions.actors.api.context import Context +from spawn.eigr.functions.actors.api.metadata import Metadata +from spawn.eigr.functions.actors.api.value import Value +from spawn.eigr.functions.actors.api.workflows.broadcast import Broadcast +from spawn.eigr.functions.actors.api.workflows.effect import Effect +actor = Actor(settings=ActorSettings(name="joe", stateful=True)) -@dataclass -class JoeActor(ActorInit): - # TODO: Remove this because it´s a bad design. Correct is extract this to superior Class - def init() -> ActorParams: - return ActorParams( - name="joe", - state_type=JoeState, - snapshot_timeout=10000, - deactivate_timeout=120000, - ) +@actor.timer_action(every=1000) +def hi(ctx: Context) -> Value: + new_state = None + if not ctx.state: + new_state = JoeState() + new_state.languages.append("portuguese") + else: + new_state = ctx.state - entity = ActorEntity(init) + return Value()\ + .of("test")\ + .state(new_state)\ + .reply() - @entity.command("getActualState") - def get_actual_state(self, ctx: ActorContext) -> Value: - current_state = ctx.state - new_value = current_state - return Value(current_state, new_value) - @entity.command("setLanguage") - def set_language(self, ctx: ActorContext) -> Value: - reply = Reply() - reply.response = "elf" - - new_state = ctx.state.languages.extend("elf") - return Value(new_state, reply) \ No newline at end of file +@actor.action("setLanguage") +def set_language(request: Request, ctx: Context) -> Value: + return Value()\ + .of("test")\ + .broadcast(Broadcast())\ + .effect(Effect())\ + .metada(Metadata())\ + .state({})\ + .reply() diff --git a/example/spawn_example.py b/example/spawn_example.py index 4ace87b..30a11ad 100644 --- a/example/spawn_example.py +++ b/example/spawn_example.py @@ -2,8 +2,8 @@ Copyright 2022 Eigr. Licensed under the Apache License, Version 2.0. """ -from spawn.sdk import Spawn -from example.joe import JoeActor +from spawn.eigr.functions.actors.api.sdk import Spawn +from example.joe import actor as joe_actor from example.domain.domain_pb2 import Reply, Request if __name__ == "__main__": @@ -11,5 +11,5 @@ request.language = "erlang" spawn = Spawn() - spawn.port("8091").register_actor(JoeActor.entity).start() - spawn.invoke("vijay", "setLanguage", request, Reply) + spawn.port(8091).proxy_port(9003).actor_system( + "spawn-system").add_actor(joe_actor).start() diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..6d27fa4 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1225 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + +[[package]] +name = "anyio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] + +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] + +[[package]] +name = "appier" +version = "1.31.2" +description = "Appier Framework" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "appier-1.31.2-py2.py3-none-any.whl", hash = "sha256:fec9369ca6792e91b92f10b4b9feadb1906a01924ede5478cf09453fb6cdff12"}, + {file = "appier-1.31.2.tar.gz", hash = "sha256:1a2cd6a319cda1d84dc92f50fd3c64621e6520aae7676400795b0fd9752e77a3"}, +] + +[[package]] +name = "async-lru" +version = "2.0.4" +description = "Simple LRU cache for asyncio" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "attrs" +version = "21.4.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, +] + +[package.extras] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] +docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] +tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] + +[[package]] +name = "black" +version = "23.7.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-23.7.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be"}, + {file = "black-23.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc"}, + {file = "black-23.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a"}, + {file = "black-23.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926"}, + {file = "black-23.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6"}, + {file = "black-23.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a"}, + {file = "black-23.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087"}, + {file = "black-23.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91"}, + {file = "black-23.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491"}, + {file = "black-23.7.0-py3-none-any.whl", hash = "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96"}, + {file = "black-23.7.0.tar.gz", hash = "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "blinker" +version = "1.6.2" +description = "Fast, simple object-to-object and broadcast signaling" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "blinker-1.6.2-py3-none-any.whl", hash = "sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0"}, + {file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"}, +] + +[[package]] +name = "certifi" +version = "2023.7.22" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "dependency-injector" +version = "4.41.0" +description = "Dependency injection framework for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "dependency-injector-4.41.0.tar.gz", hash = "sha256:939dfc657104bc3e66b67afd3fb2ebb0850c9a1e73d0d26066f2bbdd8735ff9c"}, + {file = "dependency_injector-4.41.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2381a251b04244125148298212550750e6e1403e9b2850cc62e0e829d050ad3"}, + {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75280dfa23f7c88e1bf56c3920d58a43516816de6f6ab2a6650bb8a0f27d5c2c"}, + {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63bfba21f8bff654a80e9b9d06dd6c43a442990b73bf89cd471314c11c541ec2"}, + {file = "dependency_injector-4.41.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3535d06416251715b45f8412482b58ec1c6196a4a3baa207f947f0b03a7c4b44"}, + {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d09c08c944a25dabfb454238c1a889acd85102b93ae497de523bf9ab7947b28a"}, + {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:586a0821720b15932addbefb00f7370fbcd5831d6ebbd6494d774b44ff96d23a"}, + {file = "dependency_injector-4.41.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7fa4970f12a3fc95d8796938b11c41276ad1ff4c447b0e589212eab3fc527a90"}, + {file = "dependency_injector-4.41.0-cp310-cp310-win32.whl", hash = "sha256:d557e40673de984f78dab13ebd68d27fbb2f16d7c4e3b663ea2fa2f9fae6765b"}, + {file = "dependency_injector-4.41.0-cp310-cp310-win_amd64.whl", hash = "sha256:3744c327d18408e74781bd6d8b7738745ee80ef89f2c8daecf9ebd098cb84972"}, + {file = "dependency_injector-4.41.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:89c67edffe7007cf33cee79ecbca38f48efcc2add5c280717af434db6c789377"}, + {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:786f7aac592e191c9caafc47732161d807bad65c62f260cd84cd73c7e2d67d6d"}, + {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b61a15bc46a3aa7b29bd8a7384b650aa3a7ef943491e93c49a0540a0b3dda4"}, + {file = "dependency_injector-4.41.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4f113e5d4c3070973ad76e5bda7317e500abae6083d78689f0b6e37cf403abf"}, + {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fa3ed8f0700e47a0e7363f949b4525ffa8277aa1c5b10ca5b41fce4dea61bb9"}, + {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e15ea0f2b14c1127e8b0d1597fef13f98845679f63bf670ba12dbfc12a16ef"}, + {file = "dependency_injector-4.41.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3055b3fc47a0d6e5f27defb4166c0d37543a4967c279549b154afaf506ce6efc"}, + {file = "dependency_injector-4.41.0-cp311-cp311-win32.whl", hash = "sha256:37d5954026e3831663518d78bdf4be9c2dbfea691edcb73c813aa3093aa4363a"}, + {file = "dependency_injector-4.41.0-cp311-cp311-win_amd64.whl", hash = "sha256:f89a507e389b7e4d4892dd9a6f5f4da25849e24f73275478634ac594d621ab3f"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ac79f3c05747f9724bd56c06985e78331fc6c85eb50f3e3f1a35e0c60f9977e9"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75e7a733b372db3144a34020c4233f6b94db2c6342d6d16bc5245b1b941ee2bd"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40936d9384363331910abd59dd244158ec3572abf9d37322f15095315ac99893"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a31d9d60be4b585585081109480cfb2ef564d3b851cb32a139bf8408411a93a"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:953bfac819d32dc72b963767589e0ed372e5e9e78b03fb6b89419d0500d34bbe"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8f0090ff14038f17a026ca408a3a0b0e7affb6aa7498b2b59d670f40ac970fbe"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:6b29abac56ce347d2eb58a560723e1663ee2125cf5cc38866ed92b84319927ec"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-win32.whl", hash = "sha256:059fbb48333148143e8667a5323d162628dfe27c386bd0ed3deeecfc390338bf"}, + {file = "dependency_injector-4.41.0-cp36-cp36m-win_amd64.whl", hash = "sha256:16de2797dcfcc2263b8672bf0751166f7c7b369ca2ff9246ceb67b65f8e1d802"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c71d30b6708438050675f338edb9a25bea6c258478dbe5ec8405286756a2d347"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d283aee588a72072439e6721cb64aa6cba5bc18c576ef0ab28285a6ec7a9d655"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc852da612c7e347f2fcf921df2eca2718697a49f648a28a63db3ab504fd9510"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02620454ee8101f77a317f3229935ce687480883d72a40858ff4b0c87c935cce"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7a92680bea1c260e5c0d2d6cd60b0c913cba76a456a147db5ac047ecfcfcc758"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:168334cba3f1cbf55299ef38f0f2e31879115cc767b780c859f7814a52d80abb"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:48b6886a87b4ceb9b9f78550f77b2a5c7d2ce33bc83efd886556ad468cc9c85a"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-win32.whl", hash = "sha256:87be84084a1b922c4ba15e2e5aa900ee24b78a5467997cb7aec0a1d6cdb4a00b"}, + {file = "dependency_injector-4.41.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8b8cf1c6c56f5c18bdbd9f5e93b52ca29cb4d99606d4056e91f0c761eef496dc"}, + {file = "dependency_injector-4.41.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8686fa330c83251c75c8238697686f7a0e0f6d40658538089165dc72df9bcff"}, + {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d670a844268dcd758195e58e9a5b39fc74bb8648aba99a13135a4a10ec9cfac"}, + {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3b9d41e0eff4c8e16fea1e33de66ff0030fe51137ca530f3c52ce110447914"}, + {file = "dependency_injector-4.41.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a724e0a737baadb4378f5dc1b079867cc3a88552fcca719b3dba84716828b2"}, + {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3588bd887b051d16b8bcabaae1127eb14059a0719a8fe34c8a75ba59321b352c"}, + {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:409441122f40e1b4b8582845fdd76deb9dc5c9d6eb74a057b85736ef9e9c671f"}, + {file = "dependency_injector-4.41.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7dcba8665cafec825b7095d5dd80afb5cf14404450eca3fe8b66e1edbf4dbc10"}, + {file = "dependency_injector-4.41.0-cp38-cp38-win32.whl", hash = "sha256:8b51efeaebacaf79ef68edfc65e9687699ccffb3538c4a3ab30d0d77e2db7189"}, + {file = "dependency_injector-4.41.0-cp38-cp38-win_amd64.whl", hash = "sha256:1662e2ef60ac6e681b9e11b5d8b7c17a0f733688916cf695f9540f8f50a61b1e"}, + {file = "dependency_injector-4.41.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:51217cb384b468d7cc355544cec20774859f00812f9a1a71ed7fa701c957b2a7"}, + {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3890a12423ae3a9eade035093beba487f8d092ee6c6cb8706f4e7080a56e819"}, + {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99ed73b1521bf249e2823a08a730c9f9413a58f4b4290da022e0ad4fb333ba3d"}, + {file = "dependency_injector-4.41.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:300838e9d4f3fbf539892a5a4072851728e23b37a1f467afcf393edd994d88f0"}, + {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56d37b9d2f50a18f059d9abdbea7669a7518bd42b81603c21a27910a2b3f1657"}, + {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4a44ca3ce5867513a70b31855b218be3d251f5068ce1c480cc3a4ad24ffd3280"}, + {file = "dependency_injector-4.41.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:67b369592c57549ccdcad0d5fef1ddb9d39af7fed8083d76e789ab0111fc6389"}, + {file = "dependency_injector-4.41.0-cp39-cp39-win32.whl", hash = "sha256:740a8e8106a04d3f44b52b25b80570fdac96a8a3934423de7c9202c5623e7936"}, + {file = "dependency_injector-4.41.0-cp39-cp39-win_amd64.whl", hash = "sha256:22b11dbf696e184f0b3d5ac4e5418aeac3c379ba4ea758c04a83869b7e5d1cbf"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b365a8548e9a49049fa6acb24d3cd939f619eeb8e300ca3e156e44402dcc07ec"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5168dc59808317dc4cdd235aa5d7d556d33e5600156acaf224cead236b48a3e8"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3229d83e99e255451605d5276604386e06ad948e3d60f31ddd796781c77f76f"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1baee908f21190bdc46a65ce4c417a5175e9397ca62354928694fce218f84487"}, + {file = "dependency_injector-4.41.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b37f36ecb0c1227f697e1d4a029644e3eda8dd0f0716aa63ad04d96dbb15bbbb"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b0c9c966ff66c77364a2d43d08de9968aff7e3903938fe912ba49796b2133344"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12e91ac0333e7e589421943ff6c6bf9cf0d9ac9703301cec37ccff3723406332"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2440b32474d4e747209528ca3ae48f42563b2fbe3d74dbfe949c11dfbfef7c4"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54032d62610cf2f4421c9d92cef52957215aaa0bca403cda580c58eb3f726eda"}, + {file = "dependency_injector-4.41.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:76b94c8310929e54136f3cb3de3adc86d1a657b3984299f40bf1cd2ba0bae548"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6ee9810841c6e0599356cb884d16453bfca6ab739d0e4f0248724ed8f9ee0d79"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b98945edae88e777091bf0848f869fb94bd76dfa4066d7c870a5caa933391d0"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a2dee5d4abdd21f1a30a51d46645c095be9dcc404c7c6e9f81d0a01415a49e64"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d03f5fa0fa98a18bd0dfce846db80e2798607f0b861f1f99c97f441f7669d7a2"}, + {file = "dependency_injector-4.41.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f2842e15bae664a9f69932e922b02afa055c91efec959cb1896f6c499bf68180"}, +] + +[package.dependencies] +six = ">=1.7.0,<=1.16.0" + +[package.extras] +aiohttp = ["aiohttp"] +flask = ["flask"] +pydantic = ["pydantic"] +yaml = ["pyyaml"] + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "flask" +version = "2.3.2" +description = "A simple framework for building complex web applications." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Flask-2.3.2-py3-none-any.whl", hash = "sha256:77fd4e1249d8c9923de34907236b747ced06e5467ecac1a7bb7115ae0e9670b0"}, + {file = "Flask-2.3.2.tar.gz", hash = "sha256:8c2f9abd47a9e8df7f0c3f091ce9497d011dc3b31effcf4c85a6e2b50f4114ef"}, +] + +[package.dependencies] +blinker = ">=1.6.2" +click = ">=8.1.3" +importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} +itsdangerous = ">=2.1.2" +Jinja2 = ">=3.1.2" +Werkzeug = ">=2.3.3" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "google-api" +version = "0.1.12" +description = "Google API Client" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "google_api-0.1.12-py2.py3-none-any.whl", hash = "sha256:618f9f2076482a128c408867b5398b291938fe8e653ed7f8ed58fce5042f0c75"}, + {file = "google_api-0.1.12.tar.gz", hash = "sha256:5611c87cdfc6b72927a5e2ea9299ddd6f3a206e29a342b86d3ff3ecc351c30a3"}, +] + +[package.dependencies] +appier = "*" + +[[package]] +name = "googleapis-common-protos" +version = "1.56.4" +description = "Common protobufs used in Google APIs" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.56.4.tar.gz", hash = "sha256:c25873c47279387cfdcbdafa36149887901d36202cb645a0e4f29686bf6e4417"}, + {file = "googleapis_common_protos-1.56.4-py2.py3-none-any.whl", hash = "sha256:8eb2cbc91b69feaf23e32452a7ae60e791e09967d81d4fcc7fc388182d1bd394"}, +] + +[package.dependencies] +protobuf = ">=3.15.0,<5.0.0dev" + +[package.extras] +grpc = ["grpcio (>=1.0.0,<2.0.0dev)"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "0.17.3" +description = "A minimal low-level HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, + {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, +] + +[package.dependencies] +anyio = ">=3.0,<5.0" +certifi = "*" +h11 = ">=0.13,<0.15" +sniffio = ">=1.0.0,<2.0.0" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "httptools" +version = "0.6.0" +description = "A collection of framework independent HTTP protocol utils." +category = "main" +optional = false +python-versions = ">=3.5.0" +files = [ + {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:818325afee467d483bfab1647a72054246d29f9053fd17cc4b86cda09cc60339"}, + {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72205730bf1be875003692ca54a4a7c35fac77b4746008966061d9d41a61b0f5"}, + {file = "httptools-0.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33eb1d4e609c835966e969a31b1dedf5ba16b38cab356c2ce4f3e33ffa94cad3"}, + {file = "httptools-0.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdc6675ec6cb79d27e0575750ac6e2b47032742e24eed011b8db73f2da9ed40"}, + {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:463c3bc5ef64b9cf091be9ac0e0556199503f6e80456b790a917774a616aff6e"}, + {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82f228b88b0e8c6099a9c4757ce9fdbb8b45548074f8d0b1f0fc071e35655d1c"}, + {file = "httptools-0.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:0781fedc610293a2716bc7fa142d4c85e6776bc59d617a807ff91246a95dea35"}, + {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:721e503245d591527cddd0f6fd771d156c509e831caa7a57929b55ac91ee2b51"}, + {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:274bf20eeb41b0956e34f6a81f84d26ed57c84dd9253f13dcb7174b27ccd8aaf"}, + {file = "httptools-0.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:259920bbae18740a40236807915def554132ad70af5067e562f4660b62c59b90"}, + {file = "httptools-0.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03bfd2ae8a2d532952ac54445a2fb2504c804135ed28b53fefaf03d3a93eb1fd"}, + {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f959e4770b3fc8ee4dbc3578fd910fab9003e093f20ac8c621452c4d62e517cb"}, + {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e22896b42b95b3237eccc42278cd72c0df6f23247d886b7ded3163452481e38"}, + {file = "httptools-0.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:38f3cafedd6aa20ae05f81f2e616ea6f92116c8a0f8dcb79dc798df3356836e2"}, + {file = "httptools-0.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47043a6e0ea753f006a9d0dd076a8f8c99bc0ecae86a0888448eb3076c43d717"}, + {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a541579bed0270d1ac10245a3e71e5beeb1903b5fbbc8d8b4d4e728d48ff1d"}, + {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65d802e7b2538a9756df5acc062300c160907b02e15ed15ba035b02bce43e89c"}, + {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:26326e0a8fe56829f3af483200d914a7cd16d8d398d14e36888b56de30bec81a"}, + {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e41ccac9e77cd045f3e4ee0fc62cbf3d54d7d4b375431eb855561f26ee7a9ec4"}, + {file = "httptools-0.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4e748fc0d5c4a629988ef50ac1aef99dfb5e8996583a73a717fc2cac4ab89932"}, + {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cf8169e839a0d740f3d3c9c4fa630ac1a5aaf81641a34575ca6773ed7ce041a1"}, + {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5dcc14c090ab57b35908d4a4585ec5c0715439df07be2913405991dbb37e049d"}, + {file = "httptools-0.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0b0571806a5168013b8c3d180d9f9d6997365a4212cb18ea20df18b938aa0b"}, + {file = "httptools-0.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb4a608c631f7dcbdf986f40af7a030521a10ba6bc3d36b28c1dc9e9035a3c0"}, + {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:93f89975465133619aea8b1952bc6fa0e6bad22a447c6d982fc338fbb4c89649"}, + {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:73e9d66a5a28b2d5d9fbd9e197a31edd02be310186db423b28e6052472dc8201"}, + {file = "httptools-0.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:22c01fcd53648162730a71c42842f73b50f989daae36534c818b3f5050b54589"}, + {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f96d2a351b5625a9fd9133c95744e8ca06f7a4f8f0b8231e4bbaae2c485046a"}, + {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72ec7c70bd9f95ef1083d14a755f321d181f046ca685b6358676737a5fecd26a"}, + {file = "httptools-0.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b703d15dbe082cc23266bf5d9448e764c7cb3fcfe7cb358d79d3fd8248673ef9"}, + {file = "httptools-0.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c723ed5982f8ead00f8e7605c53e55ffe47c47465d878305ebe0082b6a1755"}, + {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b0a816bb425c116a160fbc6f34cece097fd22ece15059d68932af686520966bd"}, + {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dea66d94e5a3f68c5e9d86e0894653b87d952e624845e0b0e3ad1c733c6cc75d"}, + {file = "httptools-0.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:23b09537086a5a611fad5696fc8963d67c7e7f98cb329d38ee114d588b0b74cd"}, + {file = "httptools-0.6.0.tar.gz", hash = "sha256:9fc6e409ad38cbd68b177cd5158fc4042c796b82ca88d99ec78f07bed6c6b796"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] + +[[package]] +name = "httpx" +version = "0.24.1" +description = "The next generation HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, + {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, +] + +[package.dependencies] +certifi = "*" +httpcore = ">=0.15.0,<0.18.0" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.8.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "itsdangerous" +version = "2.1.2" +description = "Safely pass data to untrusted environments and back." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, + {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, +] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pathspec" +version = "0.11.2" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] + +[[package]] +name = "platformdirs" +version = "3.10.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "protobuf" +version = "3.20.3" +description = "Protocol Buffers" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "protobuf-3.20.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99"}, + {file = "protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e"}, + {file = "protobuf-3.20.3-cp310-cp310-win32.whl", hash = "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c"}, + {file = "protobuf-3.20.3-cp310-cp310-win_amd64.whl", hash = "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7"}, + {file = "protobuf-3.20.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469"}, + {file = "protobuf-3.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4"}, + {file = "protobuf-3.20.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4"}, + {file = "protobuf-3.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454"}, + {file = "protobuf-3.20.3-cp37-cp37m-win32.whl", hash = "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905"}, + {file = "protobuf-3.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c"}, + {file = "protobuf-3.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7"}, + {file = "protobuf-3.20.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee"}, + {file = "protobuf-3.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050"}, + {file = "protobuf-3.20.3-cp38-cp38-win32.whl", hash = "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86"}, + {file = "protobuf-3.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9"}, + {file = "protobuf-3.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b"}, + {file = "protobuf-3.20.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b"}, + {file = "protobuf-3.20.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402"}, + {file = "protobuf-3.20.3-cp39-cp39-win32.whl", hash = "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480"}, + {file = "protobuf-3.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7"}, + {file = "protobuf-3.20.3-py2.py3-none-any.whl", hash = "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db"}, + {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"}, +] + +[[package]] +name = "pydantic" +version = "1.10.11" +description = "Data validation and settings management using python type hints" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"}, + {file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"}, + {file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"}, + {file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"}, + {file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"}, + {file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"}, + {file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"}, + {file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"}, + {file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"}, + {file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dotenv" +version = "1.0.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] + +[[package]] +name = "urllib3" +version = "2.0.4" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, + {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.23.2" +description = "The lightning-fast ASGI server." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.23.2-py3-none-any.whl", hash = "sha256:1f9be6558f01239d4fdf22ef8126c39cb1ad0addf76c40e760549d2c2f43ab53"}, + {file = "uvicorn-0.23.2.tar.gz", hash = "sha256:4d3cc12d7727ba72b64d12d3cc7743124074c0a69f7b201512fc50c3e3f1569a"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} +h11 = ">=0.8" +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "uvloop" +version = "0.17.0" +description = "Fast implementation of asyncio event loop on top of libuv" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, + {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, + {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, +] + +[package.extras] +dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] + +[[package]] +name = "watchfiles" +version = "0.19.0" +description = "Simple, modern and high performance file watching and code reload in python." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchfiles-0.19.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7"}, + {file = "watchfiles-0.19.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c"}, + {file = "watchfiles-0.19.0-cp37-abi3-win32.whl", hash = "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_amd64.whl", hash = "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_arm64.whl", hash = "sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d"}, + {file = "watchfiles-0.19.0.tar.gz", hash = "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "websockets" +version = "11.0.3" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, + {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, + {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, + {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, + {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, + {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, + {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, + {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, + {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, + {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, + {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, + {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, + {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, + {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, +] + +[[package]] +name = "werkzeug" +version = "2.3.7" +description = "The comprehensive WSGI web application library." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "werkzeug-2.3.7-py3-none-any.whl", hash = "sha256:effc12dba7f3bd72e605ce49807bbe692bd729c3bb122a3b91747a6ae77df528"}, + {file = "werkzeug-2.3.7.tar.gz", hash = "sha256:2b8c0e447b4b9dbcc85dd97b6eeb4dcbaf6c8b6c3be0bd654e25553e0a2157d8"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "zipp" +version = "3.16.2" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, + {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.9.7" +content-hash = "90aa2420ae521b6030bec1ac63320336c1be37a8adae102338ab1bebef87725c" diff --git a/protobuf/eigr/functions/protocol/actors/actor.proto b/protobuf/eigr/functions/protocol/actors/actor.proto index d7a0846..10df44c 100644 --- a/protobuf/eigr/functions/protocol/actors/actor.proto +++ b/protobuf/eigr/functions/protocol/actors/actor.proto @@ -38,27 +38,27 @@ message TimeoutStrategy { int64 timeout = 1; } -// A command represents an action that the user can perform on an Actor. -// Commands in supporting languages are represented by functions or methods. -// An Actor command has nothing to do with the semantics of Commands in a CQRS/EventSourced system. +// A action represents an action that the user can perform on an Actor. +// Actions in supporting languages are represented by functions or methods. +// An Actor action has nothing to do with the semantics of Actions in a CQRS/EventSourced system. // It just represents an action that supporting languages can invoke. -message Command { +message Action { // The name of the function or method in the supporting language that has been registered in Ator. string name = 1; } -// A FixedTimerCommand is similar to a regular Command, its main differences are that it is scheduled to run at regular intervals +// A FixedTimerAction is similar to a regular Action, its main differences are that it is scheduled to run at regular intervals // and only takes the actor's state as an argument. -// Timer Commands are good for executing loops that manipulate the actor's own state. +// Timer Actions are good for executing loops that manipulate the actor's own state. // In Elixir or other languages in BEAM it would be similar to invoking Process.send_after(self(), atom, msg, timeout) -message FixedTimerCommand { +message FixedTimerAction { - // The time to wait until the command is triggered + // The time to wait until the action is triggered int32 seconds = 1; - // See Command description Above - Command command = 2; + // See Action description Above + Action action = 2; } message ActorState { @@ -68,7 +68,7 @@ message ActorState { // TODO doc here message Metadata { - // A channel group represents a way to send commands to various actors + // A channel group represents a way to send actions to various actors // that belong to a certain semantic group. string channel_group = 1; @@ -79,17 +79,17 @@ message Metadata { // Regardless of the type of actor it is important that // all actors are registered during the proxy and host initialization phase. enum Kind { - // When no type is informed, the default to be assumed will be the Singleton pattern. + // When no type is informed, the default to be assumed will be the Named pattern. UNKNOW_KIND = 0; - // Abstract actors are used to create children of this based actor at runtime - ABSTRACT = 1; + // NAMED actors are used to create children of this based actor at runtime + NAMED = 1; - // Singleton actors as the name suggests have only one real instance of themselves running - // during their entire lifecycle. That is, they are the opposite of the Abstract type Actors. - SINGLETON = 2; + // UNAMED actors as the name suggests have only one real instance of themselves running + // during their entire lifecycle. That is, they are the opposite of the NAMED type Actors. + UNAMED = 2; - // Pooled Actors are similar to abstract actors, but unlike them, + // Pooled Actors are similar to Unamed actors, but unlike them, // their identifying name will always be the one registered at the system initialization stage. // The great advantage of Pooled actors is that they have multiple instances of themselves // acting as a request service pool. @@ -134,7 +134,7 @@ message ActorId { // Name of a ActorSystem string system = 2; - // When the Actor is of the Abstract type, + // When the Actor is of the Unamed type, // the name of the parent Actor must be informed here. string parent = 3; } @@ -152,9 +152,9 @@ message Actor { // Actor settings. ActorSettings settings = 3; - // The commands registered for an actor - repeated Command commands = 4; + // The actions registered for an actor + repeated Action actions = 4; - // The registered timer commands for an actor. - repeated FixedTimerCommand timer_commands = 5; + // The registered timer actions for an actor. + repeated FixedTimerAction timer_actions = 5; } \ No newline at end of file diff --git a/protobuf/eigr/functions/protocol/actors/protocol.proto b/protobuf/eigr/functions/protocol/actors/protocol.proto index 47aae1c..56c37c6 100644 --- a/protobuf/eigr/functions/protocol/actors/protocol.proto +++ b/protobuf/eigr/functions/protocol/actors/protocol.proto @@ -58,7 +58,7 @@ // // Actors are usually created at the beginning of the SDK's communication flow with the Proxy by the registration step described above. // However, some use cases require that Actors can be created ***on the fly***. -// In other words, Spawn is used to bring to life Actors previously registered as Abstracts, giving them a name and thus creating a concrete instance +// In other words, Spawn is used to bring to life Actors previously registered as Unameds, giving them a name and thus creating a concrete instance // at runtime for that Actor. Actors created with the Spawn feature are generally used when you want to share a behavior while maintaining // the isolation characteristics of the actors. // For these situations we have the Spawning flow described below. @@ -135,7 +135,7 @@ // ║ ║ ║ ║ // ║ ║ ╠───┐ ║ // ║ ║ ║ │Handle request, ║ -// ║ ║ ║ │execute command ║ +// ║ ║ ║ │execute action ║ // ║ ║ ║◀──┘ ║ // ║ ║ ║ Reply with the ║ // ║ ║ ╠────────────result and the ────────▶║ @@ -167,7 +167,8 @@ option go_package = "github.com/eigr/go-support/eigr/protocol;protocol"; // // Params: // * state: Actor state passed back and forth between proxy and user function. -// * metadata: Meta information or headers +// * metadata: Meta information that comes in invocations +// * tags: Meta information stored in the actor // * caller: ActorId of who is calling target actor // * self: ActorId of itself message Context { @@ -176,6 +177,8 @@ message Context { map metadata = 4; + map tags = 5; + // Who is calling target actor eigr.functions.protocol.actors.ActorId caller = 2; @@ -189,6 +192,12 @@ message Context { // he does not care about the input value only with the state. message Noop {} +// JSON is an alternative that some SDKs can opt in +// it will bypass any type validation in spawn actors state / payloads +message JSONType { + string content = 1; +} + message RegistrationRequest { ServiceInfo service_info = 1; @@ -268,8 +277,8 @@ message Broadcast { // Channel of target Actors string channel_group = 1; - // Command. Only Actors that have this command will run successfully - string command_name = 2; + // Action. Only Actors that have this action will run successfully + string action_name = 2; // Payload oneof payload { @@ -278,26 +287,26 @@ message Broadcast { } } -// Sends the output of a command of an Actor to the input of another command of an Actor +// Sends the output of a action of an Actor to the input of another action of an Actor // Useful for handle `pipes` pattern: // https://www.enterpriseintegrationpatterns.com/patterns/messaging/PipesAndFilters.html message Pipe { // Target Actor string actor = 1; - // Command. - string command_name = 2; + // Action. + string action_name = 2; } -// Sends the input of a command of an Actor to the input of another command of an Actor +// Sends the input of a action of an Actor to the input of another action of an Actor // Useful for handle `content-basead router` pattern // https://www.enterpriseintegrationpatterns.com/patterns/messaging/ContentBasedRouter.html message Forward { // Target Actor string actor = 1; - // Command. - string command_name = 2; + // Action. + string action_name = 2; } // Container for archicetural message patterns @@ -316,14 +325,14 @@ message Workflow { // The user function when it wants to send a message to an Actor uses the InvocationRequest message type. // // Params: -// * system: See ActorStstem message. +// * system: See ActorSystem message. // * actor: The target Actor, i.e. the one that the user function is calling to perform some computation. // * caller: The caller Actor -// * command_name: The function or method on the target Actor that will receive this request +// * action_name: The function or method on the target Actor that will receive this request // and perform some useful computation with the sent data. -// * value: This is the value sent by the user function to be computed by the request's target Actor command. -// * async: Indicates whether the command should be processed synchronously, where a response should be sent back to the user function, -// or whether the command should be processed asynchronously, i.e. no response sent to the caller and no waiting. +// * value: This is the value sent by the user function to be computed by the request's target Actor action. +// * async: Indicates whether the action should be processed synchronously, where a response should be sent back to the user function, +// or whether the action should be processed asynchronously, i.e. no response sent to the caller and no waiting. // * metadata: Meta information or headers message InvocationRequest { @@ -331,7 +340,7 @@ message InvocationRequest { eigr.functions.protocol.actors.Actor actor = 2; - string command_name = 3; + string action_name = 3; oneof payload { google.protobuf.Any value = 4; @@ -354,17 +363,17 @@ message InvocationRequest { // // Params: // * actor: The ActorId handling the InvocationRequest request, also called the target Actor. -// * command_name: The function or method on the target Actor that will receive this request +// * action_name: The function or method on the target Actor that will receive this request // and perform some useful computation with the sent data. // * current_context: The current Context with current state value of the target Actor. // That is, the same as found via matching in %Actor{name: target_actor, state: %ActorState{state: value} = actor_state}. // In this case, the Context type will contain in the value attribute the same `value` as the matching above. -// * payload: The value to be passed to the function or method corresponding to command_name. +// * payload: The value to be passed to the function or method corresponding to action_name. message ActorInvocation { eigr.functions.protocol.actors.ActorId actor = 1; - string command_name = 2; + string action_name = 2; Context current_context = 3; @@ -439,5 +448,3 @@ message RequestStatus { string message = 2; } - - \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..a7b9599 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,55 @@ +[tool.poetry] +authors = ["Adriano Santos "] +classifiers = [ + "Topic :: Software Development", + "Intended Audience :: Developers", +] +description = "Spawn Python SDK" +documentation = "https://eigr.io/docs" +homepage = "https://eigr.io/" +keywords = ["cloud", "service mesh", "sidecar", "erlang", "elixir"] +license = "Apache-2.0" +maintainers = [ + "Adriano Santos ", +] +name = "spawn" +packages = [{include = "spawn"}] +readme = "README.md" +repository = "https://github.com/eigr-labs/spawn-python-sdk" +version = "0.1.1" + +[tool.poetry.dependencies] +async-lru = "^2.0.4" +attrs = "^21.4.0" +dependency-injector = "^4.39.1" +flask = "^2.1.3" +google-api = "^0.1.12" +googleapis-common-protos = "1.56.4" +httpx = "^0.24.1" +protobuf = "3.20.3" +pydantic = "1.10.11" +python = "^3.9.7" +requests = "^2.31.0" +uvicorn = {extras = ["standard"], version = "^0.23.2"} + +[tool.poetry.group.dev.dependencies] +pytest = "^7.4.0" + +# formatters +black = "^23.7.0" +isort = {version = "^5.12.0", extras = ["pyproject"]} + +[tool.isort] +line_length = 140 +profile = "black" +py_version = 310 +src_paths = ["src", "spawn", "tests"] + +[tool.black] +line-length = 115 +skip_string_normalization = true +target-version = ['py310'] + +[build-system] +build-backend = "poetry.core.masonry.api" +requires = ["poetry-core"] diff --git a/scripts/compile-pb.sh b/scripts/compile-pb.sh index e048555..d1c5034 100755 --- a/scripts/compile-pb.sh +++ b/scripts/compile-pb.sh @@ -8,4 +8,4 @@ set -o pipefail protoc -I ../protobuf/ --python_out=../spawn eigr/functions/protocol/actors/actor.proto protoc -I ../protobuf/ --python_out=../spawn eigr/functions/protocol/actors/protocol.proto -protoc -I ../example/protobuf/ --python_out=../example ../example/protobuf/domain/domain.proto +#protoc -I ../example/protobuf/ --python_out=../example ../example/protobuf/domain/domain.proto diff --git a/spawn/controller.py b/spawn/controller.py deleted file mode 100644 index 79b83d1..0000000 --- a/spawn/controller.py +++ /dev/null @@ -1,145 +0,0 @@ -""" -Copyright 2022 Eigr. -Licensed under the Apache License, Version 2.0. -""" -from spawn.eigr.functions.protocol.actors.actor_pb2 import ( - Actor, - ActorId, - ActorState, - Metadata, - ActorSettings, - Command, - FixedTimerCommand, - ActorSnapshotStrategy, - ActorDeactivationStrategy, - ActorSystem, - Registry, - TimeoutStrategy, -) - -from spawn.eigr.functions.protocol.actors.protocol_pb2 import ( - RegistrationRequest, - RegistrationResponse, - ServiceInfo, -) - -from spawn.entity import ActorEntity - -import logging -import platform -import requests - -from typing import Any, List - - -class SpawnActorController: - - register_uri = "/api/v1/system" - - default_headers = { - "Accept": "application/octet-stream", - "Content-Type": "application/octet-stream", - } - - def __init__(self, host: str, port: str): - self.host = host - self.port = port - - def invoke( - self, actor_name: str, actor_command: str, arg: Any, output_type: Any - ) -> Any: - return "" - - def register(self, actors: List[ActorEntity]): - logging.info("Registering Actors on the Proxy %s", actors) - try: - - proxy_url = "http://{}:{}{}".format(self.host, - self.port, self.register_uri) - - # Create actor params via ActorEntity - deactivate_timeout_strategy = TimeoutStrategy() - deactivate_timeout_strategy.timeout = 10000 - - snaphot_timeout_strategy = TimeoutStrategy() - snaphot_timeout_strategy.timeout = 120000 - - actor_state = ActorState() - - deactivate_strategy = ActorDeactivationStrategy() - deactivate_strategy.timeout.CopyFrom(deactivate_timeout_strategy) - - snaphot_strategy = ActorSnapshotStrategy() - snaphot_strategy.timeout.CopyFrom(snaphot_timeout_strategy) - - actor_01 = Actor() - - actor_id = ActorId() - actor_id.name = "user_actor_01" - actor_id.system = "spawn-system" - - actor_01.id.CopyFrom(actor_id) - - actor_01.state.CopyFrom(actor_state) - - actor_metatdata = Metadata() - actor_metatdata.channel_group = "spawn-python" - actor_metatdata.tags["actor"] = "user_actor_01" - - actor_01.metadata.CopyFrom(actor_metatdata) - - actor_settings = ActorSettings() - actor_settings.abstract = True - actor_settings.persistent = True - actor_settings.snapshot_strategy.CopyFrom(snaphot_strategy) - actor_settings.deactivation_strategy.CopyFrom(deactivate_strategy) - - actor_01.settings.CopyFrom(actor_settings) - - actor_command = actor_01.commands.add() - actor_command.name = "" - - actor_fixed_timer_command = actor_01.timer_commands.add() - - actor_fixed_timer_command.seconds = 1 - actor_fixed_timer_command.command.CopyFrom(actor_command) - - registry = Registry() - registry.actors.get_or_create("user_actor_01").CopyFrom(actor_01) - - actor_system = ActorSystem() - actor_system.name = "spawn-system" - actor_system.registry.CopyFrom(registry) - - service_info = ServiceInfo() - service_info.service_name = "spawn-python-sdk" - service_info.service_version = "0.1.0" - service_info.service_runtime = ( - "Python " - + platform.python_version() - + " [" - + platform.python_implementation() - + " " - + platform.python_compiler() - + "]" - ) - - service_info.support_library_name = "spawn-python-sdk" - service_info.support_library_version = "0.1.0" - service_info.protocol_major_version = 1 - service_info.protocol_minor_version = 1 - - response = RegistrationRequest() - response.service_info.CopyFrom(service_info) - response.actor_system.CopyFrom(actor_system) - - binary_payload = response.SerializeToString() - - resp = requests.post( - proxy_url, data=binary_payload, headers=self.default_headers - ) - - logging.info("Actors register response %s", resp) - except Exception as e: - logging.error("ERROR: %s", e) - logging.error("Shit %s", e.__cause__) diff --git a/spawn/eigr/functions/actors/__init__.py b/spawn/eigr/functions/actors/__init__.py new file mode 100644 index 0000000..dccc4ae --- /dev/null +++ b/spawn/eigr/functions/actors/__init__.py @@ -0,0 +1,4 @@ +""" +Copyright 2022 Eigr. +Licensed under the Apache License, Version 2.0. +""" \ No newline at end of file diff --git a/spawn/eigr/functions/actors/api/__init__.py b/spawn/eigr/functions/actors/api/__init__.py new file mode 100644 index 0000000..dccc4ae --- /dev/null +++ b/spawn/eigr/functions/actors/api/__init__.py @@ -0,0 +1,4 @@ +""" +Copyright 2022 Eigr. +Licensed under the Apache License, Version 2.0. +""" \ No newline at end of file diff --git a/spawn/eigr/functions/actors/api/actor.py b/spawn/eigr/functions/actors/api/actor.py new file mode 100644 index 0000000..dbce50c --- /dev/null +++ b/spawn/eigr/functions/actors/api/actor.py @@ -0,0 +1,97 @@ + +import inspect + +from dataclasses import dataclass, field +from typing import Callable, MutableMapping + +from spawn.eigr.functions.actors.api.context import Context +from spawn.eigr.functions.actors.api.settings import ActorSettings + + +@dataclass +class TimerFunction: + every: int + action: Callable + + +@dataclass +class Actor: + settings: ActorSettings + + action_handlers: MutableMapping[str, + Callable] = field(default_factory=dict) + + timer_action_handlers: MutableMapping[str, + Callable] = field(default_factory=dict) + + def action(self, name: str): + def register_action_handler(function): + """ + Register the function to handle actions + """ + action_name = name if name is not None else function.__name__ + + if action_name in self.action_handlers: + raise Exception("Action handler function {} already defined for action {}".format( + self.action_handlers[action_name], action_name)) + if function.__code__.co_argcount > 2: + raise Exception( + "At most two parameters, the input parameter and the context parameter, should be accepted by the action function") + self.action_handlers[action_name] = function + return function + + return register_action_handler + + def timer_action(self, every: int, name: str = None): + def register_timer_action_handler(function): + """ + Register the function to handle actions + """ + action_name = name if name is not None else function.__name__ + + if name in self.timer_action_handlers: + raise Exception("Timer Action handler function {} already defined for action {}".format( + self.timer_action_handlers[action_name], action_name)) + if function.__code__.co_argcount > 2: + raise Exception( + "At most two parameters, the input parameter and the context parameter, should be accepted by the action function") + self.timer_action_handlers[action_name] = TimerFunction( + every=every, action=function) + return function + + return register_timer_action_handler + + +def invoke(function, parameters): + print("Parameters {}".format(parameters)) + ordered_parameters = [] + for parameter_definition in inspect.signature(function).parameters.values(): + annotation = parameter_definition.annotation + if annotation == inspect._empty: + raise Exception("Cannot inject parameter {} of function {}: Missing type annotation".format( + parameter_definition.name, function)) + match_found = False + for param in parameters: + if isinstance(param, annotation): + match_found = True + ordered_parameters.append(param) + if not match_found: + raise Exception("Cannot inject parameter {} of function {}: No matching value".format( + parameter_definition.name, function)) + return function(*ordered_parameters) + + +@dataclass +class ActorHandler: + entity: Actor + + def handle_action(self, action_name, input, ctx: Context): + if action_name in self.entity.action_handlers: + return invoke(self.entity.action_handlers[action_name], [input, ctx]) + elif action_name in self.entity.timer_action_handlers: + action = self.entity.timer_action_handlers[action_name].action + return invoke(action, [input, ctx]) + else: + error = "Missing action handler function for Actor [{}] and Action [{}]".format( + self.entity.settings.name, action_name) + raise Exception(error) diff --git a/spawn/eigr/functions/actors/api/context.py b/spawn/eigr/functions/actors/api/context.py new file mode 100644 index 0000000..974e053 --- /dev/null +++ b/spawn/eigr/functions/actors/api/context.py @@ -0,0 +1,10 @@ +from dataclasses import dataclass, field +from typing import MutableMapping + + +@dataclass +class Context: + state: object + caller: str = None + metadata: MutableMapping[str, str] = field(default_factory=dict) + tags: MutableMapping[str, str] = field(default_factory=dict) diff --git a/spawn/eigr/functions/actors/api/metadata.py b/spawn/eigr/functions/actors/api/metadata.py new file mode 100644 index 0000000..f65e79e --- /dev/null +++ b/spawn/eigr/functions/actors/api/metadata.py @@ -0,0 +1,21 @@ + +from dataclasses import dataclass, field +from typing import MutableMapping + + +@dataclass +class Metadata: + __map: MutableMapping[str, str] = field(default_factory=dict) + __tags: MutableMapping[str, str] = field(default_factory=dict) + + def put_metadata(self, key: str, value: str): + self.__map[key] = value + + def put_tag(self, key: str, value: str): + self.__tags[key] = value + + def get_metadata(self): + return self.__map + + def get_tags(self): + return self.__tags diff --git a/spawn/eigr/functions/actors/api/sdk.py b/spawn/eigr/functions/actors/api/sdk.py new file mode 100644 index 0000000..70e8849 --- /dev/null +++ b/spawn/eigr/functions/actors/api/sdk.py @@ -0,0 +1,125 @@ +""" +Copyright 2022 Eigr. +Licensed under the Apache License, Version 2.0. +""" +from flask import Flask, request, send_file + +from dataclasses import dataclass, field +from typing import MutableMapping + +from spawn.eigr.functions.actors.api.actor import Actor +from spawn.eigr.functions.actors.internal.controller import ActorController + +from google.protobuf.any_pb2 import Any as ProtoAny + +import io +import os +import logging +import threading + + +def create_app(controller: ActorController): + app = Flask(__name__) + + @app.route('/api/v1/actors/actions', methods=["POST"]) + def action(): + data = request.data + logging.info('Received Actor action request: %s', data) + + actor_invocation_response = controller.handle_invoke(data) + + return send_file( + io.BytesIO(actor_invocation_response.SerializeToString()), + mimetype='application/octet-stream' + ) + + return app + + +@dataclass +class Spawn: + logging.basicConfig( + format="%(asctime)s - %(filename)s - %(levelname)s: %(message)s", + level=logging.INFO, + ) + logging.root.setLevel(logging.NOTSET) + + __app = None + __controller = None + __host = os.environ.get("USER_FUNCTION_HOST", "0.0.0.0") + __port = os.environ.get("USER_FUNCTION_PORT", "8091") + __proxy_host = os.environ.get("PROXY_HTTP_HOST", "0.0.0.0") + __proxy_port = os.environ.get("PROXY_HTTP_PORT", "9001") + __system: str = None + __actor_entities: MutableMapping[str, + Actor] = field(default_factory=dict) + + # @staticmethod + # def invoke(name: str, command: str, arg: Any, output_type: Any) -> Any: + # actorController = ActorController( + # os.environ.get("PROXY_HOST", "localhost"), + # os.environ.get("PROXY_PORT", "9002"), + # ) + # actorController.invoke(name, command, arg, output_type) + + def host(self, address: str): + """Set the Network Host address.""" + self.__host = address + return self + + def port(self, port: int): + """Set the Network Port address.""" + self.__port = str(port) + return self + + def proxy_host(self, host: str): + """Set the Spawn Proxy Host Address""" + self.__proxy_host = host + return self + + def proxy_port(self, port: int): + self.__proxy_port = str(port) + return self + + def actor_system(self, system: str = None): + """Set the ActorSystem""" + self.__system = system + return self + + def add_actor(self, actor: Actor): + """Registry the user Actor entity.""" + self.__actor_entities[actor.settings.name] = actor + return self + + def start(self): + """Start the user function and HTTP Server.""" + if not self.__system: + raise Exception( + "ActorSystem cannot be None. Use actor_system function to set an ActorSystem") + + address = "{}:{}".format(self.__host, self.__port) + self.__controller = ActorController( + self.__proxy_host, self.__proxy_port, self.__system, self.__actor_entities) + + self.__app = create_app(controller=self.__controller) + + server = threading.Thread( + target=lambda: self.__start_server()) + logging.info("Starting Spawn on address %s", address) + try: + server.start() + + # Invoke proxy for register ActorsEntity using Spawn protobuf types + self.__register() + except IOError as e: + logging.error("Error on start Spawn %s", e.__cause__) + + def __register(self): + self.__controller.register() + + def __start_server(self): + self.__app.run( + host=self.__host, + port=self.__port, + use_reloader=False + ) diff --git a/spawn/eigr/functions/actors/api/settings.py b/spawn/eigr/functions/actors/api/settings.py new file mode 100644 index 0000000..e75f5f3 --- /dev/null +++ b/spawn/eigr/functions/actors/api/settings.py @@ -0,0 +1,29 @@ +from enum import Enum +from typing import Generic, TypeVar + +T = TypeVar('T') + + +class Kind(str, Enum): + NAMED = 'NAMED' + UNNAMED = 'UNNAMED' + POOLED = 'POOLED' + + +class ActorSettings: + def __init__( + self, + name: str, + kind: Kind = Kind.NAMED, + stateful: bool = True, + state_type: Generic[T] = None, + channel: str = None, + deactivate_timeout: int = 30000, + snapshot_timeout: int = 2000): + self.name = name + self.kind = kind + self.stateful = stateful + self.state_type = state_type + self.channel = channel + self.deactivate_timeout = deactivate_timeout + self.snapshot_timeout = snapshot_timeout diff --git a/spawn/eigr/functions/actors/api/value.py b/spawn/eigr/functions/actors/api/value.py new file mode 100644 index 0000000..952e6a3 --- /dev/null +++ b/spawn/eigr/functions/actors/api/value.py @@ -0,0 +1,95 @@ +# pylint: disable=too-few-public-methods +# pylint: disable=arguments-differ +from dataclasses import dataclass +from enum import Enum + +from spawn.eigr.functions.actors.api.metadata import Metadata +from spawn.eigr.functions.actors.api.workflows.broadcast import Broadcast +from spawn.eigr.functions.actors.api.workflows.effect import Effect +from spawn.eigr.functions.actors.api.workflows.forward import Forward +from spawn.eigr.functions.actors.api.workflows.pipe import Pipe + + +class ReplyKind(str, Enum): + REPLY = 'REPLY' + NO_REPLY = 'NO_REPLY' + + +@dataclass +class Value(): + "The Concrete Builder." + __state = None + __response = None + __metadata: Metadata = None + __broadcast: Broadcast = None + __effect: Effect = None + __forward: Forward = None + __pipe: Pipe = None + __reply_kind: ReplyKind = ReplyKind.REPLY + + def get_state(self): + return self.__state + + def get_response(self): + return self.__response + + def get_metadata(self): + return self.__metadata + + def get_broadcast(self): + return self.__broadcast + + def get_broadcast(self): + return self.__broadcast + + def get_effect(self): + return self.__effect + + def get_forward(self): + return self.__forward + + def get_pipe(self): + return self.__pipe + + def get_reply_kind(self): + return self.__reply_kind + + def of(self, value, state=None): + self.__response = value + self.__state = state + return self + + def state(self, state): + self.__state = state + return self + + def metadata(self, metadata: Metadata): + self.__metadata = metadata + return self + + def value(self, value): + self.__response = value + return self + + def broadcast(self, broadcast: Broadcast): + self.__broadcast = broadcast + return self + + def effect(self, effect: Effect): + self.__effect = effect + return self + + def forward(self, forward: Forward): + self.__forward = forward + return self + + def pipe(self, pipe: Pipe): + self.__pipe = pipe + return self + + def reply(self): + return self + + def noreply(self): + self.__reply_kind = ReplyKind.NO_REPLY + return self diff --git a/spawn/eigr/functions/actors/api/workflows/__init__.py b/spawn/eigr/functions/actors/api/workflows/__init__.py new file mode 100644 index 0000000..dccc4ae --- /dev/null +++ b/spawn/eigr/functions/actors/api/workflows/__init__.py @@ -0,0 +1,4 @@ +""" +Copyright 2022 Eigr. +Licensed under the Apache License, Version 2.0. +""" \ No newline at end of file diff --git a/spawn/eigr/functions/actors/api/workflows/broadcast.py b/spawn/eigr/functions/actors/api/workflows/broadcast.py new file mode 100644 index 0000000..b9dda15 --- /dev/null +++ b/spawn/eigr/functions/actors/api/workflows/broadcast.py @@ -0,0 +1,4 @@ + +class Broadcast: + def __init__(self): + pass diff --git a/spawn/eigr/functions/actors/api/workflows/effect.py b/spawn/eigr/functions/actors/api/workflows/effect.py new file mode 100644 index 0000000..78dceb8 --- /dev/null +++ b/spawn/eigr/functions/actors/api/workflows/effect.py @@ -0,0 +1,4 @@ + +class Effect: + def __init__(self): + self diff --git a/spawn/eigr/functions/actors/api/workflows/forward.py b/spawn/eigr/functions/actors/api/workflows/forward.py new file mode 100644 index 0000000..14d5edc --- /dev/null +++ b/spawn/eigr/functions/actors/api/workflows/forward.py @@ -0,0 +1,4 @@ + +class Forward: + def __init__(self): + pass diff --git a/spawn/eigr/functions/actors/api/workflows/pipe.py b/spawn/eigr/functions/actors/api/workflows/pipe.py new file mode 100644 index 0000000..7d1fb9a --- /dev/null +++ b/spawn/eigr/functions/actors/api/workflows/pipe.py @@ -0,0 +1,4 @@ + +class Pipe: + def __init__(self): + pass diff --git a/spawn/eigr/functions/actors/internal/__init__.py b/spawn/eigr/functions/actors/internal/__init__.py new file mode 100644 index 0000000..dccc4ae --- /dev/null +++ b/spawn/eigr/functions/actors/internal/__init__.py @@ -0,0 +1,4 @@ +""" +Copyright 2022 Eigr. +Licensed under the Apache License, Version 2.0. +""" \ No newline at end of file diff --git a/spawn/eigr/functions/actors/internal/controller.py b/spawn/eigr/functions/actors/internal/controller.py new file mode 100644 index 0000000..964e571 --- /dev/null +++ b/spawn/eigr/functions/actors/internal/controller.py @@ -0,0 +1,276 @@ +""" +Copyright 2022 Eigr. +Licensed under the Apache License, Version 2.0. + +""" + +from spawn.eigr.functions.actors.api.actor import Actor as ActorEntity +from spawn.eigr.functions.actors.api.actor import ActorHandler +from spawn.eigr.functions.actors.api.context import Context as ActorContext +from spawn.eigr.functions.actors.api.value import Value, ReplyKind +from spawn.eigr.functions.actors.api.settings import Kind as ActorKind + +from spawn.eigr.functions.protocol.actors.actor_pb2 import ( + Actor, + ActorId, + ActorState, + Metadata, + ActorSettings, + Action, + FixedTimerAction, + ActorSnapshotStrategy, + ActorDeactivationStrategy, + ActorSystem, + Kind, + Registry, + TimeoutStrategy, +) + +from spawn.eigr.functions.protocol.actors.protocol_pb2 import ( + ActorInvocation, + ActorInvocationResponse, + Context, + Noop, + RegistrationRequest, + RegistrationResponse, + ServiceInfo, +) + +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.any_pb2 import Any as AnyProto + +import logging +import platform +import requests + +from typing import Any, MutableMapping + +_sym_db = _symbol_database.Default() + +_DEFAULT_HEADERS = { + "Accept": "application/octet-stream", + "Content-Type": "application/octet-stream", +} + +_REGISTER_URI = "/api/v1/system" + +TYPE_URL_PREFIX = 'type.googleapis.com/' + + +def get_payload(input): + print(input) + input_type: str = input.type_url + if input_type.startswith(TYPE_URL_PREFIX): + input_type = input_type[len(TYPE_URL_PREFIX):] + input_class = _sym_db.GetSymbol(input_type) + result = input_class() + result.ParseFromString(input.value) + return result + + +def pack(input): + any = AnyProto() + any.Pack(input) + return any + + +def handle_response(system, actor_name, result): + print("Result ----- {}".format(result)) + actor_invocation_response = ActorInvocationResponse() + actor_invocation_response.actor_name = actor_name + actor_invocation_response.actor_system = system + + updated_context = Context() + + if result.get_metadata() != None and len(result.get_metadata().get_metadata()) > 0: + print("Metadata -----------".format(result.metadata)) + updated_context.metadata = result.get_metadata.get_metadata() + + if result.get_metadata() != None and len(result.get_metadata().get_tags()) > 0: + updated_context.tags = result.get_metadata().get_tags() + + updated_context.state.CopyFrom(pack(result.get_state())) + + actor_invocation_response.updated_context.CopyFrom(updated_context) + + if result.get_reply_kind() == ReplyKind.NO_REPLY: + actor_invocation_response.noop = Noop() + elif result.get_reply_kind == ReplyKind.REPLY: + actor_invocation_response.value = pack(result.get_response()) + + return actor_invocation_response + + +class ActorController: + _instance = None + + def __init__(self, host: str, port: str, system: str, actors: MutableMapping[str, ActorEntity]): + self.host = host + self.port = port + self.system = system + self.actors = actors + + def __new__(cls, *args, **kwargs): + if not isinstance(cls._instance, cls): + cls._instance = object.__new__(cls) + + return cls._instance + + def handle_invoke(self, data) -> ActorInvocationResponse: + # Decode request payload data here and call python real actors methods. + databytes = bytes(data) + actor_invocation = ActorInvocation() + actor_invocation.ParseFromString(databytes) + logging.debug('Actor invocation data: %s', actor_invocation) + actor_id = actor_invocation.actor + actor_system = actor_id.system + actor_name = actor_id.name + actor_parent = actor_id.parent + + if actor_system != self.system: + raise Exception("Invalid call this Actor from ActorSystem {} does not belong to current ActorSystem {}".format( + actor_system, self.system)) + + entity = self.actors[actor_name] if not actor_parent else self.actors[actor_parent] + + handler = ActorHandler(entity) + current_context = actor_invocation.current_context + + state = None if current_context.state == None else get_payload( + current_context.state) + + input = None if actor_invocation.WhichOneof( + "payload") == "noop" else get_payload(actor_invocation.value) + + ctx = ActorContext(state=state, caller=actor_invocation.caller.name, + metadata=current_context.metadata, tags=current_context.tags) + + result = handler.handle_action( + action_name=actor_invocation.action_name, input=input, ctx=ctx) + + if not isinstance(result, Value): + raise Exception( + "Action did not return a valid type in its response. Valid Value found {}".format(type(result))) + + # Handle result value + return handle_response(actor_system, actor_name, result) + + def register(self): + logging.info("Registering Actors on the Proxy %s", self.actors) + try: + + proxy_url = "http://{}:{}{}".format(self.host, + self.port, _REGISTER_URI) + + registry = Registry() + actor_system = ActorSystem() + actor_system.name = self.system + + for actor_name, entity in self.actors.items(): + logging.info("Registering Actor %s with Config %s", + actor_name, entity) + + # Create actor params via ActorEntity + actor_template = Actor() + + actor_id = ActorId() + actor_id.name = actor_name + actor_id.system = self.system + actor_template.id.CopyFrom(actor_id) + + actor_state = ActorState() + actor_template.state.CopyFrom(actor_state) + + deactivate_timeout_strategy = TimeoutStrategy() + deactivate_timeout_strategy.timeout = entity.settings.deactivate_timeout + + snaphot_timeout_strategy = TimeoutStrategy() + snaphot_timeout_strategy.timeout = entity.settings.snapshot_timeout + + deactivate_strategy = ActorDeactivationStrategy() + deactivate_strategy.timeout.CopyFrom( + deactivate_timeout_strategy) + + snaphot_strategy = ActorSnapshotStrategy() + snaphot_strategy.timeout.CopyFrom(snaphot_timeout_strategy) + + actor_settings = ActorSettings() + actor_settings.snapshot_strategy.CopyFrom(snaphot_strategy) + actor_settings.deactivation_strategy.CopyFrom( + deactivate_strategy) + + # Set metadata + actor_metatdata = Metadata() + + if (entity.settings.channel is not None and len(entity.settings.channel) > 0): + actor_metatdata.channel_group = entity.settings.channel + + # actor_metatdata.tags["actor"] = "user_actor_template" + + actor_template.metadata.CopyFrom(actor_metatdata) + + # Set settings + if entity.settings.kind == ActorKind.NAMED: + actor_settings.kind = Kind.NAMED + elif entity.settings.kind == ActorKind.UNNAMED: + actor_settings.kind = Kind.UNAMED + elif entity.settings.kind == ActorKind.POOLED: + actor_settings.kind = Kind.POOLED + else: + actor_settings.kind = Kind.UNKNOW_KIND + + actor_settings.stateful = entity.settings.stateful + actor_template.settings.CopyFrom(actor_settings) + + # Set actions + for action_name, action in entity.action_handlers.items(): + action = Action() + action.name = action_name + actor_template.actions.append(action) + + for timer_action_name, timer_action in entity.timer_action_handlers.items(): + action = Action() + action.name = timer_action_name + + fixed_timer = FixedTimerAction() + fixed_timer.seconds = timer_action.every + fixed_timer.action.CopyFrom(action) + + actor_template.timer_actions.append(fixed_timer) + + registry.actors.get_or_create( + actor_name).CopyFrom(actor_template) + + actor_system.registry.CopyFrom(registry) + service_info = ServiceInfo() + service_info.service_name = "spawn-python-sdk" + service_info.service_version = "0.1.0" + service_info.service_runtime = ( + "Python " + + platform.python_version() + + " [" + + platform.python_implementation() + + " " + + platform.python_compiler() + + "]" + ) + + service_info.support_library_name = "spawn-python-sdk" + service_info.support_library_version = "0.1.0" + service_info.protocol_major_version = 1 + service_info.protocol_minor_version = 1 + + request = RegistrationRequest() + request.service_info.CopyFrom(service_info) + request.actor_system.CopyFrom(actor_system) + + binary_payload = request.SerializeToString() + + resp = requests.post( + proxy_url, data=binary_payload, headers=_DEFAULT_HEADERS + ) + + logging.info("Actors register response %s", resp) + except Exception as e: + logging.error("ERROR: %s", e) + logging.error("Shit %s", e.__cause__) diff --git a/spawn/eigr/functions/protocol/actors/actor_pb2.py b/spawn/eigr/functions/protocol/actors/actor_pb2.py index 7980a2e..96b46f6 100644 --- a/spawn/eigr/functions/protocol/actors/actor_pb2.py +++ b/spawn/eigr/functions/protocol/actors/actor_pb2.py @@ -2,6 +2,7 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: eigr/functions/protocol/actors/actor.proto """Generated protocol buffer code.""" +from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -11,54 +12,53 @@ _sym_db = _symbol_database.Default() -from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n*eigr/functions/protocol/actors/actor.proto\x12\x1e\x65igr.functions.protocol.actors\x1a\x19google/protobuf/any.proto\"\xa6\x01\n\x08Registry\x12\x44\n\x06\x61\x63tors\x18\x01 \x03(\x0b\x32\x34.eigr.functions.protocol.actors.Registry.ActorsEntry\x1aT\n\x0b\x41\x63torsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x34\n\x05value\x18\x02 \x01(\x0b\x32%.eigr.functions.protocol.actors.Actor:\x02\x38\x01\"W\n\x0b\x41\x63torSystem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12:\n\x08registry\x18\x02 \x01(\x0b\x32(.eigr.functions.protocol.actors.Registry\"g\n\x15\x41\x63torSnapshotStrategy\x12\x42\n\x07timeout\x18\x01 \x01(\x0b\x32/.eigr.functions.protocol.actors.TimeoutStrategyH\x00\x42\n\n\x08strategy\"k\n\x19\x41\x63torDeactivationStrategy\x12\x42\n\x07timeout\x18\x01 \x01(\x0b\x32/.eigr.functions.protocol.actors.TimeoutStrategyH\x00\x42\n\n\x08strategy\"\"\n\x0fTimeoutStrategy\x12\x0f\n\x07timeout\x18\x01 \x01(\x03\"\x17\n\x07\x43ommand\x12\x0c\n\x04name\x18\x01 \x01(\t\"^\n\x11\x46ixedTimerCommand\x12\x0f\n\x07seconds\x18\x01 \x01(\x05\x12\x38\n\x07\x63ommand\x18\x02 \x01(\x0b\x32\'.eigr.functions.protocol.actors.Command\"\xa2\x01\n\nActorState\x12\x42\n\x04tags\x18\x01 \x03(\x0b\x32\x34.eigr.functions.protocol.actors.ActorState.TagsEntry\x12#\n\x05state\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any\x1a+\n\tTagsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x90\x01\n\x08Metadata\x12\x15\n\rchannel_group\x18\x01 \x01(\t\x12@\n\x04tags\x18\x02 \x03(\x0b\x32\x32.eigr.functions.protocol.actors.Metadata.TagsEntry\x1a+\n\tTagsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xaf\x02\n\rActorSettings\x12\x32\n\x04kind\x18\x01 \x01(\x0e\x32$.eigr.functions.protocol.actors.Kind\x12\x10\n\x08stateful\x18\x02 \x01(\x08\x12P\n\x11snapshot_strategy\x18\x03 \x01(\x0b\x32\x35.eigr.functions.protocol.actors.ActorSnapshotStrategy\x12X\n\x15\x64\x65\x61\x63tivation_strategy\x18\x04 \x01(\x0b\x32\x39.eigr.functions.protocol.actors.ActorDeactivationStrategy\x12\x15\n\rmin_pool_size\x18\x05 \x01(\x05\x12\x15\n\rmax_pool_size\x18\x06 \x01(\x05\"7\n\x07\x41\x63torId\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06system\x18\x02 \x01(\t\x12\x0e\n\x06parent\x18\x03 \x01(\t\"\xfa\x02\n\x05\x41\x63tor\x12\x33\n\x02id\x18\x01 \x01(\x0b\x32\'.eigr.functions.protocol.actors.ActorId\x12\x39\n\x05state\x18\x02 \x01(\x0b\x32*.eigr.functions.protocol.actors.ActorState\x12:\n\x08metadata\x18\x06 \x01(\x0b\x32(.eigr.functions.protocol.actors.Metadata\x12?\n\x08settings\x18\x03 \x01(\x0b\x32-.eigr.functions.protocol.actors.ActorSettings\x12\x39\n\x08\x63ommands\x18\x04 \x03(\x0b\x32\'.eigr.functions.protocol.actors.Command\x12I\n\x0etimer_commands\x18\x05 \x03(\x0b\x32\x31.eigr.functions.protocol.actors.FixedTimerCommand*K\n\x04Kind\x12\x0f\n\x0bUNKNOW_KIND\x10\x00\x12\x0c\n\x08\x41\x42STRACT\x10\x01\x12\r\n\tSINGLETON\x10\x02\x12\n\n\x06POOLED\x10\x03\x12\t\n\x05PROXY\x10\x04\x42R\n!io.eigr.functions.protocol.actorsZ-ghproxy-9d2.pages.dev/eigr/go-support/eigr/actors;actorsb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n*eigr/functions/protocol/actors/actor.proto\x12\x1e\x65igr.functions.protocol.actors\x1a\x19google/protobuf/any.proto\"\xa6\x01\n\x08Registry\x12\x44\n\x06\x61\x63tors\x18\x01 \x03(\x0b\x32\x34.eigr.functions.protocol.actors.Registry.ActorsEntry\x1aT\n\x0b\x41\x63torsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x34\n\x05value\x18\x02 \x01(\x0b\x32%.eigr.functions.protocol.actors.Actor:\x02\x38\x01\"W\n\x0b\x41\x63torSystem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12:\n\x08registry\x18\x02 \x01(\x0b\x32(.eigr.functions.protocol.actors.Registry\"g\n\x15\x41\x63torSnapshotStrategy\x12\x42\n\x07timeout\x18\x01 \x01(\x0b\x32/.eigr.functions.protocol.actors.TimeoutStrategyH\x00\x42\n\n\x08strategy\"k\n\x19\x41\x63torDeactivationStrategy\x12\x42\n\x07timeout\x18\x01 \x01(\x0b\x32/.eigr.functions.protocol.actors.TimeoutStrategyH\x00\x42\n\n\x08strategy\"\"\n\x0fTimeoutStrategy\x12\x0f\n\x07timeout\x18\x01 \x01(\x03\"\x16\n\x06\x41\x63tion\x12\x0c\n\x04name\x18\x01 \x01(\t\"[\n\x10\x46ixedTimerAction\x12\x0f\n\x07seconds\x18\x01 \x01(\x05\x12\x36\n\x06\x61\x63tion\x18\x02 \x01(\x0b\x32&.eigr.functions.protocol.actors.Action\"\xa2\x01\n\nActorState\x12\x42\n\x04tags\x18\x01 \x03(\x0b\x32\x34.eigr.functions.protocol.actors.ActorState.TagsEntry\x12#\n\x05state\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any\x1a+\n\tTagsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x90\x01\n\x08Metadata\x12\x15\n\rchannel_group\x18\x01 \x01(\t\x12@\n\x04tags\x18\x02 \x03(\x0b\x32\x32.eigr.functions.protocol.actors.Metadata.TagsEntry\x1a+\n\tTagsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xaf\x02\n\rActorSettings\x12\x32\n\x04kind\x18\x01 \x01(\x0e\x32$.eigr.functions.protocol.actors.Kind\x12\x10\n\x08stateful\x18\x02 \x01(\x08\x12P\n\x11snapshot_strategy\x18\x03 \x01(\x0b\x32\x35.eigr.functions.protocol.actors.ActorSnapshotStrategy\x12X\n\x15\x64\x65\x61\x63tivation_strategy\x18\x04 \x01(\x0b\x32\x39.eigr.functions.protocol.actors.ActorDeactivationStrategy\x12\x15\n\rmin_pool_size\x18\x05 \x01(\x05\x12\x15\n\rmax_pool_size\x18\x06 \x01(\x05\"7\n\x07\x41\x63torId\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06system\x18\x02 \x01(\t\x12\x0e\n\x06parent\x18\x03 \x01(\t\"\xf6\x02\n\x05\x41\x63tor\x12\x33\n\x02id\x18\x01 \x01(\x0b\x32\'.eigr.functions.protocol.actors.ActorId\x12\x39\n\x05state\x18\x02 \x01(\x0b\x32*.eigr.functions.protocol.actors.ActorState\x12:\n\x08metadata\x18\x06 \x01(\x0b\x32(.eigr.functions.protocol.actors.Metadata\x12?\n\x08settings\x18\x03 \x01(\x0b\x32-.eigr.functions.protocol.actors.ActorSettings\x12\x37\n\x07\x61\x63tions\x18\x04 \x03(\x0b\x32&.eigr.functions.protocol.actors.Action\x12G\n\rtimer_actions\x18\x05 \x03(\x0b\x32\x30.eigr.functions.protocol.actors.FixedTimerAction*E\n\x04Kind\x12\x0f\n\x0bUNKNOW_KIND\x10\x00\x12\t\n\x05NAMED\x10\x01\x12\n\n\x06UNAMED\x10\x02\x12\n\n\x06POOLED\x10\x03\x12\t\n\x05PROXY\x10\x04\x42R\n!io.eigr.functions.protocol.actorsZ-ghproxy-9d2.pages.dev/eigr/go-support/eigr/actors;actorsb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'eigr.functions.protocol.actors.actor_pb2', _globals) +_builder.BuildTopDescriptorsAndMessages( + DESCRIPTOR, 'spawn.eigr.functions.protocol.actors.actor_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n!io.eigr.functions.protocol.actorsZ-ghproxy-9d2.pages.dev/eigr/go-support/eigr/actors;actors' - _REGISTRY_ACTORSENTRY._options = None - _REGISTRY_ACTORSENTRY._serialized_options = b'8\001' - _ACTORSTATE_TAGSENTRY._options = None - _ACTORSTATE_TAGSENTRY._serialized_options = b'8\001' - _METADATA_TAGSENTRY._options = None - _METADATA_TAGSENTRY._serialized_options = b'8\001' - _globals['_KIND']._serialized_start=1790 - _globals['_KIND']._serialized_end=1865 - _globals['_REGISTRY']._serialized_start=106 - _globals['_REGISTRY']._serialized_end=272 - _globals['_REGISTRY_ACTORSENTRY']._serialized_start=188 - _globals['_REGISTRY_ACTORSENTRY']._serialized_end=272 - _globals['_ACTORSYSTEM']._serialized_start=274 - _globals['_ACTORSYSTEM']._serialized_end=361 - _globals['_ACTORSNAPSHOTSTRATEGY']._serialized_start=363 - _globals['_ACTORSNAPSHOTSTRATEGY']._serialized_end=466 - _globals['_ACTORDEACTIVATIONSTRATEGY']._serialized_start=468 - _globals['_ACTORDEACTIVATIONSTRATEGY']._serialized_end=575 - _globals['_TIMEOUTSTRATEGY']._serialized_start=577 - _globals['_TIMEOUTSTRATEGY']._serialized_end=611 - _globals['_COMMAND']._serialized_start=613 - _globals['_COMMAND']._serialized_end=636 - _globals['_FIXEDTIMERCOMMAND']._serialized_start=638 - _globals['_FIXEDTIMERCOMMAND']._serialized_end=732 - _globals['_ACTORSTATE']._serialized_start=735 - _globals['_ACTORSTATE']._serialized_end=897 - _globals['_ACTORSTATE_TAGSENTRY']._serialized_start=854 - _globals['_ACTORSTATE_TAGSENTRY']._serialized_end=897 - _globals['_METADATA']._serialized_start=900 - _globals['_METADATA']._serialized_end=1044 - _globals['_METADATA_TAGSENTRY']._serialized_start=854 - _globals['_METADATA_TAGSENTRY']._serialized_end=897 - _globals['_ACTORSETTINGS']._serialized_start=1047 - _globals['_ACTORSETTINGS']._serialized_end=1350 - _globals['_ACTORID']._serialized_start=1352 - _globals['_ACTORID']._serialized_end=1407 - _globals['_ACTOR']._serialized_start=1410 - _globals['_ACTOR']._serialized_end=1788 + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n!io.eigr.functions.protocol.actorsZ-ghproxy-9d2.pages.dev/eigr/go-support/eigr/actors;actors' + _REGISTRY_ACTORSENTRY._options = None + _REGISTRY_ACTORSENTRY._serialized_options = b'8\001' + _ACTORSTATE_TAGSENTRY._options = None + _ACTORSTATE_TAGSENTRY._serialized_options = b'8\001' + _METADATA_TAGSENTRY._options = None + _METADATA_TAGSENTRY._serialized_options = b'8\001' + _globals['_KIND']._serialized_start = 1782 + _globals['_KIND']._serialized_end = 1851 + _globals['_REGISTRY']._serialized_start = 106 + _globals['_REGISTRY']._serialized_end = 272 + _globals['_REGISTRY_ACTORSENTRY']._serialized_start = 188 + _globals['_REGISTRY_ACTORSENTRY']._serialized_end = 272 + _globals['_ACTORSYSTEM']._serialized_start = 274 + _globals['_ACTORSYSTEM']._serialized_end = 361 + _globals['_ACTORSNAPSHOTSTRATEGY']._serialized_start = 363 + _globals['_ACTORSNAPSHOTSTRATEGY']._serialized_end = 466 + _globals['_ACTORDEACTIVATIONSTRATEGY']._serialized_start = 468 + _globals['_ACTORDEACTIVATIONSTRATEGY']._serialized_end = 575 + _globals['_TIMEOUTSTRATEGY']._serialized_start = 577 + _globals['_TIMEOUTSTRATEGY']._serialized_end = 611 + _globals['_ACTION']._serialized_start = 613 + _globals['_ACTION']._serialized_end = 635 + _globals['_FIXEDTIMERACTION']._serialized_start = 637 + _globals['_FIXEDTIMERACTION']._serialized_end = 728 + _globals['_ACTORSTATE']._serialized_start = 731 + _globals['_ACTORSTATE']._serialized_end = 893 + _globals['_ACTORSTATE_TAGSENTRY']._serialized_start = 850 + _globals['_ACTORSTATE_TAGSENTRY']._serialized_end = 893 + _globals['_METADATA']._serialized_start = 896 + _globals['_METADATA']._serialized_end = 1040 + _globals['_METADATA_TAGSENTRY']._serialized_start = 850 + _globals['_METADATA_TAGSENTRY']._serialized_end = 893 + _globals['_ACTORSETTINGS']._serialized_start = 1043 + _globals['_ACTORSETTINGS']._serialized_end = 1346 + _globals['_ACTORID']._serialized_start = 1348 + _globals['_ACTORID']._serialized_end = 1403 + _globals['_ACTOR']._serialized_start = 1406 + _globals['_ACTOR']._serialized_end = 1780 # @@protoc_insertion_point(module_scope) diff --git a/spawn/eigr/functions/protocol/actors/protocol_pb2.py b/spawn/eigr/functions/protocol/actors/protocol_pb2.py index a595168..6ab9e6c 100644 --- a/spawn/eigr/functions/protocol/actors/protocol_pb2.py +++ b/spawn/eigr/functions/protocol/actors/protocol_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n-eigr/functions/protocol/actors/protocol.proto\x12\x17\x65igr.functions.protocol\x1a*eigr/functions/protocol/actors/actor.proto\x1a\x19google/protobuf/any.proto\"\x91\x02\n\x07\x43ontext\x12#\n\x05state\x18\x01 \x01(\x0b\x32\x14.google.protobuf.Any\x12@\n\x08metadata\x18\x04 \x03(\x0b\x32..eigr.functions.protocol.Context.MetadataEntry\x12\x37\n\x06\x63\x61ller\x18\x02 \x01(\x0b\x32\'.eigr.functions.protocol.actors.ActorId\x12\x35\n\x04self\x18\x03 \x01(\x0b\x32\'.eigr.functions.protocol.actors.ActorId\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x06\n\x04Noop\"\x94\x01\n\x13RegistrationRequest\x12:\n\x0cservice_info\x18\x01 \x01(\x0b\x32$.eigr.functions.protocol.ServiceInfo\x12\x41\n\x0c\x61\x63tor_system\x18\x02 \x01(\x0b\x32+.eigr.functions.protocol.actors.ActorSystem\"\x86\x01\n\x14RegistrationResponse\x12\x36\n\x06status\x18\x01 \x01(\x0b\x32&.eigr.functions.protocol.RequestStatus\x12\x36\n\nproxy_info\x18\x02 \x01(\x0b\x32\".eigr.functions.protocol.ProxyInfo\"\xd4\x01\n\x0bServiceInfo\x12\x14\n\x0cservice_name\x18\x01 \x01(\t\x12\x17\n\x0fservice_version\x18\x02 \x01(\t\x12\x17\n\x0fservice_runtime\x18\x03 \x01(\t\x12\x1c\n\x14support_library_name\x18\x04 \x01(\t\x12\x1f\n\x17support_library_version\x18\x05 \x01(\t\x12\x1e\n\x16protocol_major_version\x18\x06 \x01(\x05\x12\x1e\n\x16protocol_minor_version\x18\x07 \x01(\x05\"G\n\x0cSpawnRequest\x12\x37\n\x06\x61\x63tors\x18\x01 \x03(\x0b\x32\'.eigr.functions.protocol.actors.ActorId\"G\n\rSpawnResponse\x12\x36\n\x06status\x18\x01 \x01(\x0b\x32&.eigr.functions.protocol.RequestStatus\"v\n\tProxyInfo\x12\x1e\n\x16protocol_major_version\x18\x01 \x01(\x05\x12\x1e\n\x16protocol_minor_version\x18\x02 \x01(\x05\x12\x12\n\nproxy_name\x18\x03 \x01(\t\x12\x15\n\rproxy_version\x18\x04 \x01(\t\"I\n\nSideEffect\x12;\n\x07request\x18\x01 \x01(\x0b\x32*.eigr.functions.protocol.InvocationRequest\"\x99\x01\n\tBroadcast\x12\x15\n\rchannel_group\x18\x01 \x01(\t\x12\x14\n\x0c\x63ommand_name\x18\x02 \x01(\t\x12%\n\x05value\x18\x03 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x12-\n\x04noop\x18\x04 \x01(\x0b\x32\x1d.eigr.functions.protocol.NoopH\x00\x42\t\n\x07payload\"+\n\x04Pipe\x12\r\n\x05\x61\x63tor\x18\x01 \x01(\t\x12\x14\n\x0c\x63ommand_name\x18\x02 \x01(\t\".\n\x07\x46orward\x12\r\n\x05\x61\x63tor\x18\x01 \x01(\t\x12\x14\n\x0c\x63ommand_name\x18\x02 \x01(\t\"\xe6\x01\n\x08Workflow\x12\x35\n\tbroadcast\x18\x02 \x01(\x0b\x32\".eigr.functions.protocol.Broadcast\x12\x34\n\x07\x65\x66\x66\x65\x63ts\x18\x01 \x03(\x0b\x32#.eigr.functions.protocol.SideEffect\x12-\n\x04pipe\x18\x03 \x01(\x0b\x32\x1d.eigr.functions.protocol.PipeH\x00\x12\x33\n\x07\x66orward\x18\x04 \x01(\x0b\x32 .eigr.functions.protocol.ForwardH\x00\x42\t\n\x07routing\"\xe8\x03\n\x11InvocationRequest\x12;\n\x06system\x18\x01 \x01(\x0b\x32+.eigr.functions.protocol.actors.ActorSystem\x12\x34\n\x05\x61\x63tor\x18\x02 \x01(\x0b\x32%.eigr.functions.protocol.actors.Actor\x12\x14\n\x0c\x63ommand_name\x18\x03 \x01(\t\x12%\n\x05value\x18\x04 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x12-\n\x04noop\x18\x07 \x01(\x0b\x32\x1d.eigr.functions.protocol.NoopH\x00\x12\r\n\x05\x61sync\x18\x05 \x01(\x08\x12\x37\n\x06\x63\x61ller\x18\x06 \x01(\x0b\x32\'.eigr.functions.protocol.actors.ActorId\x12J\n\x08metadata\x18\x08 \x03(\x0b\x32\x38.eigr.functions.protocol.InvocationRequest.MetadataEntry\x12\x14\n\x0cscheduled_to\x18\t \x01(\x03\x12\x0e\n\x06pooled\x18\n \x01(\x08\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\t\n\x07payload\"\xb4\x02\n\x0f\x41\x63torInvocation\x12\x36\n\x05\x61\x63tor\x18\x01 \x01(\x0b\x32\'.eigr.functions.protocol.actors.ActorId\x12\x14\n\x0c\x63ommand_name\x18\x02 \x01(\t\x12\x39\n\x0f\x63urrent_context\x18\x03 \x01(\x0b\x32 .eigr.functions.protocol.Context\x12%\n\x05value\x18\x04 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x12-\n\x04noop\x18\x05 \x01(\x0b\x32\x1d.eigr.functions.protocol.NoopH\x00\x12\x37\n\x06\x63\x61ller\x18\x06 \x01(\x0b\x32\'.eigr.functions.protocol.actors.ActorIdB\t\n\x07payload\"\x94\x02\n\x17\x41\x63torInvocationResponse\x12\x12\n\nactor_name\x18\x01 \x01(\t\x12\x14\n\x0c\x61\x63tor_system\x18\x02 \x01(\t\x12\x39\n\x0fupdated_context\x18\x03 \x01(\x0b\x32 .eigr.functions.protocol.Context\x12%\n\x05value\x18\x04 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x12-\n\x04noop\x18\x06 \x01(\x0b\x32\x1d.eigr.functions.protocol.NoopH\x00\x12\x33\n\x08workflow\x18\x05 \x01(\x0b\x32!.eigr.functions.protocol.WorkflowB\t\n\x07payload\"\xa0\x02\n\x12InvocationResponse\x12\x36\n\x06status\x18\x01 \x01(\x0b\x32&.eigr.functions.protocol.RequestStatus\x12;\n\x06system\x18\x02 \x01(\x0b\x32+.eigr.functions.protocol.actors.ActorSystem\x12\x34\n\x05\x61\x63tor\x18\x03 \x01(\x0b\x32%.eigr.functions.protocol.actors.Actor\x12%\n\x05value\x18\x04 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x12-\n\x04noop\x18\x05 \x01(\x0b\x32\x1d.eigr.functions.protocol.NoopH\x00\x42\t\n\x07payload\"Q\n\rRequestStatus\x12/\n\x06status\x18\x01 \x01(\x0e\x32\x1f.eigr.functions.protocol.Status\x12\x0f\n\x07message\x18\x02 \x01(\t*=\n\x06Status\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x06\n\x02OK\x10\x01\x12\x13\n\x0f\x41\x43TOR_NOT_FOUND\x10\x02\x12\t\n\x05\x45RROR\x10\x03\x42O\n\x1aio.eigr.functions.protocolZ1github.com/eigr/go-support/eigr/protocol;protocolb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n-eigr/functions/protocol/actors/protocol.proto\x12\x17\x65igr.functions.protocol\x1a*eigr/functions/protocol/actors/actor.proto\x1a\x19google/protobuf/any.proto\"\xf8\x02\n\x07\x43ontext\x12#\n\x05state\x18\x01 \x01(\x0b\x32\x14.google.protobuf.Any\x12@\n\x08metadata\x18\x04 \x03(\x0b\x32..eigr.functions.protocol.Context.MetadataEntry\x12\x38\n\x04tags\x18\x05 \x03(\x0b\x32*.eigr.functions.protocol.Context.TagsEntry\x12\x37\n\x06\x63\x61ller\x18\x02 \x01(\x0b\x32\'.eigr.functions.protocol.actors.ActorId\x12\x35\n\x04self\x18\x03 \x01(\x0b\x32\'.eigr.functions.protocol.actors.ActorId\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a+\n\tTagsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x06\n\x04Noop\"\x1b\n\x08JSONType\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\"\x94\x01\n\x13RegistrationRequest\x12:\n\x0cservice_info\x18\x01 \x01(\x0b\x32$.eigr.functions.protocol.ServiceInfo\x12\x41\n\x0c\x61\x63tor_system\x18\x02 \x01(\x0b\x32+.eigr.functions.protocol.actors.ActorSystem\"\x86\x01\n\x14RegistrationResponse\x12\x36\n\x06status\x18\x01 \x01(\x0b\x32&.eigr.functions.protocol.RequestStatus\x12\x36\n\nproxy_info\x18\x02 \x01(\x0b\x32\".eigr.functions.protocol.ProxyInfo\"\xd4\x01\n\x0bServiceInfo\x12\x14\n\x0cservice_name\x18\x01 \x01(\t\x12\x17\n\x0fservice_version\x18\x02 \x01(\t\x12\x17\n\x0fservice_runtime\x18\x03 \x01(\t\x12\x1c\n\x14support_library_name\x18\x04 \x01(\t\x12\x1f\n\x17support_library_version\x18\x05 \x01(\t\x12\x1e\n\x16protocol_major_version\x18\x06 \x01(\x05\x12\x1e\n\x16protocol_minor_version\x18\x07 \x01(\x05\"G\n\x0cSpawnRequest\x12\x37\n\x06\x61\x63tors\x18\x01 \x03(\x0b\x32\'.eigr.functions.protocol.actors.ActorId\"G\n\rSpawnResponse\x12\x36\n\x06status\x18\x01 \x01(\x0b\x32&.eigr.functions.protocol.RequestStatus\"v\n\tProxyInfo\x12\x1e\n\x16protocol_major_version\x18\x01 \x01(\x05\x12\x1e\n\x16protocol_minor_version\x18\x02 \x01(\x05\x12\x12\n\nproxy_name\x18\x03 \x01(\t\x12\x15\n\rproxy_version\x18\x04 \x01(\t\"I\n\nSideEffect\x12;\n\x07request\x18\x01 \x01(\x0b\x32*.eigr.functions.protocol.InvocationRequest\"\x98\x01\n\tBroadcast\x12\x15\n\rchannel_group\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tion_name\x18\x02 \x01(\t\x12%\n\x05value\x18\x03 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x12-\n\x04noop\x18\x04 \x01(\x0b\x32\x1d.eigr.functions.protocol.NoopH\x00\x42\t\n\x07payload\"*\n\x04Pipe\x12\r\n\x05\x61\x63tor\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tion_name\x18\x02 \x01(\t\"-\n\x07\x46orward\x12\r\n\x05\x61\x63tor\x18\x01 \x01(\t\x12\x13\n\x0b\x61\x63tion_name\x18\x02 \x01(\t\"\xe6\x01\n\x08Workflow\x12\x35\n\tbroadcast\x18\x02 \x01(\x0b\x32\".eigr.functions.protocol.Broadcast\x12\x34\n\x07\x65\x66\x66\x65\x63ts\x18\x01 \x03(\x0b\x32#.eigr.functions.protocol.SideEffect\x12-\n\x04pipe\x18\x03 \x01(\x0b\x32\x1d.eigr.functions.protocol.PipeH\x00\x12\x33\n\x07\x66orward\x18\x04 \x01(\x0b\x32 .eigr.functions.protocol.ForwardH\x00\x42\t\n\x07routing\"\xe7\x03\n\x11InvocationRequest\x12;\n\x06system\x18\x01 \x01(\x0b\x32+.eigr.functions.protocol.actors.ActorSystem\x12\x34\n\x05\x61\x63tor\x18\x02 \x01(\x0b\x32%.eigr.functions.protocol.actors.Actor\x12\x13\n\x0b\x61\x63tion_name\x18\x03 \x01(\t\x12%\n\x05value\x18\x04 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x12-\n\x04noop\x18\x07 \x01(\x0b\x32\x1d.eigr.functions.protocol.NoopH\x00\x12\r\n\x05\x61sync\x18\x05 \x01(\x08\x12\x37\n\x06\x63\x61ller\x18\x06 \x01(\x0b\x32\'.eigr.functions.protocol.actors.ActorId\x12J\n\x08metadata\x18\x08 \x03(\x0b\x32\x38.eigr.functions.protocol.InvocationRequest.MetadataEntry\x12\x14\n\x0cscheduled_to\x18\t \x01(\x03\x12\x0e\n\x06pooled\x18\n \x01(\x08\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\t\n\x07payload\"\xb3\x02\n\x0f\x41\x63torInvocation\x12\x36\n\x05\x61\x63tor\x18\x01 \x01(\x0b\x32\'.eigr.functions.protocol.actors.ActorId\x12\x13\n\x0b\x61\x63tion_name\x18\x02 \x01(\t\x12\x39\n\x0f\x63urrent_context\x18\x03 \x01(\x0b\x32 .eigr.functions.protocol.Context\x12%\n\x05value\x18\x04 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x12-\n\x04noop\x18\x05 \x01(\x0b\x32\x1d.eigr.functions.protocol.NoopH\x00\x12\x37\n\x06\x63\x61ller\x18\x06 \x01(\x0b\x32\'.eigr.functions.protocol.actors.ActorIdB\t\n\x07payload\"\x94\x02\n\x17\x41\x63torInvocationResponse\x12\x12\n\nactor_name\x18\x01 \x01(\t\x12\x14\n\x0c\x61\x63tor_system\x18\x02 \x01(\t\x12\x39\n\x0fupdated_context\x18\x03 \x01(\x0b\x32 .eigr.functions.protocol.Context\x12%\n\x05value\x18\x04 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x12-\n\x04noop\x18\x06 \x01(\x0b\x32\x1d.eigr.functions.protocol.NoopH\x00\x12\x33\n\x08workflow\x18\x05 \x01(\x0b\x32!.eigr.functions.protocol.WorkflowB\t\n\x07payload\"\xa0\x02\n\x12InvocationResponse\x12\x36\n\x06status\x18\x01 \x01(\x0b\x32&.eigr.functions.protocol.RequestStatus\x12;\n\x06system\x18\x02 \x01(\x0b\x32+.eigr.functions.protocol.actors.ActorSystem\x12\x34\n\x05\x61\x63tor\x18\x03 \x01(\x0b\x32%.eigr.functions.protocol.actors.Actor\x12%\n\x05value\x18\x04 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x12-\n\x04noop\x18\x05 \x01(\x0b\x32\x1d.eigr.functions.protocol.NoopH\x00\x42\t\n\x07payload\"Q\n\rRequestStatus\x12/\n\x06status\x18\x01 \x01(\x0e\x32\x1f.eigr.functions.protocol.Status\x12\x0f\n\x07message\x18\x02 \x01(\t*=\n\x06Status\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x06\n\x02OK\x10\x01\x12\x13\n\x0f\x41\x43TOR_NOT_FOUND\x10\x02\x12\t\n\x05\x45RROR\x10\x03\x42O\n\x1aio.eigr.functions.protocolZ1github.com/eigr/go-support/eigr/protocol;protocolb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -25,48 +25,54 @@ DESCRIPTOR._serialized_options = b'\n\032io.eigr.functions.protocolZ1github.com/eigr/go-support/eigr/protocol;protocol' _CONTEXT_METADATAENTRY._options = None _CONTEXT_METADATAENTRY._serialized_options = b'8\001' + _CONTEXT_TAGSENTRY._options = None + _CONTEXT_TAGSENTRY._serialized_options = b'8\001' _INVOCATIONREQUEST_METADATAENTRY._options = None _INVOCATIONREQUEST_METADATAENTRY._serialized_options = b'8\001' - _globals['_STATUS']._serialized_start = 3210 - _globals['_STATUS']._serialized_end = 3271 + _globals['_STATUS']._serialized_start = 3337 + _globals['_STATUS']._serialized_end = 3398 _globals['_CONTEXT']._serialized_start = 146 - _globals['_CONTEXT']._serialized_end = 419 - _globals['_CONTEXT_METADATAENTRY']._serialized_start = 372 - _globals['_CONTEXT_METADATAENTRY']._serialized_end = 419 - _globals['_NOOP']._serialized_start = 421 - _globals['_NOOP']._serialized_end = 427 - _globals['_REGISTRATIONREQUEST']._serialized_start = 430 - _globals['_REGISTRATIONREQUEST']._serialized_end = 578 - _globals['_REGISTRATIONRESPONSE']._serialized_start = 581 - _globals['_REGISTRATIONRESPONSE']._serialized_end = 715 - _globals['_SERVICEINFO']._serialized_start = 718 - _globals['_SERVICEINFO']._serialized_end = 930 - _globals['_SPAWNREQUEST']._serialized_start = 932 - _globals['_SPAWNREQUEST']._serialized_end = 1003 - _globals['_SPAWNRESPONSE']._serialized_start = 1005 - _globals['_SPAWNRESPONSE']._serialized_end = 1076 - _globals['_PROXYINFO']._serialized_start = 1078 - _globals['_PROXYINFO']._serialized_end = 1196 - _globals['_SIDEEFFECT']._serialized_start = 1198 - _globals['_SIDEEFFECT']._serialized_end = 1271 - _globals['_BROADCAST']._serialized_start = 1274 - _globals['_BROADCAST']._serialized_end = 1427 - _globals['_PIPE']._serialized_start = 1429 - _globals['_PIPE']._serialized_end = 1472 - _globals['_FORWARD']._serialized_start = 1474 - _globals['_FORWARD']._serialized_end = 1520 - _globals['_WORKFLOW']._serialized_start = 1523 - _globals['_WORKFLOW']._serialized_end = 1753 - _globals['_INVOCATIONREQUEST']._serialized_start = 1756 - _globals['_INVOCATIONREQUEST']._serialized_end = 2244 - _globals['_INVOCATIONREQUEST_METADATAENTRY']._serialized_start = 372 - _globals['_INVOCATIONREQUEST_METADATAENTRY']._serialized_end = 419 - _globals['_ACTORINVOCATION']._serialized_start = 2247 - _globals['_ACTORINVOCATION']._serialized_end = 2555 - _globals['_ACTORINVOCATIONRESPONSE']._serialized_start = 2558 - _globals['_ACTORINVOCATIONRESPONSE']._serialized_end = 2834 - _globals['_INVOCATIONRESPONSE']._serialized_start = 2837 - _globals['_INVOCATIONRESPONSE']._serialized_end = 3125 - _globals['_REQUESTSTATUS']._serialized_start = 3127 - _globals['_REQUESTSTATUS']._serialized_end = 3208 + _globals['_CONTEXT']._serialized_end = 522 + _globals['_CONTEXT_METADATAENTRY']._serialized_start = 430 + _globals['_CONTEXT_METADATAENTRY']._serialized_end = 477 + _globals['_CONTEXT_TAGSENTRY']._serialized_start = 479 + _globals['_CONTEXT_TAGSENTRY']._serialized_end = 522 + _globals['_NOOP']._serialized_start = 524 + _globals['_NOOP']._serialized_end = 530 + _globals['_JSONTYPE']._serialized_start = 532 + _globals['_JSONTYPE']._serialized_end = 559 + _globals['_REGISTRATIONREQUEST']._serialized_start = 562 + _globals['_REGISTRATIONREQUEST']._serialized_end = 710 + _globals['_REGISTRATIONRESPONSE']._serialized_start = 713 + _globals['_REGISTRATIONRESPONSE']._serialized_end = 847 + _globals['_SERVICEINFO']._serialized_start = 850 + _globals['_SERVICEINFO']._serialized_end = 1062 + _globals['_SPAWNREQUEST']._serialized_start = 1064 + _globals['_SPAWNREQUEST']._serialized_end = 1135 + _globals['_SPAWNRESPONSE']._serialized_start = 1137 + _globals['_SPAWNRESPONSE']._serialized_end = 1208 + _globals['_PROXYINFO']._serialized_start = 1210 + _globals['_PROXYINFO']._serialized_end = 1328 + _globals['_SIDEEFFECT']._serialized_start = 1330 + _globals['_SIDEEFFECT']._serialized_end = 1403 + _globals['_BROADCAST']._serialized_start = 1406 + _globals['_BROADCAST']._serialized_end = 1558 + _globals['_PIPE']._serialized_start = 1560 + _globals['_PIPE']._serialized_end = 1602 + _globals['_FORWARD']._serialized_start = 1604 + _globals['_FORWARD']._serialized_end = 1649 + _globals['_WORKFLOW']._serialized_start = 1652 + _globals['_WORKFLOW']._serialized_end = 1882 + _globals['_INVOCATIONREQUEST']._serialized_start = 1885 + _globals['_INVOCATIONREQUEST']._serialized_end = 2372 + _globals['_INVOCATIONREQUEST_METADATAENTRY']._serialized_start = 430 + _globals['_INVOCATIONREQUEST_METADATAENTRY']._serialized_end = 477 + _globals['_ACTORINVOCATION']._serialized_start = 2375 + _globals['_ACTORINVOCATION']._serialized_end = 2682 + _globals['_ACTORINVOCATIONRESPONSE']._serialized_start = 2685 + _globals['_ACTORINVOCATIONRESPONSE']._serialized_end = 2961 + _globals['_INVOCATIONRESPONSE']._serialized_start = 2964 + _globals['_INVOCATIONRESPONSE']._serialized_end = 3252 + _globals['_REQUESTSTATUS']._serialized_start = 3254 + _globals['_REQUESTSTATUS']._serialized_end = 3335 # @@protoc_insertion_point(module_scope) diff --git a/spawn/entity.py b/spawn/entity.py deleted file mode 100644 index 40dc05d..0000000 --- a/spawn/entity.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -Copyright 2022 Eigr. -Licensed under the Apache License, Version 2.0. -""" -from dataclasses import dataclass, field - -from typing import Any, Callable, MutableMapping, TypeVar, Generic - -S = TypeVar("S") -V = TypeVar("V") - -@dataclass -class ActorContext: - state: Generic[S] - -@dataclass -class Value: - state: Generic[S] - value: Generic[V] - -@dataclass -class ActorParams: - name: str - state_type: Any - snapshot_timeout: int - deactivate_timeout: int - - -class ActorInit: - def init(self) -> ActorParams: - pass - - -@dataclass -class ActorEntity: - init_state: Callable[[str], Any] - command_handlers: MutableMapping[str, Callable] = field(default_factory=dict) - - def command(self, name: str): - def register_command_handler(function): - """ - Register the function to handle commands - """ - if name in self.command_handlers: - raise Exception( - "Command handler function {} already defined for command {}".format( - self.command_handlers[name], name - ) - ) - - if function.__code__.co_argcount > 2: - raise Exception( - "At most two parameters, the command and the context, should be accepted by the command function" - ) - - self.command_handlers[name] = function - return function - - return register_command_handler - - -@dataclass -class ActorEntityHandler: - entity: ActorEntity - - def init_actor(self): - return self.entity.init() \ No newline at end of file diff --git a/spawn/handler.py b/spawn/handler.py deleted file mode 100644 index 40cf3ca..0000000 --- a/spawn/handler.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -Copyright 2022 Eigr. -Licensed under the Apache License, Version 2.0. -""" -from flask import Blueprint, request, send_file - -from google.protobuf.any_pb2 import Any as ProtoAny - -from spawn.eigr.functions.protocol.actors.protocol_pb2 import ActorInvocation, ActorInvocationResponse, Context - -import io -import logging - -action_handler = Blueprint('action_endpoint', __name__) - - -@action_handler.route('/actors/actions', methods=["POST"]) -def action(): - data = request.data - logging.info('Received Actor action request: %s', data) - - # Decode request payload data here and call python real actors methods. - databytes = bytes(data) - actor_invocation = ActorInvocation() - actor_invocation.ParseFromString(databytes) - logging.debug('Actor invocation data: %s', actor_invocation) - - # Update Context - updated_context = Context() - - # Then send ActorInvocationResponse back to the caller - actor_invocation_response = ActorInvocationResponse() - actor_invocation_response.actor_name = actor_invocation.actor_name - actor_invocation_response.actor_system = actor_invocation.actor_system - actor_invocation_response.updated_context.CopyFrom(updated_context) - - return send_file( - io.BytesIO(actor_invocation_response.SerializeToString()), - mimetype='application/octet-stream' - ) diff --git a/spawn/sdk.py b/spawn/sdk.py deleted file mode 100644 index a17bb92..0000000 --- a/spawn/sdk.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -Copyright 2022 Eigr. -Licensed under the Apache License, Version 2.0. -""" -from flask import Flask - -from dataclasses import dataclass, field - -from spawn.entity import ActorEntity -from spawn.handler import action_handler -from spawn.controller import SpawnActorController as ActorController - -from typing import List, Callable, Any, Mapping, MutableMapping -import inspect - -import json -import os -import logging -import time -import threading - - -@dataclass -class Spawn: - logging.basicConfig( - format="%(asctime)s - %(filename)s - %(levelname)s: %(message)s", - level=logging.INFO, - ) - logging.root.setLevel(logging.NOTSET) - - __host = os.environ.get("HOST", "0.0.0.0") - __port = os.environ.get("PORT", "8091") - __actors: List[ActorEntity] = field(default_factory=list) - __app = Flask(__name__) - __is_debug_enable = json.loads(os.environ.get("SDK_DEBUG_ENABLE", "false").lower()) - __actorController = ActorController( - os.environ.get("PROXY_HOST", "localhost"), - os.environ.get("PROXY_PORT", "9002"), - ) - - @staticmethod - def invoke(name: str, command: str, arg: Any, output_type: Any) -> Any: - actorController = ActorController( - os.environ.get("PROXY_HOST", "localhost"), - os.environ.get("PROXY_PORT", "9002"), - ) - actorController.invoke(name, command, arg, output_type) - - def host(self, address: str): - """Set the Network Host address.""" - self.__host = address - return self - - def port(self, port: str): - """Set the Network Port address.""" - self.__port = port - return self - - def register_actor(self, entity: ActorEntity): - """Registry the user Actor entity.""" - self.__actors.append(entity) - return self - - def start(self): - """Start the user function and HTTP Server.""" - address = "{}:{}".format(self.__host, self.__port) - - server = threading.Thread(target=lambda: self.__start_server(action_handler)) - logging.info("Starting Spawn on address %s", address) - try: - server.start() - - # Invoke proxy for register ActorsEntity using Spawn protobuf types - self.__register(self.__actors) - except IOError as e: - logging.error("Error on start Spawn %s", e.__cause__) - - def __register(self, actors: List[ActorEntity]): - self.__actorController.register(actors) - - def __start_server(self, handler): - self.__app.register_blueprint(handler, url_prefix="/api/v1") - self.__app.run( - host=self.__host, - port=self.__port, - use_reloader=False, - debug=self.__is_debug_enable, - ) diff --git a/spawn/test/test_decorators.py b/spawn/test/test_decorators.py new file mode 100644 index 0000000..0f0a31b --- /dev/null +++ b/spawn/test/test_decorators.py @@ -0,0 +1,70 @@ +# import logging +# import importlib +# from spawn.eigr.functions.actors.api.context import Context + +# from spawn.eigr.functions.actors.internal.core import ActorSettings +# from spawn.eigr.functions.actors.api.decorators.action import MyActor + +# logging.basicConfig(level=logging.DEBUG) +# _logger = logging.getLogger(__name__) + + +# def import_class_from_string(path): +# from importlib import import_module +# module_path, _, class_name = path.rpartition('.') +# mod = import_module(module_path) +# klass = getattr(mod, class_name) +# return klass + + +# def spawn(tospawn, *args, **kwargs): +# obj = tospawn(*args, **kwargs) +# obj + + +# class Spawner: + +# @classmethod +# def spawn(cls, tospawn, *args, **kwargs): +# tospawn(*args, **kwargs) + + +# def test_decorators(): +# settings: ActorSettings = ActorSettings( +# name="myactora", stateful=False) + +# actor_one = MyActor(settings=settings) + +from spawn.eigr.functions.actors.internal.controller import ActorController + + +if __name__ == '__main__': + + # # TODO definir env PYTHONPATH=/Users/jorley/Workspace/Repositorios/Publicos/spawn-python-sdk python spawn/test/test_decorators.py + # settings: ActorSettings = ActorSettings( + # name="myactora", stateful=False) + + # # actor_one = MyActor(settings=ActorSettings( + # # name="myactora", stateful=False)) + + # instance = Spawner.spawn(MyActor, settings=settings) + # print(instance) + + # # type = MyActor + # # module = type.__module__ + # # cls_name = type.__name__ + + # # type_str = f"{module}.{cls_name}" + + # # c = type(type_str) + + # # c = type.__new__(type.__name__, settings) + + # # typeclass = import_class_from_string(f"{module}.{cls_name}") + # # t = typeclass.__class__ + # # test = type(t) is MyActor + # # print(c) + # # instance = typeclass(settings) + # # print(f"Teste {instance}") + + # print(instance.sum("test", Context()))