diff --git a/.gitignore b/.gitignore index 5be1a3c..650870f 100644 --- a/.gitignore +++ b/.gitignore @@ -129,3 +129,6 @@ dmypy.json .pyre/ .idea/ + +/config.yaml +/kilroy_face_twitter/config.yaml diff --git a/kilroy_face_twitter/poetry.lock b/kilroy_face_twitter/poetry.lock index c353ab7..a096f18 100644 --- a/kilroy_face_twitter/poetry.lock +++ b/kilroy_face_twitter/poetry.lock @@ -29,6 +29,14 @@ python-versions = ">=3.6" [package.dependencies] frozenlist = ">=1.1.0" +[[package]] +name = "aiostream" +version = "0.4.4" +description = "Generator-based operators for asynchronous iteration" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "anyio" version = "3.6.1" @@ -62,18 +70,6 @@ category = "main" optional = false python-versions = ">=3.6" -[[package]] -name = "asyncstdlib" -version = "3.10.5" -description = "The missing async toolbox" -category = "main" -optional = false -python-versions = "~=3.6" - -[package.extras] -doc = ["sphinx", "sphinxcontrib-trio"] -test = ["pytest", "flake8", "flake8-bugbear", "black", "coverage", "pytest-cov", "flake8-2020", "mypy"] - [[package]] name = "atomicwrites" version = "1.4.1" @@ -96,6 +92,21 @@ docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "cloudpickle"] +[[package]] +name = "betterproto" +version = "2.0.0b5" +description = "A better Protobuf / gRPC generator & library" +category = "main" +optional = false +python-versions = ">=3.6.2,<4.0" + +[package.dependencies] +grpclib = ">=0.4.1,<0.5.0" +python-dateutil = ">=2.8,<3.0" + +[package.extras] +compiler = ["black (>=19.3b0)", "jinja2 (>=3.0.3)", "isort (>=5.10.1,<6.0.0)"] + [[package]] name = "certifi" version = "2022.6.15" @@ -145,14 +156,45 @@ python-versions = "*" [package.extras] test = ["hypothesis (==3.55.3)", "flake8 (==3.7.8)"] +[[package]] +name = "deepmerge" +version = "1.0.1" +description = "a toolset to deeply merge python dictionaries." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "fifolock" +version = "0.0.20" +description = "A flexible low-level tool to make synchronisation primitives in asyncio Python" +category = "main" +optional = false +python-versions = ">=3.5" + [[package]] name = "frozenlist" -version = "1.3.0" +version = "1.3.1" description = "A list-like structure which implements collections.abc.MutableSequence" category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "grpclib" +version = "0.4.3" +description = "Pure-Python gRPC implementation for asyncio" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +h2 = ">=3.1.0,<5" +multidict = "*" + +[package.extras] +protobuf = ["protobuf (>=3.15.0)"] + [[package]] name = "h11" version = "0.12.0" @@ -161,6 +203,26 @@ category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "h2" +version = "4.1.0" +description = "HTTP/2 State-Machine based protocol implementation" +category = "main" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +hpack = ">=4.0,<5" +hyperframe = ">=6.0,<7" + +[[package]] +name = "hpack" +version = "4.0.0" +description = "Pure-Python HPACK header compression" +category = "main" +optional = false +python-versions = ">=3.6.1" + [[package]] name = "httpcore" version = "0.15.0" @@ -199,6 +261,14 @@ cli = ["click (>=8.0.0,<9.0.0)", "rich (>=10,<13)", "pygments (>=2.0.0,<3.0.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (>=1.0.0,<2.0.0)"] +[[package]] +name = "hyperframe" +version = "6.0.1" +description = "HTTP/2 framing layer for Python" +category = "main" +optional = false +python-versions = ">=3.6.1" + [[package]] name = "idna" version = "3.3" @@ -217,7 +287,7 @@ python-versions = "*" [[package]] name = "jsonschema" -version = "4.9.0" +version = "4.12.1" description = "An implementation of JSON Schema validation for Python" category = "main" optional = false @@ -233,13 +303,14 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "kilroy-face-py-shared" -version = "0.2.0" +version = "0.3.1" description = "shared code for kilroy face SDKs in Python 🤝" category = "main" optional = false python-versions = ">=3.9,<4.0" [package.dependencies] +betterproto = ">=2.0.0b5,<3.0.0" jsonschema = ">=4.7,<5.0" pydantic = ">=1.9,<2.0" pyhumps = ">=3.7,<4.0" @@ -250,54 +321,38 @@ test = ["pytest (>=7.0,<8.0)"] [[package]] name = "kilroy-face-server-py-sdk" -version = "0.5.1" +version = "0.6.0" description = "SDK for kilroy face servers in Python 🧰" category = "main" optional = false python-versions = ">=3.9,<4.0" [package.dependencies] -asyncstdlib = ">=3.10,<4.0" -kilroy-face-py-shared = ">=0.2,<0.3" -kilroy-ws-server-py-sdk = ">=0.4,<0.5" +kilroy-face-py-shared = ">=0.3,<0.4" +kilroy-server-py-utils = ">=0.1,<0.2" [package.extras] dev = ["pytest (>=7.0,<8.0)"] test = ["pytest (>=7.0,<8.0)"] [[package]] -name = "kilroy-ws-py-shared" -version = "0.2.0" -description = "shared code for WebSocket SDKs in Python 🤝" +name = "kilroy-server-py-utils" +version = "0.1.2" +description = "utilities for kilroy servers 🔧" category = "main" optional = false python-versions = ">=3.9,<4.0" [package.dependencies] +fifolock = ">=0.0,<0.1" +jsonschema = ">=4.7,<5.0" pydantic = ">=1.9,<2.0" pyhumps = ">=3.7,<4.0" -websockets = ">=10.3,<11.0" [package.extras] dev = ["pytest (>=7.0,<8.0)"] test = ["pytest (>=7.0,<8.0)"] -[[package]] -name = "kilroy-ws-server-py-sdk" -version = "0.4.3" -description = "SDK for WebSocket servers in Python 🧰" -category = "main" -optional = false -python-versions = ">=3.9,<4.0" - -[package.dependencies] -kilroy-ws-py-shared = ">=0.2,<0.3" -yrouter = ">=1.1,<2.0" - -[package.extras] -dev = ["pytest-asyncio (>=0.19,<0.20)", "pytest (>=7.0,<8.0)"] -test = ["pytest-asyncio (>=0.19,<0.20)", "pytest (>=7.0,<8.0)"] - [[package]] name = "multidict" version = "6.0.2" @@ -352,7 +407,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pydantic" -version = "1.9.1" +version = "1.9.2" description = "Data validation and settings management using python type hints" category = "main" optional = false @@ -367,12 +422,15 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.12.0" +version = "2.13.0" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false python-versions = ">=3.6" +[package.extras] +plugins = ["importlib-metadata"] + [[package]] name = "pyhumps" version = "3.7.2" @@ -421,6 +479,25 @@ tomli = ">=1.0.0" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" + [[package]] name = "requests" version = "2.28.1" @@ -485,11 +562,19 @@ jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] [[package]] name = "shellingham" -version = "1.4.0" +version = "1.5.0" description = "Tool to Detect Surrounding Shell" category = "main" optional = false -python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6" +python-versions = ">=3.4" + +[[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.*" [[package]] name = "sniffio" @@ -569,17 +654,9 @@ brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] -[[package]] -name = "websockets" -version = "10.3" -description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" -optional = false -python-versions = ">=3.7" - [[package]] name = "yarl" -version = "1.8.0" +version = "1.8.1" description = "Yet another URL library" category = "main" optional = false @@ -589,18 +666,6 @@ python-versions = ">=3.7" idna = ">=2.0" multidict = ">=4.0" -[[package]] -name = "yrouter" -version = "1.1.0" -description = "A URL routing library." -category = "main" -optional = false -python-versions = ">=3.9" - -[package.extras] -test = ["pytest-cov", "pytest", "flake8", "isort", "black"] -build = ["check-wheel-contents", "twine"] - [extras] dev = ["pytest"] test = ["pytest"] @@ -608,7 +673,7 @@ test = ["pytest"] [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "626c7324479f0a1a085ae60db043b67d1868a979ec3973f27faa0ff2fe0aeb58" +content-hash = "3fe6e97c358b11de919b83fa598d0273ddf9b1053e84d78ebf6e5387482e0082" [metadata.files] aiohttp = [ @@ -689,6 +754,9 @@ aiosignal = [ {file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"}, {file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"}, ] +aiostream = [ + {file = "aiostream-0.4.4.tar.gz", hash = "sha256:31a505fef567a6d0c3fba2bb14f10bd3da2fb90724167a31605ee8c412455292"}, +] anyio = [ {file = "anyio-3.6.1-py3-none-any.whl", hash = "sha256:cb29b9c70620506a9a8f87a309591713446953302d7d995344d0d7c6c0c9a7be"}, {file = "anyio-3.6.1.tar.gz", hash = "sha256:413adf95f93886e442aea925f3ee43baa5a765a64a0f52c6081894f9992fdd0b"}, @@ -701,10 +769,6 @@ async-timeout = [ {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, ] -asyncstdlib = [ - {file = "asyncstdlib-3.10.5-py2.py3-none-any.whl", hash = "sha256:fcf828d1064f578e639728544717268e7a18500f7dfee3f80af3aa5609601037"}, - {file = "asyncstdlib-3.10.5.tar.gz", hash = "sha256:e9fc35e811d5b51d8fe3d17b62234b5e8e1a2513364228081cd88637b3a3506a"}, -] atomicwrites = [ {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, ] @@ -712,6 +776,10 @@ attrs = [ {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] +betterproto = [ + {file = "betterproto-2.0.0b5-py3-none-any.whl", hash = "sha256:d3e6115c7d5136f1d5974e565b7560273f66b43065e74218e472321ee1258f4c"}, + {file = "betterproto-2.0.0b5.tar.gz", hash = "sha256:00a301c70a2db4d3cdd2b261522ae1d34972fb04b655a154d67daaaf4131102e"}, +] certifi = [ {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"}, {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"}, @@ -732,71 +800,90 @@ commonmark = [ {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, ] +deepmerge = [ + {file = "deepmerge-1.0.1-py3-none-any.whl", hash = "sha256:f851fff957697cb8f4580b465acf5c2d35841695306ff0abb9cb9c273ad76112"}, + {file = "deepmerge-1.0.1.tar.gz", hash = "sha256:4b44779ed3d2fb791bb181fc2683423496fea428abb7af37feb23286de7f0a1a"}, +] +fifolock = [ + {file = "fifolock-0.0.20-py3-none-any.whl", hash = "sha256:48ce70e50ceecd799e0346b6a92bb1d0301fd6b9ebeb3a2b3383e0ca7c3e73f5"}, + {file = "fifolock-0.0.20.tar.gz", hash = "sha256:c38ac427605d87936a6131524aa2a1ef2964f12892e76c1749b136b9e53a88f9"}, +] frozenlist = [ - {file = "frozenlist-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2257aaba9660f78c7b1d8fea963b68f3feffb1a9d5d05a18401ca9eb3e8d0a3"}, - {file = "frozenlist-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4a44ebbf601d7bac77976d429e9bdb5a4614f9f4027777f9e54fd765196e9d3b"}, - {file = "frozenlist-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:45334234ec30fc4ea677f43171b18a27505bfb2dba9aca4398a62692c0ea8868"}, - {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47be22dc27ed933d55ee55845d34a3e4e9f6fee93039e7f8ebadb0c2f60d403f"}, - {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03a7dd1bfce30216a3f51a84e6dd0e4a573d23ca50f0346634916ff105ba6e6b"}, - {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:691ddf6dc50480ce49f68441f1d16a4c3325887453837036e0fb94736eae1e58"}, - {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bde99812f237f79eaf3f04ebffd74f6718bbd216101b35ac7955c2d47c17da02"}, - {file = "frozenlist-1.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a202458d1298ced3768f5a7d44301e7c86defac162ace0ab7434c2e961166e8"}, - {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9e3e9e365991f8cc5f5edc1fd65b58b41d0514a6a7ad95ef5c7f34eb49b3d3e"}, - {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:04cb491c4b1c051734d41ea2552fde292f5f3a9c911363f74f39c23659c4af78"}, - {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:436496321dad302b8b27ca955364a439ed1f0999311c393dccb243e451ff66aa"}, - {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:754728d65f1acc61e0f4df784456106e35afb7bf39cfe37227ab00436fb38676"}, - {file = "frozenlist-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6eb275c6385dd72594758cbe96c07cdb9bd6becf84235f4a594bdf21e3596c9d"}, - {file = "frozenlist-1.3.0-cp310-cp310-win32.whl", hash = "sha256:e30b2f9683812eb30cf3f0a8e9f79f8d590a7999f731cf39f9105a7c4a39489d"}, - {file = "frozenlist-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f7353ba3367473d1d616ee727945f439e027f0bb16ac1a750219a8344d1d5d3c"}, - {file = "frozenlist-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88aafd445a233dbbf8a65a62bc3249a0acd0d81ab18f6feb461cc5a938610d24"}, - {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4406cfabef8f07b3b3af0f50f70938ec06d9f0fc26cbdeaab431cbc3ca3caeaa"}, - {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf829bd2e2956066dd4de43fd8ec881d87842a06708c035b37ef632930505a2"}, - {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:603b9091bd70fae7be28bdb8aa5c9990f4241aa33abb673390a7f7329296695f"}, - {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25af28b560e0c76fa41f550eacb389905633e7ac02d6eb3c09017fa1c8cdfde1"}, - {file = "frozenlist-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c7a8a9fc9383b52c410a2ec952521906d355d18fccc927fca52ab575ee8b93"}, - {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:65bc6e2fece04e2145ab6e3c47428d1bbc05aede61ae365b2c1bddd94906e478"}, - {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3f7c935c7b58b0d78c0beea0c7358e165f95f1fd8a7e98baa40d22a05b4a8141"}, - {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd89acd1b8bb4f31b47072615d72e7f53a948d302b7c1d1455e42622de180eae"}, - {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:6983a31698490825171be44ffbafeaa930ddf590d3f051e397143a5045513b01"}, - {file = "frozenlist-1.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:adac9700675cf99e3615eb6a0eb5e9f5a4143c7d42c05cea2e7f71c27a3d0846"}, - {file = "frozenlist-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:0c36e78b9509e97042ef869c0e1e6ef6429e55817c12d78245eb915e1cca7468"}, - {file = "frozenlist-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:57f4d3f03a18facacb2a6bcd21bccd011e3b75d463dc49f838fd699d074fabd1"}, - {file = "frozenlist-1.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8c905a5186d77111f02144fab5b849ab524f1e876a1e75205cd1386a9be4b00a"}, - {file = "frozenlist-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b5009062d78a8c6890d50b4e53b0ddda31841b3935c1937e2ed8c1bda1c7fb9d"}, - {file = "frozenlist-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2fdc3cd845e5a1f71a0c3518528bfdbfe2efaf9886d6f49eacc5ee4fd9a10953"}, - {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e650bd09b5dda929523b9f8e7f99b24deac61240ecc1a32aeba487afcd970f"}, - {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40dff8962b8eba91fd3848d857203f0bd704b5f1fa2b3fc9af64901a190bba08"}, - {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:768efd082074bb203c934e83a61654ed4931ef02412c2fbdecea0cff7ecd0274"}, - {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:006d3595e7d4108a12025ddf415ae0f6c9e736e726a5db0183326fd191b14c5e"}, - {file = "frozenlist-1.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:871d42623ae15eb0b0e9df65baeee6976b2e161d0ba93155411d58ff27483ad8"}, - {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aff388be97ef2677ae185e72dc500d19ecaf31b698986800d3fc4f399a5e30a5"}, - {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9f892d6a94ec5c7b785e548e42722e6f3a52f5f32a8461e82ac3e67a3bd073f1"}, - {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:e982878792c971cbd60ee510c4ee5bf089a8246226dea1f2138aa0bb67aff148"}, - {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c6c321dd013e8fc20735b92cb4892c115f5cdb82c817b1e5b07f6b95d952b2f0"}, - {file = "frozenlist-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:30530930410855c451bea83f7b272fb1c495ed9d5cc72895ac29e91279401db3"}, - {file = "frozenlist-1.3.0-cp38-cp38-win32.whl", hash = "sha256:40ec383bc194accba825fbb7d0ef3dda5736ceab2375462f1d8672d9f6b68d07"}, - {file = "frozenlist-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:f20baa05eaa2bcd5404c445ec51aed1c268d62600362dc6cfe04fae34a424bd9"}, - {file = "frozenlist-1.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0437fe763fb5d4adad1756050cbf855bbb2bf0d9385c7bb13d7a10b0dd550486"}, - {file = "frozenlist-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b684c68077b84522b5c7eafc1dc735bfa5b341fb011d5552ebe0968e22ed641c"}, - {file = "frozenlist-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93641a51f89473837333b2f8100f3f89795295b858cd4c7d4a1f18e299dc0a4f"}, - {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6d32ff213aef0fd0bcf803bffe15cfa2d4fde237d1d4838e62aec242a8362fa"}, - {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31977f84828b5bb856ca1eb07bf7e3a34f33a5cddce981d880240ba06639b94d"}, - {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c62964192a1c0c30b49f403495911298810bada64e4f03249ca35a33ca0417a"}, - {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4eda49bea3602812518765810af732229b4291d2695ed24a0a20e098c45a707b"}, - {file = "frozenlist-1.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acb267b09a509c1df5a4ca04140da96016f40d2ed183cdc356d237286c971b51"}, - {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e1e26ac0a253a2907d654a37e390904426d5ae5483150ce3adedb35c8c06614a"}, - {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f96293d6f982c58ebebb428c50163d010c2f05de0cde99fd681bfdc18d4b2dc2"}, - {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e84cb61b0ac40a0c3e0e8b79c575161c5300d1d89e13c0e02f76193982f066ed"}, - {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:ff9310f05b9d9c5c4dd472983dc956901ee6cb2c3ec1ab116ecdde25f3ce4951"}, - {file = "frozenlist-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d26b650b71fdc88065b7a21f8ace70175bcf3b5bdba5ea22df4bfd893e795a3b"}, - {file = "frozenlist-1.3.0-cp39-cp39-win32.whl", hash = "sha256:01a73627448b1f2145bddb6e6c2259988bb8aee0fb361776ff8604b99616cd08"}, - {file = "frozenlist-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:772965f773757a6026dea111a15e6e2678fbd6216180f82a48a40b27de1ee2ab"}, - {file = "frozenlist-1.3.0.tar.gz", hash = "sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b"}, + {file = "frozenlist-1.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5f271c93f001748fc26ddea409241312a75e13466b06c94798d1a341cf0e6989"}, + {file = "frozenlist-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c6ef8014b842f01f5d2b55315f1af5cbfde284eb184075c189fd657c2fd8204"}, + {file = "frozenlist-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:219a9676e2eae91cb5cc695a78b4cb43d8123e4160441d2b6ce8d2c70c60e2f3"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b47d64cdd973aede3dd71a9364742c542587db214e63b7529fbb487ed67cddd9"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2af6f7a4e93f5d08ee3f9152bce41a6015b5cf87546cb63872cc19b45476e98a"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a718b427ff781c4f4e975525edb092ee2cdef6a9e7bc49e15063b088961806f8"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c56c299602c70bc1bb5d1e75f7d8c007ca40c9d7aebaf6e4ba52925d88ef826d"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717470bfafbb9d9be624da7780c4296aa7935294bd43a075139c3d55659038ca"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:31b44f1feb3630146cffe56344704b730c33e042ffc78d21f2125a6a91168131"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c3b31180b82c519b8926e629bf9f19952c743e089c41380ddca5db556817b221"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d82bed73544e91fb081ab93e3725e45dd8515c675c0e9926b4e1f420a93a6ab9"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49459f193324fbd6413e8e03bd65789e5198a9fa3095e03f3620dee2f2dabff2"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:94e680aeedc7fd3b892b6fa8395b7b7cc4b344046c065ed4e7a1e390084e8cb5"}, + {file = "frozenlist-1.3.1-cp310-cp310-win32.whl", hash = "sha256:fabb953ab913dadc1ff9dcc3a7a7d3dc6a92efab3a0373989b8063347f8705be"}, + {file = "frozenlist-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:eee0c5ecb58296580fc495ac99b003f64f82a74f9576a244d04978a7e97166db"}, + {file = "frozenlist-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0bc75692fb3770cf2b5856a6c2c9de967ca744863c5e89595df64e252e4b3944"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086ca1ac0a40e722d6833d4ce74f5bf1aba2c77cbfdc0cd83722ffea6da52a04"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b51eb355e7f813bcda00276b0114c4172872dc5fb30e3fea059b9367c18fbcb"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74140933d45271c1a1283f708c35187f94e1256079b3c43f0c2267f9db5845ff"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee4c5120ddf7d4dd1eaf079af3af7102b56d919fa13ad55600a4e0ebe532779b"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97d9e00f3ac7c18e685320601f91468ec06c58acc185d18bb8e511f196c8d4b2"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e19add867cebfb249b4e7beac382d33215d6d54476bb6be46b01f8cafb4878b"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a027f8f723d07c3f21963caa7d585dcc9b089335565dabe9c814b5f70c52705a"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:61d7857950a3139bce035ad0b0945f839532987dfb4c06cfe160254f4d19df03"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:53b2b45052e7149ee8b96067793db8ecc1ae1111f2f96fe1f88ea5ad5fd92d10"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bbb1a71b1784e68870800b1bc9f3313918edc63dbb8f29fbd2e767ce5821696c"}, + {file = "frozenlist-1.3.1-cp37-cp37m-win32.whl", hash = "sha256:ab6fa8c7871877810e1b4e9392c187a60611fbf0226a9e0b11b7b92f5ac72792"}, + {file = "frozenlist-1.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f89139662cc4e65a4813f4babb9ca9544e42bddb823d2ec434e18dad582543bc"}, + {file = "frozenlist-1.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4c0c99e31491a1d92cde8648f2e7ccad0e9abb181f6ac3ddb9fc48b63301808e"}, + {file = "frozenlist-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:61e8cb51fba9f1f33887e22488bad1e28dd8325b72425f04517a4d285a04c519"}, + {file = "frozenlist-1.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc2f3e368ee5242a2cbe28323a866656006382872c40869b49b265add546703f"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58fb94a01414cddcdc6839807db77ae8057d02ddafc94a42faee6004e46c9ba8"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:022178b277cb9277d7d3b3f2762d294f15e85cd2534047e68a118c2bb0058f3e"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:572ce381e9fe027ad5e055f143763637dcbac2542cfe27f1d688846baeef5170"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19127f8dcbc157ccb14c30e6f00392f372ddb64a6ffa7106b26ff2196477ee9f"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42719a8bd3792744c9b523674b752091a7962d0d2d117f0b417a3eba97d1164b"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2743bb63095ef306041c8f8ea22bd6e4d91adabf41887b1ad7886c4c1eb43d5f"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fa47319a10e0a076709644a0efbcaab9e91902c8bd8ef74c6adb19d320f69b83"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52137f0aea43e1993264a5180c467a08a3e372ca9d378244c2d86133f948b26b"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:f5abc8b4d0c5b556ed8cd41490b606fe99293175a82b98e652c3f2711b452988"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1e1cf7bc8cbbe6ce3881863671bac258b7d6bfc3706c600008925fb799a256e2"}, + {file = "frozenlist-1.3.1-cp38-cp38-win32.whl", hash = "sha256:0dde791b9b97f189874d654c55c24bf7b6782343e14909c84beebd28b7217845"}, + {file = "frozenlist-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:9494122bf39da6422b0972c4579e248867b6b1b50c9b05df7e04a3f30b9a413d"}, + {file = "frozenlist-1.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31bf9539284f39ff9398deabf5561c2b0da5bb475590b4e13dd8b268d7a3c5c1"}, + {file = "frozenlist-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e0c8c803f2f8db7217898d11657cb6042b9b0553a997c4a0601f48a691480fab"}, + {file = "frozenlist-1.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da5ba7b59d954f1f214d352308d1d86994d713b13edd4b24a556bcc43d2ddbc3"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e6b2b456f21fc93ce1aff2b9728049f1464428ee2c9752a4b4f61e98c4db96"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526d5f20e954d103b1d47232e3839f3453c02077b74203e43407b962ab131e7b"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b499c6abe62a7a8d023e2c4b2834fce78a6115856ae95522f2f974139814538c"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab386503f53bbbc64d1ad4b6865bf001414930841a870fc97f1546d4d133f141"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f63c308f82a7954bf8263a6e6de0adc67c48a8b484fab18ff87f349af356efd"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:12607804084d2244a7bd4685c9d0dca5df17a6a926d4f1967aa7978b1028f89f"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:da1cdfa96425cbe51f8afa43e392366ed0b36ce398f08b60de6b97e3ed4affef"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f810e764617b0748b49a731ffaa525d9bb36ff38332411704c2400125af859a6"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:35c3d79b81908579beb1fb4e7fcd802b7b4921f1b66055af2578ff7734711cfa"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c92deb5d9acce226a501b77307b3b60b264ca21862bd7d3e0c1f3594022f01bc"}, + {file = "frozenlist-1.3.1-cp39-cp39-win32.whl", hash = "sha256:5e77a8bd41e54b05e4fb2708dc6ce28ee70325f8c6f50f3df86a44ecb1d7a19b"}, + {file = "frozenlist-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:625d8472c67f2d96f9a4302a947f92a7adbc1e20bedb6aff8dbc8ff039ca6189"}, + {file = "frozenlist-1.3.1.tar.gz", hash = "sha256:3a735e4211a04ccfa3f4833547acdf5d2f863bfeb01cfd3edaffbc251f15cec8"}, +] +grpclib = [ + {file = "grpclib-0.4.3.tar.gz", hash = "sha256:eadf2002fc5a25158b707c0338a6c0b96dd7fbdc6df66f7e515e7f041d56a940"}, ] h11 = [ {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"}, ] +h2 = [ + {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, + {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, +] +hpack = [ + {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, + {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, +] httpcore = [ {file = "httpcore-0.15.0-py3-none-any.whl", hash = "sha256:1105b8b73c025f23ff7c36468e4432226cbb959176eab66864b8e31c4ee27fa6"}, {file = "httpcore-0.15.0.tar.gz", hash = "sha256:18b68ab86a3ccf3e7dc0f43598eaddcf472b602aba29f9aa6ab85fe2ada3980b"}, @@ -805,6 +892,10 @@ httpx = [ {file = "httpx-0.23.0-py3-none-any.whl", hash = "sha256:42974f577483e1e932c3cdc3cd2303e883cbfba17fe228b0f63589764d7b9c4b"}, {file = "httpx-0.23.0.tar.gz", hash = "sha256:f28eac771ec9eb4866d3fb4ab65abd42d38c424739e80c08d8d20570de60b0ef"}, ] +hyperframe = [ + {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, + {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, +] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, @@ -814,24 +905,20 @@ iniconfig = [ {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] jsonschema = [ - {file = "jsonschema-4.9.0-py3-none-any.whl", hash = "sha256:5d0be0cd1b670438b71c3d3145b2abba1f9d197e3e91adc4c4bae4c0e114e252"}, - {file = "jsonschema-4.9.0.tar.gz", hash = "sha256:df10e65c8f3687a48e93d0d348ce0ce5f897b5a28e9bbcbbe8f7c7eaf019e850"}, + {file = "jsonschema-4.12.1-py3-none-any.whl", hash = "sha256:05f975aee3f1244a1ea0e018e8ad2672f6ca5fd1a28bc46ffc7d4b3e9896cac4"}, + {file = "jsonschema-4.12.1.tar.gz", hash = "sha256:c7dd96a88c4ea60bdc8478589ee2d4ea5d73ab235e24d17641ad733dde4e3eb1"}, ] kilroy-face-py-shared = [ - {file = "kilroy-face-py-shared-0.2.0.tar.gz", hash = "sha256:366ea01f0b1d72aa8ea3cd63d35bc372bacac50dbaa504165e6918b0a3116faa"}, - {file = "kilroy_face_py_shared-0.2.0-py3-none-any.whl", hash = "sha256:49769a9b58b6851b547bdd7e826dffca07884def436c68ba3be4c94a44017642"}, + {file = "kilroy-face-py-shared-0.3.1.tar.gz", hash = "sha256:3e552a3336fa3bf6f64d4e58ca8130cc1f4dbd44435296f94124c8c09f92d8ef"}, + {file = "kilroy_face_py_shared-0.3.1-py3-none-any.whl", hash = "sha256:ed3e5a6e27a12cee39215990cea0c80e80a06f6d3073719ed92743d81e1fb125"}, ] kilroy-face-server-py-sdk = [ - {file = "kilroy-face-server-py-sdk-0.5.1.tar.gz", hash = "sha256:3e583a606df429dbe6e7f6c8c2a972f3f0a896d17c6af842a833541bdea1ea50"}, - {file = "kilroy_face_server_py_sdk-0.5.1-py3-none-any.whl", hash = "sha256:3999efe52dc7ee1148ba412d1001162f90194f2aecc61b1679c0be10c2c2a072"}, -] -kilroy-ws-py-shared = [ - {file = "kilroy-ws-py-shared-0.2.0.tar.gz", hash = "sha256:7517f4beb3586761a839d375943811128c4014544141e647a7df87607f095627"}, - {file = "kilroy_ws_py_shared-0.2.0-py3-none-any.whl", hash = "sha256:2cf2a8592a8a3b6a5fcb1c9b669fea1e3dec8d1f949ea460371f578d2c0e6dd8"}, + {file = "kilroy-face-server-py-sdk-0.6.0.tar.gz", hash = "sha256:5ba353c0f9c9e1e320407dd4050d113b7a16d4b760c4b9a943cfbb9ba45c43eb"}, + {file = "kilroy_face_server_py_sdk-0.6.0-py3-none-any.whl", hash = "sha256:5d99ab9f9c1b20277f9bf060ef4cd5c8c79a11afb3b19c4903f6b6cb10825b39"}, ] -kilroy-ws-server-py-sdk = [ - {file = "kilroy-ws-server-py-sdk-0.4.3.tar.gz", hash = "sha256:0706abae18ba7fc4e60a572b47dc36069fec756d7c1ca4cc2c94d894883f0f39"}, - {file = "kilroy_ws_server_py_sdk-0.4.3-py3-none-any.whl", hash = "sha256:e214d9bc920e18a4c50513e5dfdc7b4d7db7ad5fb252fa68c2d6057fd256b117"}, +kilroy-server-py-utils = [ + {file = "kilroy-server-py-utils-0.1.2.tar.gz", hash = "sha256:bb8980ba3636be50e8ce580a2846a89e6fc7d76f687bf86dca01ffd30ae511cf"}, + {file = "kilroy_server_py_utils-0.1.2-py3-none-any.whl", hash = "sha256:9991e848361286fe2e523dac403fa005715525eef7f251a3d444a3e790e41ff3"}, ] multidict = [ {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, @@ -911,45 +998,45 @@ py = [ {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] pydantic = [ - {file = "pydantic-1.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8098a724c2784bf03e8070993f6d46aa2eeca031f8d8a048dff277703e6e193"}, - {file = "pydantic-1.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c320c64dd876e45254bdd350f0179da737463eea41c43bacbee9d8c9d1021f11"}, - {file = "pydantic-1.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18f3e912f9ad1bdec27fb06b8198a2ccc32f201e24174cec1b3424dda605a310"}, - {file = "pydantic-1.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11951b404e08b01b151222a1cb1a9f0a860a8153ce8334149ab9199cd198131"}, - {file = "pydantic-1.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8bc541a405423ce0e51c19f637050acdbdf8feca34150e0d17f675e72d119580"}, - {file = "pydantic-1.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e565a785233c2d03724c4dc55464559639b1ba9ecf091288dd47ad9c629433bd"}, - {file = "pydantic-1.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:a4a88dcd6ff8fd47c18b3a3709a89adb39a6373f4482e04c1b765045c7e282fd"}, - {file = "pydantic-1.9.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:447d5521575f18e18240906beadc58551e97ec98142266e521c34968c76c8761"}, - {file = "pydantic-1.9.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:985ceb5d0a86fcaa61e45781e567a59baa0da292d5ed2e490d612d0de5796918"}, - {file = "pydantic-1.9.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059b6c1795170809103a1538255883e1983e5b831faea6558ef873d4955b4a74"}, - {file = "pydantic-1.9.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d12f96b5b64bec3f43c8e82b4aab7599d0157f11c798c9f9c528a72b9e0b339a"}, - {file = "pydantic-1.9.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ae72f8098acb368d877b210ebe02ba12585e77bd0db78ac04a1ee9b9f5dd2166"}, - {file = "pydantic-1.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:79b485767c13788ee314669008d01f9ef3bc05db9ea3298f6a50d3ef596a154b"}, - {file = "pydantic-1.9.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:494f7c8537f0c02b740c229af4cb47c0d39840b829ecdcfc93d91dcbb0779892"}, - {file = "pydantic-1.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0f047e11febe5c3198ed346b507e1d010330d56ad615a7e0a89fae604065a0e"}, - {file = "pydantic-1.9.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:969dd06110cb780da01336b281f53e2e7eb3a482831df441fb65dd30403f4608"}, - {file = "pydantic-1.9.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:177071dfc0df6248fd22b43036f936cfe2508077a72af0933d0c1fa269b18537"}, - {file = "pydantic-1.9.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9bcf8b6e011be08fb729d110f3e22e654a50f8a826b0575c7196616780683380"}, - {file = "pydantic-1.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a955260d47f03df08acf45689bd163ed9df82c0e0124beb4251b1290fa7ae728"}, - {file = "pydantic-1.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9ce157d979f742a915b75f792dbd6aa63b8eccaf46a1005ba03aa8a986bde34a"}, - {file = "pydantic-1.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0bf07cab5b279859c253d26a9194a8906e6f4a210063b84b433cf90a569de0c1"}, - {file = "pydantic-1.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d93d4e95eacd313d2c765ebe40d49ca9dd2ed90e5b37d0d421c597af830c195"}, - {file = "pydantic-1.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1542636a39c4892c4f4fa6270696902acb186a9aaeac6f6cf92ce6ae2e88564b"}, - {file = "pydantic-1.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a9af62e9b5b9bc67b2a195ebc2c2662fdf498a822d62f902bf27cccb52dbbf49"}, - {file = "pydantic-1.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fe4670cb32ea98ffbf5a1262f14c3e102cccd92b1869df3bb09538158ba90fe6"}, - {file = "pydantic-1.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:9f659a5ee95c8baa2436d392267988fd0f43eb774e5eb8739252e5a7e9cf07e0"}, - {file = "pydantic-1.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b83ba3825bc91dfa989d4eed76865e71aea3a6ca1388b59fc801ee04c4d8d0d6"}, - {file = "pydantic-1.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1dd8fecbad028cd89d04a46688d2fcc14423e8a196d5b0a5c65105664901f810"}, - {file = "pydantic-1.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02eefd7087268b711a3ff4db528e9916ac9aa18616da7bca69c1871d0b7a091f"}, - {file = "pydantic-1.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb57ba90929bac0b6cc2af2373893d80ac559adda6933e562dcfb375029acee"}, - {file = "pydantic-1.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4ce9ae9e91f46c344bec3b03d6ee9612802682c1551aaf627ad24045ce090761"}, - {file = "pydantic-1.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:72ccb318bf0c9ab97fc04c10c37683d9eea952ed526707fabf9ac5ae59b701fd"}, - {file = "pydantic-1.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:61b6760b08b7c395975d893e0b814a11cf011ebb24f7d869e7118f5a339a82e1"}, - {file = "pydantic-1.9.1-py3-none-any.whl", hash = "sha256:4988c0f13c42bfa9ddd2fe2f569c9d54646ce84adc5de84228cfe83396f3bd58"}, - {file = "pydantic-1.9.1.tar.gz", hash = "sha256:1ed987c3ff29fff7fd8c3ea3a3ea877ad310aae2ef9889a119e22d3f2db0691a"}, + {file = "pydantic-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c9e04a6cdb7a363d7cb3ccf0efea51e0abb48e180c0d31dca8d247967d85c6e"}, + {file = "pydantic-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fafe841be1103f340a24977f61dee76172e4ae5f647ab9e7fd1e1fca51524f08"}, + {file = "pydantic-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afacf6d2a41ed91fc631bade88b1d319c51ab5418870802cedb590b709c5ae3c"}, + {file = "pydantic-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ee0d69b2a5b341fc7927e92cae7ddcfd95e624dfc4870b32a85568bd65e6131"}, + {file = "pydantic-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ff68fc85355532ea77559ede81f35fff79a6a5543477e168ab3a381887caea76"}, + {file = "pydantic-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c0f5e142ef8217019e3eef6ae1b6b55f09a7a15972958d44fbd228214cede567"}, + {file = "pydantic-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:615661bfc37e82ac677543704437ff737418e4ea04bef9cf11c6d27346606044"}, + {file = "pydantic-1.9.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:328558c9f2eed77bd8fffad3cef39dbbe3edc7044517f4625a769d45d4cf7555"}, + {file = "pydantic-1.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bd446bdb7755c3a94e56d7bdfd3ee92396070efa8ef3a34fab9579fe6aa1d84"}, + {file = "pydantic-1.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0b214e57623a535936005797567231a12d0da0c29711eb3514bc2b3cd008d0f"}, + {file = "pydantic-1.9.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d8ce3fb0841763a89322ea0432f1f59a2d3feae07a63ea2c958b2315e1ae8adb"}, + {file = "pydantic-1.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b34ba24f3e2d0b39b43f0ca62008f7ba962cff51efa56e64ee25c4af6eed987b"}, + {file = "pydantic-1.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:84d76ecc908d917f4684b354a39fd885d69dd0491be175f3465fe4b59811c001"}, + {file = "pydantic-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4de71c718c9756d679420c69f216776c2e977459f77e8f679a4a961dc7304a56"}, + {file = "pydantic-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5803ad846cdd1ed0d97eb00292b870c29c1f03732a010e66908ff48a762f20e4"}, + {file = "pydantic-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8c5360a0297a713b4123608a7909e6869e1b56d0e96eb0d792c27585d40757f"}, + {file = "pydantic-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:cdb4272678db803ddf94caa4f94f8672e9a46bae4a44f167095e4d06fec12979"}, + {file = "pydantic-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:19b5686387ea0d1ea52ecc4cffb71abb21702c5e5b2ac626fd4dbaa0834aa49d"}, + {file = "pydantic-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:32e0b4fb13ad4db4058a7c3c80e2569adbd810c25e6ca3bbd8b2a9cc2cc871d7"}, + {file = "pydantic-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91089b2e281713f3893cd01d8e576771cd5bfdfbff5d0ed95969f47ef6d676c3"}, + {file = "pydantic-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e631c70c9280e3129f071635b81207cad85e6c08e253539467e4ead0e5b219aa"}, + {file = "pydantic-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b3946f87e5cef3ba2e7bd3a4eb5a20385fe36521d6cc1ebf3c08a6697c6cfb3"}, + {file = "pydantic-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5565a49effe38d51882cb7bac18bda013cdb34d80ac336428e8908f0b72499b0"}, + {file = "pydantic-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd67cb2c2d9602ad159389c29e4ca964b86fa2f35c2faef54c3eb28b4efd36c8"}, + {file = "pydantic-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4aafd4e55e8ad5bd1b19572ea2df546ccace7945853832bb99422a79c70ce9b8"}, + {file = "pydantic-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:d70916235d478404a3fa8c997b003b5f33aeac4686ac1baa767234a0f8ac2326"}, + {file = "pydantic-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ca86b525264daa5f6b192f216a0d1e860b7383e3da1c65a1908f9c02f42801"}, + {file = "pydantic-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1061c6ee6204f4f5a27133126854948e3b3d51fcc16ead2e5d04378c199b2f44"}, + {file = "pydantic-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e78578f0c7481c850d1c969aca9a65405887003484d24f6110458fb02cca7747"}, + {file = "pydantic-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5da164119602212a3fe7e3bc08911a89db4710ae51444b4224c2382fd09ad453"}, + {file = "pydantic-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ead3cd020d526f75b4188e0a8d71c0dbbe1b4b6b5dc0ea775a93aca16256aeb"}, + {file = "pydantic-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7d0f183b305629765910eaad707800d2f47c6ac5bcfb8c6397abdc30b69eeb15"}, + {file = "pydantic-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1a68f4f65a9ee64b6ccccb5bf7e17db07caebd2730109cb8a95863cfa9c4e55"}, + {file = "pydantic-1.9.2-py3-none-any.whl", hash = "sha256:78a4d6bdfd116a559aeec9a4cfe77dda62acc6233f8b56a716edad2651023e5e"}, + {file = "pydantic-1.9.2.tar.gz", hash = "sha256:8cb0bc509bfb71305d7a59d00163d5f9fc4530f0881ea32c74ff4f74c85f3d3d"}, ] pygments = [ - {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, - {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, ] pyhumps = [ {file = "pyhumps-3.7.2-py3-none-any.whl", hash = "sha256:f554bc742138c01ef85176534a411b105c3e7b20133b3c68bd4e613dcb425241"}, @@ -986,6 +1073,45 @@ pytest = [ {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, ] +python-dateutil = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] +pyyaml = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] requests = [ {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, @@ -1003,8 +1129,12 @@ rich = [ {file = "rich-12.5.1.tar.gz", hash = "sha256:63a5c5ce3673d3d5fbbf23cd87e11ab84b6b451436f1b7f19ec54b6bc36ed7ca"}, ] shellingham = [ - {file = "shellingham-1.4.0-py2.py3-none-any.whl", hash = "sha256:536b67a0697f2e4af32ab176c00a50ac2899c5a05e0d8e2dadac8e58888283f9"}, - {file = "shellingham-1.4.0.tar.gz", hash = "sha256:4855c2458d6904829bd34c299f11fdeed7cfefbf8a2c522e4caea6cd76b3171e"}, + {file = "shellingham-1.5.0-py2.py3-none-any.whl", hash = "sha256:a8f02ba61b69baaa13facdba62908ca8690a94b8119b69f5ec5873ea85f7391b"}, + {file = "shellingham-1.5.0.tar.gz", hash = "sha256:72fb7f5c63103ca2cb91b23dee0c71fe8ad6fbfd46418ef17dbe40db51592dad"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] sniffio = [ {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, @@ -1030,118 +1160,64 @@ urllib3 = [ {file = "urllib3-1.26.11-py2.py3-none-any.whl", hash = "sha256:c33ccba33c819596124764c23a97d25f32b28433ba0dedeb77d873a38722c9bc"}, {file = "urllib3-1.26.11.tar.gz", hash = "sha256:ea6e8fb210b19d950fab93b60c9009226c63a28808bc8386e05301e25883ac0a"}, ] -websockets = [ - {file = "websockets-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:661f641b44ed315556a2fa630239adfd77bd1b11cb0b9d96ed8ad90b0b1e4978"}, - {file = "websockets-10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b529fdfa881b69fe563dbd98acce84f3e5a67df13de415e143ef053ff006d500"}, - {file = "websockets-10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f351c7d7d92f67c0609329ab2735eee0426a03022771b00102816a72715bb00b"}, - {file = "websockets-10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379e03422178436af4f3abe0aa8f401aa77ae2487843738542a75faf44a31f0c"}, - {file = "websockets-10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e904c0381c014b914136c492c8fa711ca4cced4e9b3d110e5e7d436d0fc289e8"}, - {file = "websockets-10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e7e6f2d6fd48422071cc8a6f8542016f350b79cc782752de531577d35e9bd677"}, - {file = "websockets-10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9c77f0d1436ea4b4dc089ed8335fa141e6a251a92f75f675056dac4ab47a71e"}, - {file = "websockets-10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e6fa05a680e35d0fcc1470cb070b10e6fe247af54768f488ed93542e71339d6f"}, - {file = "websockets-10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2f94fa3ae454a63ea3a19f73b95deeebc9f02ba2d5617ca16f0bbdae375cda47"}, - {file = "websockets-10.3-cp310-cp310-win32.whl", hash = "sha256:6ed1d6f791eabfd9808afea1e068f5e59418e55721db8b7f3bfc39dc831c42ae"}, - {file = "websockets-10.3-cp310-cp310-win_amd64.whl", hash = "sha256:347974105bbd4ea068106ec65e8e8ebd86f28c19e529d115d89bd8cc5cda3079"}, - {file = "websockets-10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fab7c640815812ed5f10fbee7abbf58788d602046b7bb3af9b1ac753a6d5e916"}, - {file = "websockets-10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:994cdb1942a7a4c2e10098d9162948c9e7b235df755de91ca33f6e0481366fdb"}, - {file = "websockets-10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aad5e300ab32036eb3fdc350ad30877210e2f51bceaca83fb7fef4d2b6c72b79"}, - {file = "websockets-10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e49ea4c1a9543d2bd8a747ff24411509c29e4bdcde05b5b0895e2120cb1a761d"}, - {file = "websockets-10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ea6b300a6bdd782e49922d690e11c3669828fe36fc2471408c58b93b5535a98"}, - {file = "websockets-10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ef5ce841e102278c1c2e98f043db99d6755b1c58bde475516aef3a008ed7f28e"}, - {file = "websockets-10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d1655a6fc7aecd333b079d00fb3c8132d18988e47f19740c69303bf02e9883c6"}, - {file = "websockets-10.3-cp37-cp37m-win32.whl", hash = "sha256:83e5ca0d5b743cde3d29fda74ccab37bdd0911f25bd4cdf09ff8b51b7b4f2fa1"}, - {file = "websockets-10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:da4377904a3379f0c1b75a965fff23b28315bcd516d27f99a803720dfebd94d4"}, - {file = "websockets-10.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a1e15b230c3613e8ea82c9fc6941b2093e8eb939dd794c02754d33980ba81e36"}, - {file = "websockets-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:31564a67c3e4005f27815634343df688b25705cccb22bc1db621c781ddc64c69"}, - {file = "websockets-10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c8d1d14aa0f600b5be363077b621b1b4d1eb3fbf90af83f9281cda668e6ff7fd"}, - {file = "websockets-10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fbd7d77f8aba46d43245e86dd91a8970eac4fb74c473f8e30e9c07581f852b2"}, - {file = "websockets-10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:210aad7fdd381c52e58777560860c7e6110b6174488ef1d4b681c08b68bf7f8c"}, - {file = "websockets-10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6075fd24df23133c1b078e08a9b04a3bc40b31a8def4ee0b9f2c8865acce913e"}, - {file = "websockets-10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f6d96fdb0975044fdd7953b35d003b03f9e2bcf85f2d2cf86285ece53e9f991"}, - {file = "websockets-10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c7250848ce69559756ad0086a37b82c986cd33c2d344ab87fea596c5ac6d9442"}, - {file = "websockets-10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:28dd20b938a57c3124028680dc1600c197294da5db4292c76a0b48efb3ed7f76"}, - {file = "websockets-10.3-cp38-cp38-win32.whl", hash = "sha256:54c000abeaff6d8771a4e2cef40900919908ea7b6b6a30eae72752607c6db559"}, - {file = "websockets-10.3-cp38-cp38-win_amd64.whl", hash = "sha256:7ab36e17af592eec5747c68ef2722a74c1a4a70f3772bc661079baf4ae30e40d"}, - {file = "websockets-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a141de3d5a92188234afa61653ed0bbd2dde46ad47b15c3042ffb89548e77094"}, - {file = "websockets-10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:97bc9d41e69a7521a358f9b8e44871f6cdeb42af31815c17aed36372d4eec667"}, - {file = "websockets-10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d6353ba89cfc657a3f5beabb3b69be226adbb5c6c7a66398e17809b0ce3c4731"}, - {file = "websockets-10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec2b0ab7edc8cd4b0eb428b38ed89079bdc20c6bdb5f889d353011038caac2f9"}, - {file = "websockets-10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:85506b3328a9e083cc0a0fb3ba27e33c8db78341b3eb12eb72e8afd166c36680"}, - {file = "websockets-10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8af75085b4bc0b5c40c4a3c0e113fa95e84c60f4ed6786cbb675aeb1ee128247"}, - {file = "websockets-10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:07cdc0a5b2549bcfbadb585ad8471ebdc7bdf91e32e34ae3889001c1c106a6af"}, - {file = "websockets-10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5b936bf552e4f6357f5727579072ff1e1324717902127ffe60c92d29b67b7be3"}, - {file = "websockets-10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e4e08305bfd76ba8edab08dcc6496f40674f44eb9d5e23153efa0a35750337e8"}, - {file = "websockets-10.3-cp39-cp39-win32.whl", hash = "sha256:bb621ec2dbbbe8df78a27dbd9dd7919f9b7d32a73fafcb4d9252fc4637343582"}, - {file = "websockets-10.3-cp39-cp39-win_amd64.whl", hash = "sha256:51695d3b199cd03098ae5b42833006a0f43dc5418d3102972addc593a783bc02"}, - {file = "websockets-10.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:907e8247480f287aa9bbc9391bd6de23c906d48af54c8c421df84655eef66af7"}, - {file = "websockets-10.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b1359aba0ff810d5830d5ab8e2c4a02bebf98a60aa0124fb29aa78cfdb8031f"}, - {file = "websockets-10.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:93d5ea0b5da8d66d868b32c614d2b52d14304444e39e13a59566d4acb8d6e2e4"}, - {file = "websockets-10.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7934e055fd5cd9dee60f11d16c8d79c4567315824bacb1246d0208a47eca9755"}, - {file = "websockets-10.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3eda1cb7e9da1b22588cefff09f0951771d6ee9fa8dbe66f5ae04cc5f26b2b55"}, - {file = "websockets-10.3.tar.gz", hash = "sha256:fc06cc8073c8e87072138ba1e431300e2d408f054b27047d047b549455066ff4"}, -] yarl = [ - {file = "yarl-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:532376ff0c756c97c83b83037e7c784089e1628a6cd22131c2e544e79fda01d7"}, - {file = "yarl-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e46322af73f0489ce19387ce7684a44fe364424820d7f8c456b0c8006cccf29"}, - {file = "yarl-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8d8b7bb315588ef1d5ef92d0eea418fa9f513c8a4dfd0b594e6ddeca78a7508b"}, - {file = "yarl-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31936eca866d600f0ec14ce070b484838a9fe3ee3ec8912b76298cc8884f9078"}, - {file = "yarl-1.8.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d65aa55e9d86b24691092d85e1d2904f67707a67c8df4a8945f1f9fe0bd23a82"}, - {file = "yarl-1.8.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b54d1a434c05d4783865b98f6b31adc192775094ab4dd2bece0ba067a1396fd"}, - {file = "yarl-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd0f629ca1cf92afa66c6a3d58d82fd5751d2b890464390d956ee79d7da55e2"}, - {file = "yarl-1.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e70f87f8f0f49fba56232e6d4b9b64f87433f5f3b41d06221f462ce51531975c"}, - {file = "yarl-1.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5e7861a1cc27da656338335fd7ec0b2844ebe7c1ea03b75b21b2875a9dd0e5dc"}, - {file = "yarl-1.8.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:15a982861d07c4660e03a11f212465f0d88b87e15f4c8d7d5c5dc46a8440c9cc"}, - {file = "yarl-1.8.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7e0311c7a42fd6ffc0dfbfe688f6fe58359065a7ef8a2d952a5cb1aefde6a31b"}, - {file = "yarl-1.8.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:c92a10e4684aa6c5e545f07164b8f92a189f369dccd3ebd68a280903eb9e9e7c"}, - {file = "yarl-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53aeb54d5d6e423f526498e2086796eb28989fb774433e17ce81f9e5aef0d9ae"}, - {file = "yarl-1.8.0-cp310-cp310-win32.whl", hash = "sha256:cd3c01c1c57cd3b77ed635aa2589beccc265ddc67d8600f0474dd0b5f9306b90"}, - {file = "yarl-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:c50f6f5ee11244179428825daf89dc58bc3b0620385ce1812052f903fdd6ba64"}, - {file = "yarl-1.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0602496cddf713a6912e488a7d9adf41b6b6c037a0bc134efe036c3ac32c76c8"}, - {file = "yarl-1.8.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04e7bf550c829c0938e85f8890d67009cd3e01a932df95784825e2f6ca7fa9c7"}, - {file = "yarl-1.8.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71420b1161617cd1ccbbbbb06db3b33e21a3771394f078d1416eb19d79e4c416"}, - {file = "yarl-1.8.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94c40a9f9b9fb3a7c51b62dce35b35770cfd14325032e9b272d702268a06319c"}, - {file = "yarl-1.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8bea1803054f8ff0f67d1cb935310228aaa29248d2690880577536c42c11c50"}, - {file = "yarl-1.8.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f7fd3ec57065521236e3a8eb094d77480e85022bed8b5bed0d7cf613842012a"}, - {file = "yarl-1.8.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:785e71a55363dfc505cea8681cb9f35994156cf34742e136721d9d988febdc57"}, - {file = "yarl-1.8.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c41af1770f7f24637dd0fadc22e2f0398d3e6ebe25cfe3068ac0b942ab5eaa05"}, - {file = "yarl-1.8.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:d846b34b14cc27e6f22a5e0fc4ad21f4b03f351286e0bef31d3fa872e218bedb"}, - {file = "yarl-1.8.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:b50fa656491ecf957de375749f2e7f1c69ed6cd540b03d437f58f74dfdcc9b30"}, - {file = "yarl-1.8.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2ff9a28884b551bd104a9f3bdeb48961f0df7fc74fca58d3493a679aabf6b8ef"}, - {file = "yarl-1.8.0-cp37-cp37m-win32.whl", hash = "sha256:b8658ed44af257358178378e921a11a6a1f4b54806118a9213d67e8f842f8b40"}, - {file = "yarl-1.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ba723d989185640bfd948116c0cf9f5f0c7b6f5c94a1d15d48c4870974ef6e9d"}, - {file = "yarl-1.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6aa89cbc2b435481b41478204fa79addc9abef76ea887c7500ddf391e18e3871"}, - {file = "yarl-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e311415a34126d56e4efabd78f18128457a816a09e084523b77162a7af1885a6"}, - {file = "yarl-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d5fd25d3bee3b900b1194d6a649f39eb5527302156ee02b83176527d02eca1fc"}, - {file = "yarl-1.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5637c50ceef5b06420b002048f67d487573c517c9aa5ccf2aec12f6c836a2f92"}, - {file = "yarl-1.8.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53488178c22aea9acdde278277fe0ce310fd705b10fb35b8c3d5d5aad9e33af7"}, - {file = "yarl-1.8.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b48fe07c58e45a2ed4ca7b93fdfa59f79b637a1d9867fae5f022a83abe86d48"}, - {file = "yarl-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:538b4b5a41b7c96c735406dd7518dfa3166e6a37b9ef2543a320b7e94b6d7a12"}, - {file = "yarl-1.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6bc788161d6358b055a9f1439ba18c27fb5ad416c7297f7308b8aacfd894d89"}, - {file = "yarl-1.8.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:35a7a8bb7af9c4ae54285e0473fba5aa8b7b737b5bcf57032bf4a50b74f9afc2"}, - {file = "yarl-1.8.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:21bc84c8bba3bccc5aaac6ea155933c5d7960e805151e15137f6c7a0c528cb03"}, - {file = "yarl-1.8.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8abe9e25efbb67028c764061758e9dc83d6b0193a884e1b278a512f8413deac6"}, - {file = "yarl-1.8.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:8cdef68334fcd0ba3d5e81c5c3ebdbc215a2b7fef06e117a7b694ad0709f5916"}, - {file = "yarl-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a2ccefbee8ec1e4df73248713f6d9c9f9832466305036675da1819ac0ee1233d"}, - {file = "yarl-1.8.0-cp38-cp38-win32.whl", hash = "sha256:3ce3b9efc17562040d30d4776d80453bc4a50a4dd884c83cbf257a05888b8a11"}, - {file = "yarl-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e9016af1eb7f02568690c500535187ffaf56878ed6396c6b1d4316ab10829ecf"}, - {file = "yarl-1.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:47cc3cc1c9cd7ff9a322157b0e1d5849158996fcfa1a715134dfaa7ea297fd20"}, - {file = "yarl-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:945d50d7cb79099a4f423bf8c5d81add00dcb0002e505e2009fd314894fe12f2"}, - {file = "yarl-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a11235bf975a369a77bdc1daf34acfd4239ef3d20e474ec5b638ca4d992f0219"}, - {file = "yarl-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebc8e626fb1b8ee078ec12b8e7f9c78549e34cf4c2c6e56e027a29c501458c81"}, - {file = "yarl-1.8.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be86c3ea85b2d48e5885a2310a1363591d95bf0554a36a06f881109fdf3f351a"}, - {file = "yarl-1.8.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91ea2bbf9efa9651e132a888b65eadbd291fac2e2e8031632e1da1b51a6d3fd8"}, - {file = "yarl-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84a3ea22a9097994ea2cc61b0b62d9b204a3c09067bdf1499d60e1130e175d7a"}, - {file = "yarl-1.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4085a5f8cda7a36870d4ecaec76818f8ab4c8140fdbc6df21bc29e254c3fae79"}, - {file = "yarl-1.8.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:805f22865d04b0de1aa52e3c327d49bcb76e34c73637fc9546d69d5bdc096a41"}, - {file = "yarl-1.8.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:45ae1e36906007c1be5fb9b1fff2c80a719496c026b970443839e93656111f38"}, - {file = "yarl-1.8.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:dda8df8a510465c7ee997b358c874194921c0c0cc5bf5e31c83d7cecd66af3cf"}, - {file = "yarl-1.8.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:27272989b83a0b4226fb3c8e9e7a88732d4abb73bed1591702ddd68f1561a49a"}, - {file = "yarl-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:eb921dcb4bd91af9ea237dc0c802c948c182780564764fb9320742fd9db07248"}, - {file = "yarl-1.8.0-cp39-cp39-win32.whl", hash = "sha256:60726e212921491555bad6aa69d0f25141b8c0acda6b47cc3fa619b1d2db09f8"}, - {file = "yarl-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:fa588d5740c3419fd484be34697360001020d48095e6c0504f613046a35a4941"}, - {file = "yarl-1.8.0.tar.gz", hash = "sha256:8e4c9beebb829d244d315cbe1575022d33652fc7b02105c40d8188cb63135077"}, -] -yrouter = [ - {file = "yrouter-1.1.0-py3-none-any.whl", hash = "sha256:c79bc9bcf2fb1a946f3c55227df45301410d07585715ffce4dfac8a9e90ac69d"}, - {file = "yrouter-1.1.0.tar.gz", hash = "sha256:61cc78fa4590734f0eb3b66a45355b3091736ecf50551a1d534cef5806fed2a7"}, + {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:abc06b97407868ef38f3d172762f4069323de52f2b70d133d096a48d72215d28"}, + {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:07b21e274de4c637f3e3b7104694e53260b5fc10d51fb3ec5fed1da8e0f754e3"}, + {file = "yarl-1.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9de955d98e02fab288c7718662afb33aab64212ecb368c5dc866d9a57bf48880"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ec362167e2c9fd178f82f252b6d97669d7245695dc057ee182118042026da40"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20df6ff4089bc86e4a66e3b1380460f864df3dd9dccaf88d6b3385d24405893b"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5999c4662631cb798496535afbd837a102859568adc67d75d2045e31ec3ac497"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed19b74e81b10b592084a5ad1e70f845f0aacb57577018d31de064e71ffa267a"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e4808f996ca39a6463f45182e2af2fae55e2560be586d447ce8016f389f626f"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2d800b9c2eaf0684c08be5f50e52bfa2aa920e7163c2ea43f4f431e829b4f0fd"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6628d750041550c5d9da50bb40b5cf28a2e63b9388bac10fedd4f19236ef4957"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f5af52738e225fcc526ae64071b7e5342abe03f42e0e8918227b38c9aa711e28"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:76577f13333b4fe345c3704811ac7509b31499132ff0181f25ee26619de2c843"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0c03f456522d1ec815893d85fccb5def01ffaa74c1b16ff30f8aaa03eb21e453"}, + {file = "yarl-1.8.1-cp310-cp310-win32.whl", hash = "sha256:ea30a42dc94d42f2ba4d0f7c0ffb4f4f9baa1b23045910c0c32df9c9902cb272"}, + {file = "yarl-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:9130ddf1ae9978abe63808b6b60a897e41fccb834408cde79522feb37fb72fb0"}, + {file = "yarl-1.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0ab5a138211c1c366404d912824bdcf5545ccba5b3ff52c42c4af4cbdc2c5035"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0fb2cb4204ddb456a8e32381f9a90000429489a25f64e817e6ff94879d432fc"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85cba594433915d5c9a0d14b24cfba0339f57a2fff203a5d4fd070e593307d0b"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca7e596c55bd675432b11320b4eacc62310c2145d6801a1f8e9ad160685a231"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f77539733e0ec2475ddcd4e26777d08996f8cd55d2aef82ec4d3896687abda"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29e256649f42771829974e742061c3501cc50cf16e63f91ed8d1bf98242e5507"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7fce6cbc6c170ede0221cc8c91b285f7f3c8b9fe28283b51885ff621bbe0f8ee"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:59ddd85a1214862ce7c7c66457f05543b6a275b70a65de366030d56159a979f0"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:12768232751689c1a89b0376a96a32bc7633c08da45ad985d0c49ede691f5c0d"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:b19255dde4b4f4c32e012038f2c169bb72e7f081552bea4641cab4d88bc409dd"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6c8148e0b52bf9535c40c48faebb00cb294ee577ca069d21bd5c48d302a83780"}, + {file = "yarl-1.8.1-cp37-cp37m-win32.whl", hash = "sha256:de839c3a1826a909fdbfe05f6fe2167c4ab033f1133757b5936efe2f84904c07"}, + {file = "yarl-1.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:dd032e8422a52e5a4860e062eb84ac94ea08861d334a4bcaf142a63ce8ad4802"}, + {file = "yarl-1.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:19cd801d6f983918a3f3a39f3a45b553c015c5aac92ccd1fac619bd74beece4a"}, + {file = "yarl-1.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6347f1a58e658b97b0a0d1ff7658a03cb79bdbda0331603bed24dd7054a6dea1"}, + {file = "yarl-1.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c0da7e44d0c9108d8b98469338705e07f4bb7dab96dbd8fa4e91b337db42548"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5587bba41399854703212b87071c6d8638fa6e61656385875f8c6dff92b2e461"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31a9a04ecccd6b03e2b0e12e82131f1488dea5555a13a4d32f064e22a6003cfe"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:205904cffd69ae972a1707a1bd3ea7cded594b1d773a0ce66714edf17833cdae"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea513a25976d21733bff523e0ca836ef1679630ef4ad22d46987d04b372d57fc"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0b51530877d3ad7a8d47b2fff0c8df3b8f3b8deddf057379ba50b13df2a5eae"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2b8f245dad9e331540c350285910b20dd913dc86d4ee410c11d48523c4fd546"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ab2a60d57ca88e1d4ca34a10e9fb4ab2ac5ad315543351de3a612bbb0560bead"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:449c957ffc6bc2309e1fbe67ab7d2c1efca89d3f4912baeb8ead207bb3cc1cd4"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a165442348c211b5dea67c0206fc61366212d7082ba8118c8c5c1c853ea4d82e"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b3ded839a5c5608eec8b6f9ae9a62cb22cd037ea97c627f38ae0841a48f09eae"}, + {file = "yarl-1.8.1-cp38-cp38-win32.whl", hash = "sha256:c1445a0c562ed561d06d8cbc5c8916c6008a31c60bc3655cdd2de1d3bf5174a0"}, + {file = "yarl-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:56c11efb0a89700987d05597b08a1efcd78d74c52febe530126785e1b1a285f4"}, + {file = "yarl-1.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e80ed5a9939ceb6fda42811542f31c8602be336b1fb977bccb012e83da7e4936"}, + {file = "yarl-1.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6afb336e23a793cd3b6476c30f030a0d4c7539cd81649683b5e0c1b0ab0bf350"}, + {file = "yarl-1.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c322cbaa4ed78a8aac89b2174a6df398faf50e5fc12c4c191c40c59d5e28357"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fae37373155f5ef9b403ab48af5136ae9851151f7aacd9926251ab26b953118b"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5395da939ffa959974577eff2cbfc24b004a2fb6c346918f39966a5786874e54"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:076eede537ab978b605f41db79a56cad2e7efeea2aa6e0fa8f05a26c24a034fb"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d1a50e461615747dd93c099f297c1994d472b0f4d2db8a64e55b1edf704ec1c"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7de89c8456525650ffa2bb56a3eee6af891e98f498babd43ae307bd42dca98f6"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a88510731cd8d4befaba5fbd734a7dd914de5ab8132a5b3dde0bbd6c9476c64"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2d93a049d29df172f48bcb09acf9226318e712ce67374f893b460b42cc1380ae"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:21ac44b763e0eec15746a3d440f5e09ad2ecc8b5f6dcd3ea8cb4773d6d4703e3"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d0272228fabe78ce00a3365ffffd6f643f57a91043e119c289aaba202f4095b0"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99449cd5366fe4608e7226c6cae80873296dfa0cde45d9b498fefa1de315a09e"}, + {file = "yarl-1.8.1-cp39-cp39-win32.whl", hash = "sha256:8b0af1cf36b93cee99a31a545fe91d08223e64390c5ecc5e94c39511832a4bb6"}, + {file = "yarl-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:de49d77e968de6626ba7ef4472323f9d2e5a56c1d85b7c0e2a190b2173d3b9be"}, + {file = "yarl-1.8.1.tar.gz", hash = "sha256:af887845b8c2e060eb5605ff72b6f2dd2aab7a761379373fd89d314f4752abbf"}, ] diff --git a/kilroy_face_twitter/pyproject.toml b/kilroy_face_twitter/pyproject.toml index 5ae38f9..6e8e248 100644 --- a/kilroy_face_twitter/pyproject.toml +++ b/kilroy_face_twitter/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "kilroy-face-twitter" -version = "0.2.1" +version = "0.2.2" description = "kilroy face for Twitter 🐦" readme = "README.md" authors = ["kilroy "] @@ -12,10 +12,12 @@ documentation = "https://kilroybot.github.io/kilroy-face-twitter" [tool.poetry.dependencies] python = "^3.9" typer = { version = "^0.6", extras = ["all"] } -kilroy-face-server-py-sdk = "^0.5" +kilroy-face-server-py-sdk = "~0.6" tweepy = { version = "^4.10", extras = ["async"] } -asyncstdlib = "^3.10" httpx = "^0.23" +aiostream = "^0.4" +PyYAML = "^6.0" +deepmerge = "^1.0" # dev diff --git a/kilroy_face_twitter/src/kilroy_face_twitter/__main__.py b/kilroy_face_twitter/src/kilroy_face_twitter/__main__.py index 7a8d811..cb41d59 100644 --- a/kilroy_face_twitter/src/kilroy_face_twitter/__main__.py +++ b/kilroy_face_twitter/src/kilroy_face_twitter/__main__.py @@ -5,13 +5,16 @@ """ import asyncio import logging +from asyncio import FIRST_EXCEPTION from enum import Enum from logging import Logger +from typing import Dict, Optional import typer from kilroy_face_server_py_sdk import FaceServer +from typer import FileText -from kilroy_face_twitter.config import FaceConfig, ServerConfig +from kilroy_face_twitter.config import get_config from kilroy_face_twitter.face import TwitterFace cli = typer.Typer() # this is actually callable and thus can be an entry point @@ -32,27 +35,48 @@ def get_logger(verbosity: Verbosity) -> Logger: return logger -async def run( - face_config: FaceConfig, server_config: ServerConfig, logger: Logger -) -> None: - face = await TwitterFace.build(face_config) +async def run(config: Dict, logger: Logger) -> None: + face = await TwitterFace.build(**config.get("face", {})) server = FaceServer(face, logger) - await server.run(**server_config.dict()) + + tasks = ( + asyncio.create_task(face.init()), + asyncio.create_task(server.run(**config.get("server", {}))), + ) + + try: + done, pending = await asyncio.wait(tasks, return_when=FIRST_EXCEPTION) + except asyncio.CancelledError: + done, pending = [], tasks + + for task in pending: + task.cancel() + try: + await task + except asyncio.CancelledError: + pass + + for task in done: + task.result() + + await face.cleanup() @cli.command() def main( + config: Optional[FileText] = typer.Option( + default=None, help="Configuration file" + ), verbosity: Verbosity = typer.Option( default="INFO", help="Verbosity level." - ) + ), ) -> None: """Command line interface for kilroy-face-twitter.""" - face_config = FaceConfig.build() - server_config = ServerConfig.build() + config = get_config(config) logger = get_logger(verbosity) - asyncio.run(run(face_config, server_config, logger)) + asyncio.run(run(config, logger)) if __name__ == "__main__": diff --git a/kilroy_face_twitter/src/kilroy_face_twitter/config.py b/kilroy_face_twitter/src/kilroy_face_twitter/config.py index 7de8946..e29deaf 100644 --- a/kilroy_face_twitter/src/kilroy_face_twitter/config.py +++ b/kilroy_face_twitter/src/kilroy_face_twitter/config.py @@ -1,66 +1,31 @@ -import os -from typing import Any, Dict +from copy import deepcopy +from typing import Any, Dict, Optional, TextIO -from pydantic import BaseModel +import yaml +from deepmerge import Merger +from kilroy_face_twitter import resource_text -class FaceConfig(BaseModel): - consumer_key: str - consumer_secret: str - access_token: str - access_token_secret: str - post_type: str - processors_params: Dict[str, Dict[str, Any]] = {} - default_scoring_type: str - scorers_params: Dict[str, Dict[str, Any]] = {} - default_scraping_type: str - scrapers_params: Dict[str, Dict[str, Any]] = {} +_DEFAULT_MERGER = Merger( + [(list, ["override"]), (dict, ["merge"]), (set, ["override"])], + ["override"], + ["override"], +) - @classmethod - def build(cls, **kwargs) -> "FaceConfig": - return cls( - consumer_key=kwargs.get( - "consumer_key", os.getenv("KILROY_FACE_TWITTER_CONSUMER_KEY") - ), - consumer_secret=kwargs.get( - "consumer_secret", - os.getenv("KILROY_FACE_TWITTER_CONSUMER_SECRET"), - ), - access_token=kwargs.get( - "access_token", os.getenv("KILROY_FACE_TWITTER_ACCESS_TOKEN") - ), - access_token_secret=kwargs.get( - "access_token_secret", - os.getenv("KILROY_FACE_TWITTER_ACCESS_TOKEN_SECRET"), - ), - post_type=kwargs.get( - "post_type", - os.getenv("KILROY_FACE_TWITTER_POST_TYPE", "text-or-image"), - ), - default_scoring_type=kwargs.get( - "scoring_type", - os.getenv("KILROY_FACE_TWITTER_DEFAULT_SCORING_TYPE", "likes"), - ), - default_scraping_type=kwargs.get( - "scraping_type", - os.getenv( - "KILROY_FACE_TWITTER_DEFAULT_SCRAPING_TYPE", "timeline" - ), - ), - ) +def _merge_configs( + default_config: Dict[str, Any], + user_config: Dict[str, any], + merger: Merger = _DEFAULT_MERGER, + **kwargs, +) -> Dict[str, Any]: + config = deepcopy(default_config) + merger.merge(config, user_config) + merger.merge(config, kwargs) + return config -class ServerConfig(BaseModel): - host: str - port: int - @classmethod - def build(cls, **kwargs) -> "ServerConfig": - return cls( - host=kwargs.get( - "host", os.getenv("KILROY_FACE_TWITTER_HOST", "localhost") - ), - port=kwargs.get( - "port", os.getenv("KILROY_FACE_TWITTER_PORT", 10001) - ), - ) +def get_config(f: Optional[TextIO] = None, **kwargs) -> Dict[str, Any]: + config = yaml.safe_load(resource_text("config.yaml")) + user_config = yaml.safe_load(f) if f else {} + return _merge_configs(config, user_config, **kwargs) diff --git a/kilroy_face_twitter/src/kilroy_face_twitter/face.py b/kilroy_face_twitter/src/kilroy_face_twitter/face.py index cd84ec1..0fbb8e4 100644 --- a/kilroy_face_twitter/src/kilroy_face_twitter/face.py +++ b/kilroy_face_twitter/src/kilroy_face_twitter/face.py @@ -1,212 +1,169 @@ from dataclasses import dataclass from datetime import datetime from typing import ( + Any, AsyncIterable, Dict, - Iterable, Optional, + Set, Tuple, ) from uuid import UUID -from asyncstdlib import islice +from aiostream import stream from kilroy_face_server_py_sdk import ( - BaseState, + CategorizableBasedParameter, + Configurable, Face, - JSON, JSONSchema, + Metadata, Parameter, + SerializableModel, + classproperty, ) from tweepy import Tweet from kilroy_face_twitter.client import TwitterClient -from kilroy_face_twitter.config import FaceConfig from kilroy_face_twitter.models import TweetFields, TweetIncludes -from kilroy_face_twitter.processors import Processor +from kilroy_face_twitter.processors import ( + Processor, +) from kilroy_face_twitter.scorers import Scorer from kilroy_face_twitter.scrapers import Scraper -@dataclass -class TwitterFaceState(BaseState): - processor: Processor +class TwitterFaceParams(SerializableModel): + consumer_key: str + consumer_secret: str + access_token: str + access_token_secret: str + post_type: str scoring_type: str - scorers: Dict[str, Scorer] + scorers_params: Dict[str, Dict[str, Any]] = {} scraping_type: str - scrapers: Dict[str, Scraper] - client: TwitterClient - - @property - def scorer(self) -> Scorer: - return self.scorers[self.scoring_type] - - @property - def scraper(self) -> Scraper: - return self.scrapers[self.scraping_type] - - -class ProcessorParameter(Parameter[TwitterFaceState, JSON]): - async def _get(self, state: TwitterFaceState) -> JSON: - return await state.processor.config.get() - - async def _set(self, state: TwitterFaceState, value: JSON) -> None: - await state.processor.config.set(value) + scrapers_params: Dict[str, Dict[str, Any]] = {} - async def name(self, state: TwitterFaceState) -> str: - return "processor" - - async def schema(self, state: TwitterFaceState) -> JSON: - return { - "type": "object", - "properties": await state.processor.config.get_properties_schema(), - } +@dataclass +class TwitterFaceState: + processor: Processor + scorer: Scorer + scorers_params: Dict[str, Dict[str, Any]] + scraper: Scraper + scrapers_params: Dict[str, Dict[str, Any]] + client: TwitterClient -class ScorerParameter(Parameter[TwitterFaceState, JSON]): - async def _get(self, state: TwitterFaceState) -> JSON: - return { - "type": state.scoring_type, - "config": await state.scorer.config.get(), - } - async def _set(self, state: TwitterFaceState, value: JSON) -> None: - state.scoring_type = value["type"] - await state.scorer.config.set(value["config"]) +class ScorerParameter(CategorizableBasedParameter[TwitterFaceState, Scorer]): + async def _get_params( + self, state: TwitterFaceState, category: str + ) -> Dict[str, Any]: + return {**state.scorers_params.get(category, {})} - async def name(self, state: TwitterFaceState) -> str: - return "scorer" - async def schema(self, state: TwitterFaceState) -> JSON: - return { - "type": "object", - "oneOf": [ - { - "type": "object", - "properties": { - "type": { - "type": "string", - "const": scoring_type, - }, - "config": { - "type": "object", - "properties": await state.scorers[ - scoring_type - ].config.get_properties_schema(), - }, - }, - } - for scoring_type in Scorer.all_categories() - ], - } +class ScraperParameter(CategorizableBasedParameter[TwitterFaceState, Scraper]): + async def _get_params( + self, state: TwitterFaceState, category: str + ) -> Dict[str, Any]: + return {**state.scrapers_params.get(category, {})} -class ScraperParameter(Parameter[TwitterFaceState, JSON]): - async def _get(self, state: TwitterFaceState) -> JSON: - return { - "type": state.scraping_type, - "config": await state.scraper.config.get(), - } - - async def _set(self, state: TwitterFaceState, value: JSON) -> None: - state.scraping_type = value["type"] - await state.scraper.config.set(value["config"]) +class TwitterFace(Face[TwitterFaceState]): + @property + def metadata(self) -> Metadata: + return Metadata( + key="kilroy-face-twitter", description="Kilroy face for Twitter" + ) - async def name(self, state: TwitterFaceState) -> str: - return "scraper" + @property + def post_schema(self) -> JSONSchema: + params = TwitterFaceParams(**self._kwargs) + return Processor.for_category(params.post_type).post_schema - async def schema(self, state: TwitterFaceState) -> JSON: + @classproperty + def parameters(cls) -> Set[Parameter]: return { - "type": "object", - "oneOf": [ - { - "type": "object", - "properties": { - "type": { - "type": "string", - "const": scraping_type, - }, - "config": { - "type": "object", - "properties": await state.scrapers[ - scraping_type - ].config.get_properties_schema(), - }, - }, - } - for scraping_type in Scraper.all_categories() - ], + ScorerParameter(), + ScraperParameter(), } + @classmethod + async def _build_processor(cls, params: TwitterFaceParams) -> Processor: + return Processor.for_category(params.post_type)() + + @staticmethod + async def _build_scorer(params: TwitterFaceParams) -> Scorer: + scorer_cls = Scorer.for_category(params.scoring_type) + scorer_params = params.scorers_params.get(params.scoring_type, {}) + if issubclass(scorer_cls, Configurable): + scorer = await scorer_cls.build(**scorer_params) + await scorer.init() + else: + scorer = scorer_cls(**scorer_params) + return scorer + + @staticmethod + async def _build_scraper(params: TwitterFaceParams) -> Scraper: + scraper_cls = Scraper.for_category(params.scraping_type) + scraper_params = params.scrapers_params.get(params.scraping_type, {}) + if issubclass(scraper_cls, Configurable): + scraper = await scraper_cls.build(**scraper_params) + await scraper.init() + else: + scraper = scraper_cls(**scraper_params) + return scraper + + @staticmethod + async def _build_client(params: TwitterFaceParams) -> TwitterClient: + return TwitterClient( + params.consumer_key, + params.consumer_secret, + params.access_token, + params.access_token_secret, + ) -class TwitterFace(Face[TwitterFaceState]): - def __init__(self, config: FaceConfig) -> None: - super().__init__() - self._face_config = config - - async def _create_initial_state(self) -> TwitterFaceState: + async def build_default_state(self) -> TwitterFaceState: + params = TwitterFaceParams(**self._kwargs) return TwitterFaceState( - processor=await Processor.for_category( - self._face_config.post_type - ).build( - **self._face_config.processors_params.get( - self._face_config.post_type, {} - ) - ), - scoring_type=self._face_config.default_scoring_type, - scorers={ - scoring_type: await Scorer.for_category(scoring_type).build( - **self._face_config.scorers_params.get(scoring_type, {}) - ) - for scoring_type in Scorer.all_categories() - }, - scraping_type=self._face_config.default_scraping_type, - scrapers={ - scraping_type: await Scraper.for_category(scraping_type).build( - **self._face_config.scrapers_params.get(scraping_type, {}) - ) - for scraping_type in Scraper.all_categories() - }, - client=TwitterClient( - consumer_key=self._face_config.consumer_key, - consumer_secret=self._face_config.consumer_secret, - access_token=self._face_config.access_token, - access_token_secret=self._face_config.access_token_secret, - ), + processor=await self._build_processor(params), + scorer=await self._build_scorer(params), + scorers_params=params.scorers_params, + scraper=await self._build_scraper(params), + scrapers_params=params.scrapers_params, + client=await self._build_client(params), ) - @property - def post_schema(self) -> JSONSchema: - return self.state.processor.post_schema() + async def cleanup(self) -> None: + pass - async def _get_parameters(self) -> Iterable[Parameter]: - return [ProcessorParameter(), ScorerParameter(), ScraperParameter()] - - async def post(self, post: JSON) -> UUID: - return await self.state.processor.post(self.state.client, post) + async def post(self, post: Dict[str, Any]) -> UUID: + async with self.state.read_lock() as state: + return await state.processor.post(state.client, post) async def score(self, post_id: UUID) -> float: - response = await self.state.client.v2.get_tweet( - post_id.int, - user_auth=True, - **self.state.scorer.needed_fields().to_kwargs(), - ) - tweet = response.data - includes = TweetIncludes.from_response(response) - return await self.state.scorer.score( - self.state.client, tweet, includes - ) + async with self.state.read_lock() as state: + response = await state.client.v2.get_tweet( + post_id.int, + user_auth=True, + **state.scorer.needed_fields.to_kwargs(), + ) + tweet = response.data + includes = TweetIncludes.from_response(response) + return await state.scorer.score(state.client, tweet, includes) async def scrap( self, limit: Optional[int] = None, before: Optional[datetime] = None, after: Optional[datetime] = None, - ) -> AsyncIterable[Tuple[UUID, JSON]]: + ) -> AsyncIterable[Tuple[UUID, Dict[str, Any]]]: + state = await self.state.value.fetch() + async def fetch( client: TwitterClient, twts: AsyncIterable[Tuple[Tweet, TweetIncludes]], processor: Processor, - ) -> AsyncIterable[Tuple[UUID, JSON]]: + ) -> AsyncIterable[Tuple[UUID, Dict[str, Any]]]: async for tweet, includes in twts: uuid = UUID(int=tweet.id) try: @@ -215,19 +172,16 @@ async def fetch( continue yield uuid, post - fields = self.state.processor.needed_fields() + TweetFields( - tweet_fields=["id"] - ) + fields = state.processor.needed_fields + fields = fields + TweetFields(tweet_fields=["id"]) - tweets = self.state.scraper.scrap( - self.state.client, - fields, - before, - after, - ) - posts = islice( - fetch(self.state.client, tweets, self.state.processor), limit - ) + tweets = state.scraper.scrap(state.client, fields, before, after) + posts = fetch(state.client, tweets, state.processor) + if limit is not None: + posts = stream.take(posts, limit) + else: + posts = stream.iterate(posts) - async for post_id, post in posts: - yield post_id, post + async with posts.stream() as streamer: + async for post_id, post in streamer: + yield post_id, post diff --git a/kilroy_face_twitter/src/kilroy_face_twitter/processors.py b/kilroy_face_twitter/src/kilroy_face_twitter/processors.py index 2292b78..6d859b1 100644 --- a/kilroy_face_twitter/src/kilroy_face_twitter/processors.py +++ b/kilroy_face_twitter/src/kilroy_face_twitter/processors.py @@ -1,21 +1,15 @@ import json from abc import ABC, abstractmethod -from dataclasses import dataclass from io import BytesIO -from typing import Generic, Iterable, Optional +from typing import Any, Dict, Optional from uuid import UUID from kilroy_face_server_py_sdk import ( - BasePostModel, - BaseState, Categorizable, - ConfigurableWithLoadableState, ImageData, ImageOnlyPost, ImageWithOptionalTextPost, JSONSchema, - Parameter, - StateType, TextAndImagePost, TextData, TextOnlyPost, @@ -23,14 +17,14 @@ TextWithOptionalImagePost, base64_decode, base64_encode, - get_filename_from_url, - JSON, + classproperty, + normalize, ) from tweepy import Media, Tweet from kilroy_face_twitter.client import TwitterClient from kilroy_face_twitter.models import TweetFields, TweetIncludes -from kilroy_face_twitter.utils import download_image +from kilroy_face_twitter.utils import download_image, get_filename_from_url TEXT_FIELDS = TweetFields(tweet_fields=["text"]) IMAGE_FIELDS = TweetFields( @@ -51,10 +45,6 @@ async def create_tweet(client: TwitterClient, *args, **kwargs) -> UUID: return UUID(int=Tweet(response.data).id) -def to_json(post: BasePostModel) -> JSON: - return json.loads(post.json()) - - async def get_text_data(tweet: Tweet) -> Optional[TextData]: if not tweet.text: return @@ -81,137 +71,95 @@ async def get_image_data( ) -class Processor( - ConfigurableWithLoadableState[StateType], - Categorizable, - Generic[StateType], - ABC, -): +class Processor(Categorizable, ABC): + @classproperty + def category(cls) -> str: + name: str = cls.__name__ + return normalize(name.removesuffix("Processor")) + @abstractmethod - async def post(self, client: TwitterClient, post: JSON) -> UUID: + async def post(self, client: TwitterClient, post: Dict[str, Any]) -> UUID: pass @abstractmethod async def convert( self, client: TwitterClient, tweet: Tweet, includes: TweetIncludes - ) -> JSON: + ) -> Dict[str, Any]: pass - @staticmethod + @classproperty @abstractmethod - def needed_fields() -> TweetFields: + def needed_fields(cls) -> TweetFields: pass - @staticmethod + @classproperty @abstractmethod - def post_schema() -> JSONSchema: + def post_schema(cls) -> JSONSchema: pass # Text only -@dataclass -class TextOnlyProcessorState(BaseState): - pass - +class TextOnlyProcessor(Processor): + @classproperty + def post_schema(cls) -> JSONSchema: + return JSONSchema(**TextOnlyPost.schema()) -class TextOnlyProcessor(Processor[TextOnlyProcessorState]): - @classmethod - def category(cls) -> str: - return "text" - - @staticmethod - def post_schema() -> JSONSchema: - return JSONSchema(TextOnlyPost.schema()) - - @staticmethod - def needed_fields() -> TweetFields: + @classproperty + def needed_fields(cls) -> TweetFields: return TEXT_FIELDS - async def _create_initial_state(self) -> TextOnlyProcessorState: - return TextOnlyProcessorState() - - async def post(self, client: TwitterClient, post: JSON) -> UUID: + async def post(self, client: TwitterClient, post: Dict[str, Any]) -> UUID: post = TextOnlyPost.parse_obj(post) return await create_tweet(client, text=post.text.content) async def convert( self, client: TwitterClient, tweet: Tweet, includes: TweetIncludes - ) -> JSON: + ) -> Dict[str, Any]: text = await get_text_data(tweet) post = TextOnlyPost(text=text) - return to_json(post) - - async def _get_parameters(self) -> Iterable[Parameter]: - return [] + return json.loads(post.json()) # Image only -@dataclass -class ImageOnlyProcessorState(BaseState): - pass +class ImageOnlyProcessor(Processor): + @classproperty + def post_schema(cls) -> JSONSchema: + return JSONSchema(**ImageOnlyPost.schema()) - -class ImageOnlyProcessor(Processor[ImageOnlyProcessorState]): - @classmethod - def category(cls) -> str: - return "image" - - @staticmethod - def post_schema() -> JSONSchema: - return JSONSchema(ImageOnlyPost.schema()) - - @staticmethod - def needed_fields() -> TweetFields: + @classproperty + def needed_fields(cls) -> TweetFields: return IMAGE_FIELDS - async def _create_initial_state(self) -> ImageOnlyProcessorState: - return ImageOnlyProcessorState() - - async def post(self, client: TwitterClient, post: JSON) -> UUID: + async def post(self, client: TwitterClient, post: Dict[str, Any]) -> UUID: post = ImageOnlyPost.parse_obj(post) media = await upload_image(client, post.image) return await create_tweet(client, media_ids=[media.media_id]) async def convert( self, client: TwitterClient, tweet: Tweet, includes: TweetIncludes - ) -> JSON: + ) -> Dict[str, Any]: image = await get_image_data(tweet, includes) post = ImageOnlyPost(image=image) - return to_json(post) - - async def _get_parameters(self) -> Iterable[Parameter]: - return [] + return json.loads(post.json()) # Text and image -@dataclass -class TextAndImageProcessorState(BaseState): - pass - - -class TextAndImageProcessor(Processor[TextAndImageProcessorState]): - @classmethod - def category(cls) -> str: - return "text-and-image" - - @staticmethod - def post_schema() -> JSONSchema: - return JSONSchema(TextAndImagePost.schema()) +class TextAndImageProcessor(Processor): + @classproperty + def post_schema(cls) -> JSONSchema: + return JSONSchema(**TextAndImagePost.schema()) - @staticmethod - def needed_fields() -> TweetFields: + @classproperty + def needed_fields(cls) -> TweetFields: return TEXT_FIELDS + IMAGE_FIELDS - async def _create_initial_state(self) -> TextAndImageProcessorState: - return TextAndImageProcessorState() - - async def post(self, client: TwitterClient, post: JSON) -> UUID: + async def post(self, client: TwitterClient, post: Dict[str, Any]) -> UUID: post = TextAndImagePost.parse_obj(post) media = await upload_image(client, post.image) return await create_tweet( @@ -220,41 +168,26 @@ async def post(self, client: TwitterClient, post: JSON) -> UUID: async def convert( self, client: TwitterClient, tweet: Tweet, includes: TweetIncludes - ) -> JSON: + ) -> Dict[str, Any]: text = await get_text_data(tweet) image = await get_image_data(tweet, includes) post = TextAndImagePost(text=text, image=image) - return to_json(post) - - async def _get_parameters(self) -> Iterable[Parameter]: - return [] + return json.loads(post.json()) # Text or image -@dataclass -class TextOrImageProcessorState(BaseState): - pass - - -class TextOrImageProcessor(Processor[TextOrImageProcessorState]): - @classmethod - def category(cls) -> str: - return "text-or-image" - - @staticmethod - def post_schema() -> JSONSchema: - return JSONSchema(TextOrImagePost.schema()) +class TextOrImageProcessor(Processor): + @classproperty + def post_schema(cls) -> JSONSchema: + return JSONSchema(**TextOrImagePost.schema()) - @staticmethod - def needed_fields() -> TweetFields: + @classproperty + def needed_fields(cls) -> TweetFields: return TEXT_FIELDS + IMAGE_FIELDS - async def _create_initial_state(self) -> TextOrImageProcessorState: - return TextOrImageProcessorState() - - async def post(self, client: TwitterClient, post: JSON) -> UUID: + async def post(self, client: TwitterClient, post: Dict[str, Any]) -> UUID: post = TextOrImagePost.parse_obj(post) kwargs = {} if post.text is not None: @@ -266,45 +199,26 @@ async def post(self, client: TwitterClient, post: JSON) -> UUID: async def convert( self, client: TwitterClient, tweet: Tweet, includes: TweetIncludes - ) -> JSON: + ) -> Dict[str, Any]: text = await get_text_data(tweet) image = await get_image_data(tweet, includes) post = TextOrImagePost(text=text, image=image) - return to_json(post) - - async def _get_parameters(self) -> Iterable[Parameter]: - return [] + return json.loads(post.json()) # Text with optional image -@dataclass -class TextWithOptionalImageProcessorState(BaseState): - pass - - -class TextWithOptionalImageProcessor( - Processor[TextWithOptionalImageProcessorState] -): - @classmethod - def category(cls) -> str: - return "text-with-optional-image" - - @staticmethod - def post_schema() -> JSONSchema: - return JSONSchema(TextWithOptionalImagePost.schema()) +class TextWithOptionalImageProcessor(Processor): + @classproperty + def post_schema(cls) -> JSONSchema: + return JSONSchema(**TextWithOptionalImagePost.schema()) - @staticmethod - def needed_fields() -> TweetFields: + @classproperty + def needed_fields(cls) -> TweetFields: return TEXT_FIELDS + IMAGE_FIELDS - async def _create_initial_state( - self, - ) -> TextWithOptionalImageProcessorState: - return TextWithOptionalImageProcessorState() - - async def post(self, client: TwitterClient, post: JSON) -> UUID: + async def post(self, client: TwitterClient, post: Dict[str, Any]) -> UUID: post = TextWithOptionalImagePost.parse_obj(post) kwargs = {} if post.image is not None: @@ -314,45 +228,26 @@ async def post(self, client: TwitterClient, post: JSON) -> UUID: async def convert( self, client: TwitterClient, tweet: Tweet, includes: TweetIncludes - ) -> JSON: + ) -> Dict[str, Any]: text = await get_text_data(tweet) image = await get_image_data(tweet, includes) post = TextWithOptionalImagePost(text=text, image=image) - return to_json(post) - - async def _get_parameters(self) -> Iterable[Parameter]: - return [] + return json.loads(post.json()) # Image with optional text -@dataclass -class ImageWithOptionalTextProcessorState(BaseState): - pass - +class ImageWithOptionalTextProcessor(Processor): + @classproperty + def post_schema(cls) -> JSONSchema: + return JSONSchema(**ImageWithOptionalTextPost.schema()) -class ImageWithOptionalTextProcessor( - Processor[ImageWithOptionalTextProcessorState] -): - @classmethod - def category(cls) -> str: - return "image-with-optional-text" - - @staticmethod - def post_schema() -> JSONSchema: - return JSONSchema(ImageWithOptionalTextPost.schema()) - - @staticmethod - def needed_fields() -> TweetFields: + @classproperty + def needed_fields(cls) -> TweetFields: return TEXT_FIELDS + IMAGE_FIELDS - async def _create_initial_state( - self, - ) -> ImageWithOptionalTextProcessorState: - return ImageWithOptionalTextProcessorState() - - async def post(self, client: TwitterClient, post: JSON) -> UUID: + async def post(self, client: TwitterClient, post: Dict[str, Any]) -> UUID: post = ImageWithOptionalTextPost.parse_obj(post) kwargs = {} if post.text is not None: @@ -362,11 +257,8 @@ async def post(self, client: TwitterClient, post: JSON) -> UUID: async def convert( self, client: TwitterClient, tweet: Tweet, includes: TweetIncludes - ) -> JSON: + ) -> Dict[str, Any]: text = await get_text_data(tweet) image = await get_image_data(tweet, includes) post = ImageWithOptionalTextPost(text=text, image=image) - return to_json(post) - - async def _get_parameters(self) -> Iterable[Parameter]: - return [] + return json.loads(post.json()) diff --git a/kilroy_face_twitter/src/kilroy_face_twitter/resources/config.yaml b/kilroy_face_twitter/src/kilroy_face_twitter/resources/config.yaml new file mode 100644 index 0000000..deef885 --- /dev/null +++ b/kilroy_face_twitter/src/kilroy_face_twitter/resources/config.yaml @@ -0,0 +1,11 @@ +face: + consumerKey: XXXXXXXXXXXXXXXXXXXXXXXXX + consumerSecret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + accessToken: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + accessTokenSecret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + postType: textOrImage + scoringType: likes + scrapingType: timeline +server: + host: localhost + port: 10001 diff --git a/kilroy_face_twitter/src/kilroy_face_twitter/scorers.py b/kilroy_face_twitter/src/kilroy_face_twitter/scorers.py index 492c5ff..ae054b8 100644 --- a/kilroy_face_twitter/src/kilroy_face_twitter/scorers.py +++ b/kilroy_face_twitter/src/kilroy_face_twitter/scorers.py @@ -1,120 +1,67 @@ from abc import ABC, abstractmethod -from dataclasses import dataclass -from typing import Generic, Iterable - -from kilroy_face_server_py_sdk import ( - BaseState, - Categorizable, - ConfigurableWithLoadableState, - Parameter, - StateType, -) + +from kilroy_face_server_py_sdk import Categorizable, classproperty, normalize from tweepy import Tweet from kilroy_face_twitter.client import TwitterClient from kilroy_face_twitter.models import TweetFields, TweetIncludes -class Scorer( - ConfigurableWithLoadableState[StateType], - Categorizable, - Generic[StateType], - ABC, -): +class Scorer(Categorizable, ABC): + @classproperty + def category(cls) -> str: + name: str = cls.__name__ + return normalize(name.removesuffix("Scorer")) + @abstractmethod async def score( self, client: TwitterClient, tweet: Tweet, includes: TweetIncludes ) -> float: pass - @staticmethod + @classproperty @abstractmethod - def needed_fields() -> TweetFields: + def needed_fields(cls) -> TweetFields: pass # Likes -@dataclass -class LikesScorerState(BaseState): - pass - - -class LikesScorer(Scorer[LikesScorerState]): - @classmethod - def category(cls) -> str: - return "likes" - +class LikesScorer(Scorer): async def score( self, client: TwitterClient, tweet: Tweet, includes: TweetIncludes ) -> float: return tweet.public_metrics["like_count"] - @staticmethod - def needed_fields() -> TweetFields: + @classproperty + def needed_fields(cls) -> TweetFields: return TweetFields(tweet_fields=["public_metrics"]) - async def _create_initial_state(self) -> LikesScorerState: - return LikesScorerState() - - async def _get_parameters(self) -> Iterable[Parameter]: - return [] - # Retweets -@dataclass -class RetweetsScorerState(BaseState): - pass - - -class RetweetsScorer(Scorer[RetweetsScorerState]): - @classmethod - def category(cls) -> str: - return "retweets" - +class RetweetsScorer(Scorer): async def score( self, client: TwitterClient, tweet: Tweet, includes: TweetIncludes ) -> float: return tweet.public_metrics["retweet_count"] - @staticmethod - def needed_fields() -> TweetFields: + @classproperty + def needed_fields(cls) -> TweetFields: return TweetFields(tweet_fields=["public_metrics"]) - async def _create_initial_state(self) -> RetweetsScorerState: - return RetweetsScorerState() - - async def _get_parameters(self) -> Iterable[Parameter]: - return [] - # Impressions -@dataclass -class ImpressionsScorerState(BaseState): - pass - - -class ImpressionsScorer(Scorer[ImpressionsScorerState]): - @classmethod - def category(cls) -> str: - return "impressions" - +class ImpressionsScorer(Scorer): async def score( self, client: TwitterClient, tweet: Tweet, includes: TweetIncludes ) -> float: return tweet.non_public_metrics["impression_count"] - @staticmethod - def needed_fields() -> TweetFields: + @classproperty + def needed_fields(cls) -> TweetFields: return TweetFields(tweet_fields=["non_public_metrics"]) - - async def _create_initial_state(self) -> ImpressionsScorerState: - return ImpressionsScorerState() - - async def _get_parameters(self) -> Iterable[Parameter]: - return [] diff --git a/kilroy_face_twitter/src/kilroy_face_twitter/scrapers.py b/kilroy_face_twitter/src/kilroy_face_twitter/scrapers.py index c4bdeb1..f7ad646 100644 --- a/kilroy_face_twitter/src/kilroy_face_twitter/scrapers.py +++ b/kilroy_face_twitter/src/kilroy_face_twitter/scrapers.py @@ -1,27 +1,20 @@ from abc import ABC, abstractmethod -from dataclasses import dataclass from datetime import datetime -from typing import AsyncIterable, Generic, Iterable, Optional, Tuple +from typing import AsyncIterable, Optional, Tuple -from kilroy_face_server_py_sdk import ( - BaseState, - Categorizable, - ConfigurableWithLoadableState, - Parameter, - StateType, -) +from kilroy_face_server_py_sdk import Categorizable, classproperty, normalize from tweepy import Tweet from kilroy_face_twitter.client import TwitterClient from kilroy_face_twitter.models import TweetFields, TweetIncludes -class Scraper( - ConfigurableWithLoadableState[StateType], - Categorizable, - Generic[StateType], - ABC, -): +class Scraper(Categorizable, ABC): + @classproperty + def category(cls) -> str: + name: str = cls.__name__ + return normalize(name.removesuffix("Scraper")) + @abstractmethod def scrap( self, @@ -36,16 +29,7 @@ def scrap( # Timeline -@dataclass -class TimelineScraperState(BaseState): - pass - - -class TimelineScraper(Scraper[TimelineScraperState]): - @classmethod - def category(cls) -> str: - return "timeline" - +class TimelineScraper(Scraper): async def scrap( self, client: TwitterClient, @@ -81,9 +65,3 @@ async def scrap( break params["pagination_token"] = response.meta["next_token"] - - async def _create_initial_state(self) -> TimelineScraperState: - return TimelineScraperState() - - async def _get_parameters(self) -> Iterable[Parameter]: - return [] diff --git a/kilroy_face_twitter/src/kilroy_face_twitter/utils.py b/kilroy_face_twitter/src/kilroy_face_twitter/utils.py index 8e2bf49..1f3fa52 100644 --- a/kilroy_face_twitter/src/kilroy_face_twitter/utils.py +++ b/kilroy_face_twitter/src/kilroy_face_twitter/utils.py @@ -1,3 +1,6 @@ +from pathlib import Path +from urllib.parse import urlparse + import httpx @@ -5,3 +8,7 @@ async def download_image(url: str) -> bytes: async with httpx.AsyncClient() as client: response = await client.get(url) return response.content + + +def get_filename_from_url(url: str) -> str: + return Path(urlparse(url).path).name diff --git a/pyproject.toml b/pyproject.toml index fe474ae..bf27d3c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ [tool.poetry] name = "kilroy-face-twitter" -version = "0.2.1" +version = "0.2.2" description = "kilroy face for Twitter 🐦" readme = "kilroy_face_twitter/README.md" authors = ["kilroy "] @@ -16,10 +16,12 @@ packages = [{ include = "kilroy-face-twitter", from = "kilroy_face_twitter/src" [tool.poetry.dependencies] python = "^3.9" typer = { version = "^0.6", extras = ["all"] } -kilroy-face-server-py-sdk = "^0.5" +kilroy-face-server-py-sdk = "~0.6" tweepy = { version = "^4.10", extras = ["async"] } -asyncstdlib = "^3.10" httpx = "^0.23" +aiostream = "^0.4" +PyYAML = "^6.0" +deepmerge = "^1.0" # dev