From d965cc098870c838fbf38749a2a13846f2326e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= Date: Mon, 19 Dec 2022 12:37:20 +0100 Subject: [PATCH 1/8] add pre-commit dependency --- poetry.lock | 1264 ++++++++++++++++++++++++++++-------------------- pyproject.toml | 1 + 2 files changed, 729 insertions(+), 536 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7144f952..f1a88929 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] name = "appdirs" version = "1.4.4" @@ -5,6 +7,10 @@ description = "A small Python module for determining appropriate platform-specif category = "main" optional = false python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] [[package]] name = "astroid" @@ -13,6 +19,10 @@ description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false python-versions = ">=3.7.2" +files = [ + {file = "astroid-2.12.12-py3-none-any.whl", hash = "sha256:72702205200b2a638358369d90c222d74ebc376787af8fb2f7f2a86f7b5cc85f"}, + {file = "astroid-2.12.12.tar.gz", hash = "sha256:1c00a14f5a3ed0339d38d2e2e5b74ea2591df5861c0936bb292b84ccf3a78d83"}, +] [package.dependencies] lazy-object-proxy = ">=1.4.0" @@ -30,6 +40,10 @@ description = "Annotate AST trees with source code positions" category = "dev" optional = false python-versions = "*" +files = [ + {file = "asttokens-2.0.8-py2.py3-none-any.whl", hash = "sha256:e3305297c744ae53ffa032c45dc347286165e4ffce6875dc662b205db0623d86"}, + {file = "asttokens-2.0.8.tar.gz", hash = "sha256:c61e16246ecfb2cde2958406b4c8ebc043c9e6d73aaa83c941673b35e5d3a76b"}, +] [package.dependencies] six = "*" @@ -44,12 +58,16 @@ description = "Classes Without Boilerplate" category = "dev" optional = false python-versions = ">=3.5" +files = [ + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] [package.extras] dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] +tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] [[package]] name = "backoff" @@ -58,6 +76,10 @@ description = "Function decoration for backoff and retry" category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] [[package]] name = "black" @@ -66,6 +88,29 @@ description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, +] [package.dependencies] click = ">=8.0.0" @@ -89,6 +134,22 @@ description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, + {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, +] + +[[package]] +name = "cfgv" +version = "3.3.1" +description = "Validate configuration and produce human readable error messages." +category = "dev" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, + {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, +] [[package]] name = "charset-normalizer" @@ -97,9 +158,13 @@ description = "The Real First Universal Charset Detector. Open, modern and activ category = "main" optional = false python-versions = ">=3.6.0" +files = [ + {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, + {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, +] [package.extras] -unicode_backport = ["unicodedata2"] +unicode-backport = ["unicodedata2"] [[package]] name = "click" @@ -108,6 +173,10 @@ description = "Composable command line interface toolkit" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -120,6 +189,10 @@ description = "Cross-platform colored terminal text." category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "coverage" @@ -128,6 +201,58 @@ description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, + {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a"}, + {file = "coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32"}, + {file = "coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e"}, + {file = "coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b"}, + {file = "coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578"}, + {file = "coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b"}, + {file = "coverage-6.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f"}, + {file = "coverage-6.5.0-cp37-cp37m-win32.whl", hash = "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b"}, + {file = "coverage-6.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e"}, + {file = "coverage-6.5.0-cp38-cp38-win32.whl", hash = "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d"}, + {file = "coverage-6.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f"}, + {file = "coverage-6.5.0-cp39-cp39-win32.whl", hash = "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72"}, + {file = "coverage-6.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987"}, + {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, + {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, +] [package.dependencies] tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} @@ -142,6 +267,10 @@ description = "Python @deprecated decorator to deprecate old python classes, fun category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, + {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, +] [package.dependencies] wrapt = ">=1.10,<2" @@ -156,6 +285,10 @@ description = "Python's missing debug print command and other development tools. category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "devtools-0.8.0-py3-none-any.whl", hash = "sha256:00717ef184223cf36c65bbd17c6eb412f8a7564f47957f9e8b2b7610661b17fb"}, + {file = "devtools-0.8.0.tar.gz", hash = "sha256:6162a2f61c70242479dff3163e7837e6a9bf32451661af1347bfa3115602af16"}, +] [package.dependencies] asttokens = ">=2.0.0,<3.0.0" @@ -171,10 +304,26 @@ description = "serialize all of python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, + {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, +] [package.extras] graph = ["objgraph (>=1.7.2)"] +[[package]] +name = "distlib" +version = "0.3.6" +description = "Distribution utilities" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, +] + [[package]] name = "exceptiongroup" version = "1.0.0rc9" @@ -182,6 +331,10 @@ description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.0.0rc9-py3-none-any.whl", hash = "sha256:2e3c3fc1538a094aab74fad52d6c33fc94de3dfee3ee01f187c0e0c72aec5337"}, + {file = "exceptiongroup-1.0.0rc9.tar.gz", hash = "sha256:9086a4a21ef9b31c72181c77c040a074ba0889ee56a7b289ff0afb0d97655f96"}, +] [package.extras] test = ["pytest (>=6)"] @@ -193,6 +346,26 @@ description = "Get the currently executing AST node of a frame, and other inform category = "dev" optional = false python-versions = "*" +files = [ + {file = "executing-0.10.0-py2.py3-none-any.whl", hash = "sha256:9c745f80cda11eb22b62cbecf21156491a794eb56ab06f9d286a44e62822b24e"}, + {file = "executing-0.10.0.tar.gz", hash = "sha256:d1cd87c2e371e9966261410c5b3769d6df2f9e4a79a83eebd2662dd3388f9833"}, +] + +[[package]] +name = "filelock" +version = "3.8.2" +description = "A platform independent file lock." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "filelock-3.8.2-py3-none-any.whl", hash = "sha256:8df285554452285f79c035efb0c861eb33a4bcfa5b7a137016e32e6a90f9792c"}, + {file = "filelock-3.8.2.tar.gz", hash = "sha256:7565f628ea56bfcd8e54e42bdc55da899c85c1abfe1b5bcfd147e9188cebb3b2"}, +] + +[package.extras] +docs = ["furo (>=2022.9.29)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] +testing = ["covdefaults (>=2.2.2)", "coverage (>=6.5)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"] [[package]] name = "gql" @@ -201,6 +374,10 @@ description = "GraphQL client for Python" category = "main" optional = false python-versions = "*" +files = [ + {file = "gql-3.4.0-py2.py3-none-any.whl", hash = "sha256:59c8a0b8f0a2f3b0b2ff970c94de86f82f65cb1da3340bfe57143e5f7ea82f71"}, + {file = "gql-3.4.0.tar.gz", hash = "sha256:ca81aa8314fa88a8c57dd1ce34941278e0c352d762eb721edcba0387829ea7c0"}, +] [package.dependencies] backoff = ">=1.11.1,<3.0" @@ -218,7 +395,7 @@ botocore = ["botocore (>=1.21,<2)"] dev = ["aiofiles", "aiohttp (>=3.7.1,<3.9.0)", "black (==22.3.0)", "botocore (>=1.21,<2)", "check-manifest (>=0.42,<1)", "flake8 (==3.8.1)", "isort (==4.3.21)", "mock (==4.0.2)", "mypy (==0.910)", "parse (==1.15.0)", "pytest (==6.2.5)", "pytest-asyncio (==0.16.0)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=0.9.1,<1)", "sphinx (>=3.0.0,<4)", "sphinx-argparse (==0.2.5)", "sphinx-rtd-theme (>=0.4,<1)", "types-aiofiles", "types-mock", "types-requests", "urllib3 (>=1.26)", "vcrpy (==4.0.2)", "websockets (>=10,<11)", "websockets (>=9,<10)"] requests = ["requests (>=2.26,<3)", "requests-toolbelt (>=0.9.1,<1)", "urllib3 (>=1.26)"] test = ["aiofiles", "aiohttp (>=3.7.1,<3.9.0)", "botocore (>=1.21,<2)", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==6.2.5)", "pytest-asyncio (==0.16.0)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=0.9.1,<1)", "urllib3 (>=1.26)", "vcrpy (==4.0.2)", "websockets (>=10,<11)", "websockets (>=9,<10)"] -test_no_transport = ["aiofiles", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==6.2.5)", "pytest-asyncio (==0.16.0)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "vcrpy (==4.0.2)"] +test-no-transport = ["aiofiles", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==6.2.5)", "pytest-asyncio (==0.16.0)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "vcrpy (==4.0.2)"] websockets = ["websockets (>=10,<11)", "websockets (>=9,<10)"] [[package]] @@ -228,10 +405,29 @@ description = "GraphQL implementation for Python, a port of GraphQL.js, the Java category = "main" optional = false python-versions = ">=3.6,<4" +files = [ + {file = "graphql-core-3.2.3.tar.gz", hash = "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676"}, + {file = "graphql_core-3.2.3-py3-none-any.whl", hash = "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3"}, +] [package.dependencies] typing-extensions = {version = ">=4.2,<5", markers = "python_version < \"3.8\""} +[[package]] +name = "identify" +version = "2.5.10" +description = "File identification library for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "identify-2.5.10-py2.py3-none-any.whl", hash = "sha256:fb7c2feaeca6976a3ffa31ec3236a6911fbc51aec9acc111de2aed99f244ade2"}, + {file = "identify-2.5.10.tar.gz", hash = "sha256:dce9e31fee7dbc45fea36a9e855c316b8fbf807e65a862f160840bb5a2bf5dfd"}, +] + +[package.extras] +license = ["ukkonen"] + [[package]] name = "idna" version = "3.4" @@ -239,6 +435,10 @@ description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "importlib-metadata" @@ -247,6 +447,10 @@ description = "Read metadata from Python packages" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, + {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, +] [package.dependencies] typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} @@ -264,6 +468,10 @@ description = "iniconfig: brain-dead simple config-ini parsing" category = "dev" optional = false python-versions = "*" +files = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] [[package]] name = "isort" @@ -272,12 +480,16 @@ description = "A Python utility / library to sort Python imports." category = "dev" optional = false python-versions = ">=3.6.1,<4.0" +files = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +pipfile-deprecated-finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] -requirements_deprecated_finder = ["pip-api", "pipreqs"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "lazy-object-proxy" @@ -286,6 +498,45 @@ description = "A fast and thorough lazy object proxy." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "lazy-object-proxy-1.7.1.tar.gz", hash = "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-win32.whl", hash = "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-win32.whl", hash = "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61"}, + {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"}, +] [[package]] name = "mccabe" @@ -294,6 +545,10 @@ description = "McCabe checker, plugin for flake8" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] [[package]] name = "multidict" @@ -302,512 +557,7 @@ description = "multidict implementation" category = "main" optional = false python-versions = ">=3.7" - -[[package]] -name = "mypy" -version = "0.982" -description = "Optional static typing for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -mypy-extensions = ">=0.4.3" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} -typing-extensions = ">=3.10" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -python2 = ["typed-ast (>=1.4.0,<2)"] -reports = ["lxml"] - -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "packaging" -version = "21.3" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - -[[package]] -name = "pathspec" -version = "0.10.1" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "platformdirs" -version = "2.5.2" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "pydantic" -version = "1.10.2" -description = "Data validation and settings management using python type hints" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -typing-extensions = ">=4.1.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pylint" -version = "2.15.5" -description = "python code static checker" -category = "dev" -optional = false -python-versions = ">=3.7.2" - -[package.dependencies] -astroid = ">=2.12.12,<=2.14.0-dev0" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -dill = ">=0.2" -isort = ">=4.2.5,<6" -mccabe = ">=0.6,<0.8" -platformdirs = ">=2.2.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -tomlkit = ">=0.10.1" -typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} - -[package.extras] -spelling = ["pyenchant (>=3.2,<4.0)"] -testutils = ["gitpython (>3)"] - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" -optional = false -python-versions = ">=3.6.8" - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pytest" -version = "7.2.0" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] - -[[package]] -name = "pytest-cov" -version = "3.0.0" -description = "Pytest plugin for measuring coverage." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -coverage = {version = ">=5.2.1", extras = ["toml"]} -pytest = ">=4.6" - -[package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] - -[[package]] -name = "pytest-ordering" -version = "0.6" -description = "pytest plugin to run your tests in a specific order" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pytest = "*" - -[[package]] -name = "requests" -version = "2.28.1" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=3.7, <4" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "requests-toolbelt" -version = "0.10.1" -description = "A utility belt for advanced users of python-requests" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "tomlkit" -version = "0.11.5" -description = "Style preserving TOML library" -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - -[[package]] -name = "typed-ast" -version = "1.5.4" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "typing-extensions" -version = "4.4.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "ujson" -version = "5.5.0" -description = "Ultra fast JSON encoder and decoder for Python" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "urllib3" -version = "1.26.12" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "websockets" -version = "10.4" -description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "wrapt" -version = "1.14.1" -description = "Module for decorators, wrappers and monkey patching." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[[package]] -name = "yarl" -version = "1.8.1" -description = "Yet another URL library" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" -typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} - -[[package]] -name = "zipp" -version = "3.10.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[metadata] -lock-version = "1.1" -python-versions = ">=3.7.2, <4.0" -content-hash = "2ce7b9f400acd87cd0a3027f055c3e35133c1bec98cd90b4c9bc7e0a5b8078c7" - -[metadata.files] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] -astroid = [ - {file = "astroid-2.12.12-py3-none-any.whl", hash = "sha256:72702205200b2a638358369d90c222d74ebc376787af8fb2f7f2a86f7b5cc85f"}, - {file = "astroid-2.12.12.tar.gz", hash = "sha256:1c00a14f5a3ed0339d38d2e2e5b74ea2591df5861c0936bb292b84ccf3a78d83"}, -] -asttokens = [ - {file = "asttokens-2.0.8-py2.py3-none-any.whl", hash = "sha256:e3305297c744ae53ffa032c45dc347286165e4ffce6875dc662b205db0623d86"}, - {file = "asttokens-2.0.8.tar.gz", hash = "sha256:c61e16246ecfb2cde2958406b4c8ebc043c9e6d73aaa83c941673b35e5d3a76b"}, -] -attrs = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, -] -backoff = [ - {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, - {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, -] -black = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, -] -certifi = [ - {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, - {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -coverage = [ - {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, - {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04"}, - {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466"}, - {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a"}, - {file = "coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32"}, - {file = "coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e"}, - {file = "coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b"}, - {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa"}, - {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b"}, - {file = "coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578"}, - {file = "coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b"}, - {file = "coverage-6.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef"}, - {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c"}, - {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f"}, - {file = "coverage-6.5.0-cp37-cp37m-win32.whl", hash = "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b"}, - {file = "coverage-6.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2"}, - {file = "coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c"}, - {file = "coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398"}, - {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f"}, - {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e"}, - {file = "coverage-6.5.0-cp38-cp38-win32.whl", hash = "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d"}, - {file = "coverage-6.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6"}, - {file = "coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745"}, - {file = "coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf"}, - {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518"}, - {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f"}, - {file = "coverage-6.5.0-cp39-cp39-win32.whl", hash = "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72"}, - {file = "coverage-6.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987"}, - {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, - {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, -] -Deprecated = [ - {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, - {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, -] -devtools = [ - {file = "devtools-0.8.0-py3-none-any.whl", hash = "sha256:00717ef184223cf36c65bbd17c6eb412f8a7564f47957f9e8b2b7610661b17fb"}, - {file = "devtools-0.8.0.tar.gz", hash = "sha256:6162a2f61c70242479dff3163e7837e6a9bf32451661af1347bfa3115602af16"}, -] -dill = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, -] -exceptiongroup = [ - {file = "exceptiongroup-1.0.0rc9-py3-none-any.whl", hash = "sha256:2e3c3fc1538a094aab74fad52d6c33fc94de3dfee3ee01f187c0e0c72aec5337"}, - {file = "exceptiongroup-1.0.0rc9.tar.gz", hash = "sha256:9086a4a21ef9b31c72181c77c040a074ba0889ee56a7b289ff0afb0d97655f96"}, -] -executing = [ - {file = "executing-0.10.0-py2.py3-none-any.whl", hash = "sha256:9c745f80cda11eb22b62cbecf21156491a794eb56ab06f9d286a44e62822b24e"}, - {file = "executing-0.10.0.tar.gz", hash = "sha256:d1cd87c2e371e9966261410c5b3769d6df2f9e4a79a83eebd2662dd3388f9833"}, -] -gql = [ - {file = "gql-3.4.0-py2.py3-none-any.whl", hash = "sha256:59c8a0b8f0a2f3b0b2ff970c94de86f82f65cb1da3340bfe57143e5f7ea82f71"}, - {file = "gql-3.4.0.tar.gz", hash = "sha256:ca81aa8314fa88a8c57dd1ce34941278e0c352d762eb721edcba0387829ea7c0"}, -] -graphql-core = [ - {file = "graphql-core-3.2.3.tar.gz", hash = "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676"}, - {file = "graphql_core-3.2.3-py3-none-any.whl", hash = "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3"}, -] -idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] -importlib-metadata = [ - {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, - {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -isort = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, -] -lazy-object-proxy = [ - {file = "lazy-object-proxy-1.7.1.tar.gz", hash = "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-win32.whl", hash = "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-win32.whl", hash = "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61"}, - {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"}, -] -mccabe = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] -multidict = [ +files = [ {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, {file = "multidict-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c"}, @@ -868,7 +618,15 @@ multidict = [ {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"}, {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, ] -mypy = [ + +[[package]] +name = "mypy" +version = "0.982" +description = "Optional static typing for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "mypy-0.982-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5085e6f442003fa915aeb0a46d4da58128da69325d8213b4b35cc7054090aed5"}, {file = "mypy-0.982-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:41fd1cf9bc0e1c19b9af13a6580ccb66c381a5ee2cf63ee5ebab747a4badeba3"}, {file = "mypy-0.982-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f793e3dd95e166b66d50e7b63e69e58e88643d80a3dcc3bcd81368e0478b089c"}, @@ -894,27 +652,136 @@ mypy = [ {file = "mypy-0.982-py3-none-any.whl", hash = "sha256:1021c241e8b6e1ca5a47e4d52601274ac078a89845cfde66c6d5f769819ffa1d"}, {file = "mypy-0.982.tar.gz", hash = "sha256:85f7a343542dc8b1ed0a888cdd34dca56462654ef23aa673907305b260b3d746"}, ] -mypy-extensions = [ + +[package.dependencies] +mypy-extensions = ">=0.4.3" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} +typing-extensions = ">=3.10" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" +files = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -packaging = [ + +[[package]] +name = "nodeenv" +version = "1.7.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, + {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] -pathspec = [ + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pathspec" +version = "0.10.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, ] -platformdirs = [ + +[[package]] +name = "platformdirs" +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] -pluggy = [ + +[package.extras] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -pydantic = [ + +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pre-commit" +version = "2.20.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pre_commit-2.20.0-py2.py3-none-any.whl", hash = "sha256:51a5ba7c480ae8072ecdb6933df22d2f812dc897d5fe848778116129a681aac7"}, + {file = "pre_commit-2.20.0.tar.gz", hash = "sha256:a978dac7bc9ec0bcee55c18a277d553b0f419d259dadb4b9418ff2d00eb43959"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +toml = "*" +virtualenv = ">=20.0.8" + +[[package]] +name = "pydantic" +version = "1.10.2" +description = "Data validation and settings management using python type hints" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, @@ -952,48 +819,276 @@ pydantic = [ {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, ] -pylint = [ + +[package.dependencies] +typing-extensions = ">=4.1.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pylint" +version = "2.15.5" +description = "python code static checker" +category = "dev" +optional = false +python-versions = ">=3.7.2" +files = [ {file = "pylint-2.15.5-py3-none-any.whl", hash = "sha256:c2108037eb074334d9e874dc3c783752cc03d0796c88c9a9af282d0f161a1004"}, {file = "pylint-2.15.5.tar.gz", hash = "sha256:3b120505e5af1d06a5ad76b55d8660d44bf0f2fc3c59c2bdd94e39188ee3a4df"}, ] -pyparsing = [ + +[package.dependencies] +astroid = ">=2.12.12,<=2.14.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = ">=0.2" +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" +optional = false +python-versions = ">=3.6.8" +files = [ {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] -pytest = [ + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pytest" +version = "7.2.0" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, ] -pytest-cov = [ + +[package.dependencies] +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "3.0.0" +description = "Pytest plugin for measuring coverage." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, ] -pytest-ordering = [ + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "pytest-ordering" +version = "0.6" +description = "pytest plugin to run your tests in a specific order" +category = "dev" +optional = false +python-versions = "*" +files = [ {file = "pytest-ordering-0.6.tar.gz", hash = "sha256:561ad653626bb171da78e682f6d39ac33bb13b3e272d406cd555adb6b006bda6"}, {file = "pytest_ordering-0.6-py2-none-any.whl", hash = "sha256:27fba3fc265f5d0f8597e7557885662c1bdc1969497cd58aff6ed21c3b617de2"}, {file = "pytest_ordering-0.6-py3-none-any.whl", hash = "sha256:3f314a178dbeb6777509548727dc69edf22d6d9a2867bf2d310ab85c403380b6"}, ] -requests = [ + +[package.dependencies] +pytest = "*" + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {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-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {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"}, +] + +[[package]] +name = "requests" +version = "2.28.1" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7, <4" +files = [ {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] -requests-toolbelt = [ + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "0.10.1" +description = "A utility belt for advanced users of python-requests" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ {file = "requests-toolbelt-0.10.1.tar.gz", hash = "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d"}, {file = "requests_toolbelt-0.10.1-py2.py3-none-any.whl", hash = "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7"}, ] -six = [ + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "setuptools" +version = "65.6.3" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-65.6.3-py3-none-any.whl", hash = "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54"}, + {file = "setuptools-65.6.3.tar.gz", hash = "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -tomli = [ + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -tomlkit = [ + +[[package]] +name = "tomlkit" +version = "0.11.5" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" +files = [ {file = "tomlkit-0.11.5-py3-none-any.whl", hash = "sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7"}, {file = "tomlkit-0.11.5.tar.gz", hash = "sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c"}, ] -typed-ast = [ + +[[package]] +name = "typed-ast" +version = "1.5.4" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, @@ -1019,11 +1114,27 @@ typed-ast = [ {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, ] -typing-extensions = [ + +[[package]] +name = "typing-extensions" +version = "4.4.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, ] -ujson = [ + +[[package]] +name = "ujson" +version = "5.5.0" +description = "Ultra fast JSON encoder and decoder for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "ujson-5.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff4928dc1e9704b567171c16787238201fdbf023665573c12c02146fe1e02eec"}, {file = "ujson-5.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1dc2f46c31ef22b0aaa28cd71be897bea271e700636658d573df9c43c49ebbd0"}, {file = "ujson-5.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6019e3480d933d3698f2ecb4b46d64bfadd64e718f04fac36e681f3254b49a93"}, @@ -1090,11 +1201,54 @@ ujson = [ {file = "ujson-5.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4ef4ab8352861b99bd7fedb1fc6df3ea7f7d5216c789ba6d859e4ea06f1a4c45"}, {file = "ujson-5.5.0.tar.gz", hash = "sha256:b25077a971c7da47bd6846a912a747f6963776d90720c88603b1b55d81790780"}, ] -urllib3 = [ + +[[package]] +name = "urllib3" +version = "1.26.12" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" +files = [ {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, ] -websockets = [ + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "virtualenv" +version = "20.17.1" +description = "Virtual Python Environment builder" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "virtualenv-20.17.1-py3-none-any.whl", hash = "sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4"}, + {file = "virtualenv-20.17.1.tar.gz", hash = "sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058"}, +] + +[package.dependencies] +distlib = ">=0.3.6,<1" +filelock = ">=3.4.1,<4" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.8\""} +platformdirs = ">=2.4,<3" + +[package.extras] +docs = ["proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-argparse (>=0.3.2)", "sphinx-rtd-theme (>=1)", "towncrier (>=22.8)"] +testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "websockets" +version = "10.4" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {file = "websockets-10.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48"}, {file = "websockets-10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab"}, {file = "websockets-10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba089c499e1f4155d2a3c2a05d2878a3428cf321c848f2b5a45ce55f0d7d310c"}, @@ -1165,7 +1319,15 @@ websockets = [ {file = "websockets-10.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:05a7233089f8bd355e8cbe127c2e8ca0b4ea55467861906b80d2ebc7db4d6b72"}, {file = "websockets-10.4.tar.gz", hash = "sha256:eef610b23933c54d5d921c92578ae5f89813438fded840c2e9809d378dc765d3"}, ] -wrapt = [ + +[[package]] +name = "wrapt" +version = "1.14.1" +description = "Module for decorators, wrappers and monkey patching." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, @@ -1231,7 +1393,15 @@ wrapt = [ {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] -yarl = [ + +[[package]] +name = "yarl" +version = "1.8.1" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ {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"}, @@ -1292,7 +1462,29 @@ yarl = [ {file = "yarl-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:de49d77e968de6626ba7ef4472323f9d2e5a56c1d85b7c0e2a190b2173d3b9be"}, {file = "yarl-1.8.1.tar.gz", hash = "sha256:af887845b8c2e060eb5605ff72b6f2dd2aab7a761379373fd89d314f4752abbf"}, ] -zipp = [ + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" +typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} + +[[package]] +name = "zipp" +version = "3.10.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ {file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"}, {file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"}, ] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.7.2, <4.0" +content-hash = "d2d12c8e25940c8ab7cc11595e8c5f9359c55baaaf523365ba888fd7b2bc9660" diff --git a/pyproject.toml b/pyproject.toml index 75452973..8d61e23b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,7 @@ pytest-cov = "^3.0.0" devtools = "^0.8.0" pylint = "^2.14.4" mypy = "^0.982" +pre-commit = "^2.20.0" [tool.black] exclude = ''' From a35f8936ca77c35bc2ef3a825946e8563f0731a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= Date: Mon, 19 Dec 2022 12:44:11 +0100 Subject: [PATCH 2/8] =?UTF-8?q?bump:=20version=202.9.1=20=E2=86=92=202.9.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 191 +++++++++++++++++++++++++++++++++++++++++++++++-- pyproject.toml | 5 ++ 2 files changed, 192 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index f1a88929..0e6304f7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -12,6 +12,24 @@ files = [ {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, ] +[[package]] +name = "argcomplete" +version = "2.0.0" +description = "Bash tab completion for argparse" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "argcomplete-2.0.0-py2.py3-none-any.whl", hash = "sha256:cffa11ea77999bb0dd27bb25ff6dc142a6796142f68d45b1a26b11f58724561e"}, + {file = "argcomplete-2.0.0.tar.gz", hash = "sha256:6372ad78c89d662035101418ae253668445b391755cfe94ea52f1b9d22425b20"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=0.23,<5", markers = "python_version == \"3.7\""} + +[package.extras] +test = ["coverage", "flake8", "pexpect", "wheel"] + [[package]] name = "astroid" version = "2.12.12" @@ -194,6 +212,31 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "commitizen" +version = "2.38.0" +description = "Python commitizen client tool" +category = "dev" +optional = false +python-versions = ">=3.6.2,<4.0.0" +files = [ + {file = "commitizen-2.38.0-py3-none-any.whl", hash = "sha256:401e1d6907d752dbb00fd5a8b0d0201ff36bc110870168776d49de20bf5b8b61"}, + {file = "commitizen-2.38.0.tar.gz", hash = "sha256:7daa217f703f330c18548304400d133a834840fd01bc79ef2966426c74bdbf1f"}, +] + +[package.dependencies] +argcomplete = ">=1.12.1,<2.1" +charset-normalizer = ">=2.1.0,<3.0.0" +colorama = ">=0.4.1,<0.5.0" +decli = ">=0.5.2,<0.6.0" +jinja2 = ">=2.10.3" +packaging = ">=19" +pyyaml = ">=3.08" +questionary = ">=1.4.0,<2.0.0" +termcolor = {version = ">=1.1,<3", markers = "python_version >= \"3.7\""} +tomlkit = ">=0.5.3,<1.0.0" +typing-extensions = ">=4.0.1,<5.0.0" + [[package]] name = "coverage" version = "6.5.0" @@ -260,6 +303,18 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 [package.extras] toml = ["tomli"] +[[package]] +name = "decli" +version = "0.5.2" +description = "Minimal, easy-to-use, declarative cli tool" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "decli-0.5.2-py3-none-any.whl", hash = "sha256:d3207bc02d0169bf6ed74ccca09ce62edca0eb25b0ebf8bf4ae3fb8333e15ca0"}, + {file = "decli-0.5.2.tar.gz", hash = "sha256:f2cde55034a75c819c630c7655a844c612f2598c42c21299160465df6ad463ad"}, +] + [[package]] name = "Deprecated" version = "1.2.13" @@ -442,14 +497,14 @@ files = [ [[package]] name = "importlib-metadata" -version = "5.0.0" +version = "4.13.0" description = "Read metadata from Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, - {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, + {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, + {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, ] [package.dependencies] @@ -491,6 +546,24 @@ pipfile-deprecated-finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] requirements-deprecated-finder = ["pip-api", "pipreqs"] +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + [[package]] name = "lazy-object-proxy" version = "1.7.1" @@ -538,6 +611,56 @@ files = [ {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"}, ] +[[package]] +name = "markupsafe" +version = "2.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] + [[package]] name = "mccabe" version = "0.7.0" @@ -774,6 +897,21 @@ pyyaml = ">=5.1" toml = "*" virtualenv = ">=20.0.8" +[[package]] +name = "prompt-toolkit" +version = "3.0.36" +description = "Library for building powerful interactive command lines in Python" +category = "dev" +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "prompt_toolkit-3.0.36-py3-none-any.whl", hash = "sha256:aa64ad242a462c5ff0363a7b9cfe696c20d55d9fc60c11fd8e632d064804d305"}, + {file = "prompt_toolkit-3.0.36.tar.gz", hash = "sha256:3e163f254bef5a03b146397d7c1963bd3e2812f0964bb9a24e6ec761fd28db63"}, +] + +[package.dependencies] +wcwidth = "*" + [[package]] name = "pydantic" version = "1.10.2" @@ -979,6 +1117,24 @@ files = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] +[[package]] +name = "questionary" +version = "1.10.0" +description = "Python library to build pretty command line user prompts ⭐️" +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "questionary-1.10.0-py3-none-any.whl", hash = "sha256:fecfcc8cca110fda9d561cb83f1e97ecbb93c613ff857f655818839dac74ce90"}, + {file = "questionary-1.10.0.tar.gz", hash = "sha256:600d3aefecce26d48d97eee936fdb66e4bc27f934c3ab6dd1e292c4f43946d90"}, +] + +[package.dependencies] +prompt_toolkit = ">=2.0,<4.0" + +[package.extras] +docs = ["Sphinx (>=3.3,<4.0)", "sphinx-autobuild (>=2020.9.1,<2021.0.0)", "sphinx-autodoc-typehints (>=1.11.1,<2.0.0)", "sphinx-copybutton (>=0.3.1,<0.4.0)", "sphinx-rtd-theme (>=0.5.0,<0.6.0)"] + [[package]] name = "requests" version = "2.28.1" @@ -1045,6 +1201,21 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "termcolor" +version = "2.1.1" +description = "ANSI color formatting for output in terminal" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "termcolor-2.1.1-py3-none-any.whl", hash = "sha256:fa852e957f97252205e105dd55bbc23b419a70fec0085708fc0515e399f304fd"}, + {file = "termcolor-2.1.1.tar.gz", hash = "sha256:67cee2009adc6449c650f6bcf3bdeed00c8ba53a8cda5362733c53e0a39fb70b"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + [[package]] name = "toml" version = "0.10.2" @@ -1241,6 +1412,18 @@ platformdirs = ">=2.4,<3" docs = ["proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-argparse (>=0.3.2)", "sphinx-rtd-theme (>=1)", "towncrier (>=22.8)"] testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"] +[[package]] +name = "wcwidth" +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, + {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, +] + [[package]] name = "websockets" version = "10.4" @@ -1487,4 +1670,4 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "2.0" python-versions = ">=3.7.2, <4.0" -content-hash = "d2d12c8e25940c8ab7cc11595e8c5f9359c55baaaf523365ba888fd7b2bc9660" +content-hash = "fba4eaa4891e1f626c0d6a04a919985d90a8d0a8bbf334d2846e2a16da28304c" diff --git a/pyproject.toml b/pyproject.toml index 8d61e23b..5c01e55a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,7 @@ devtools = "^0.8.0" pylint = "^2.14.4" mypy = "^0.982" pre-commit = "^2.20.0" +commitizen = "^2.38.0" [tool.black] exclude = ''' @@ -52,6 +53,10 @@ line-length = 88 target-version = ["py37", "py38", "py39", "py310"] +[tool.commitizen] +name = "cz_conventional_commits" +version = "2.9.2" +tag_format = "$version" [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" From a8786c126dd9bdd8b71630ee9e1e6bfa3bc3cdef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= Date: Mon, 19 Dec 2022 14:02:42 +0100 Subject: [PATCH 3/8] build(pre-commit-config.yaml): add basic pre-commit config --- .pre-commit-config.yaml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..f8693834 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,27 @@ +repos: + - repo: https://github.com/commitizen-tools/commitizen + hooks: + - id: commitizen + - id: commitizen-branch + stages: + - push + rev: v2.38.0 + + - repo: https://github.com/pycqa/isort + rev: 5.10.1 + hooks: + - id: isort + - repo: https://github.com/psf/black + rev: 22.12.0 + hooks: + - id: black + # It is recommended to specify the latest version of Python + # supported by your project here, or alternatively use + # pre-commit's default_language_version, see + # https://pre-commit.com/#top_level-default_language_version + # language_version: python3.11 + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: end-of-file-fixer + - id: trailing-whitespace From b25f2ab4bc26a758821b132af4d74773c48083f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= Date: Mon, 19 Dec 2022 14:03:20 +0100 Subject: [PATCH 4/8] style(whole-project): fix styling from new pre-commit config --- .devcontainer/devcontainer.json | 2 +- .devcontainer/docker-compose.yaml | 2 +- .gitattributes | 2 +- .gitignore | 2 +- .vscode/launch.json | 4 ++-- README.md | 12 +++++++++--- pyproject.toml | 2 +- src/specklepy/api/resources/branch.py | 2 +- 8 files changed, 17 insertions(+), 11 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 87546333..e25b6bea 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -52,4 +52,4 @@ "postCreateCommand": "poetry config virtualenvs.create false && poetry install", // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. "remoteUser": "vscode" -} \ No newline at end of file +} diff --git a/.devcontainer/docker-compose.yaml b/.devcontainer/docker-compose.yaml index 46b94dc4..6bfc1478 100644 --- a/.devcontainer/docker-compose.yaml +++ b/.devcontainer/docker-compose.yaml @@ -41,4 +41,4 @@ services: command: /bin/sh -c "while sleep 1000; do :; done" network_mode: host # networks: -# default: \ No newline at end of file +# default: diff --git a/.gitattributes b/.gitattributes index 5dc46e6b..314766e9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,3 @@ * text=auto eol=lf *.{cmd,[cC][mM][dD]} text eol=crlf -*.{bat,[bB][aA][tT]} text eol=crlf \ No newline at end of file +*.{bat,[bB][aA][tT]} text eol=crlf diff --git a/.gitignore b/.gitignore index b893e583..80226df1 100644 --- a/.gitignore +++ b/.gitignore @@ -112,4 +112,4 @@ venv.bak/ # other scratch.py -settings.json \ No newline at end of file +settings.json diff --git a/.vscode/launch.json b/.vscode/launch.json index ccfbf0c5..1a8aba5d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,7 +4,7 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ - + { "name": "Python: Current File", "type": "python", @@ -23,4 +23,4 @@ "justMyCode": true } ] -} \ No newline at end of file +} diff --git a/README.md b/README.md index c7da9d83..de9743d6 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ What is Speckle? Check our ![YouTube Video Views](https://img.shields.io/youtube Give Speckle a try in no time by: - [![speckle XYZ](https://img.shields.io/badge/https://-speckle.xyz-0069ff?style=flat-square&logo=hackthebox&logoColor=white)](https://speckle.xyz) ⇒ creating an account at our public server -- [![create a droplet](https://img.shields.io/badge/Create%20a%20Droplet-0069ff?style=flat-square&logo=digitalocean&logoColor=white)](https://marketplace.digitalocean.com/apps/speckle-server?refcode=947a2b5d7dc1) ⇒ deploying an instance in 1 click +- [![create a droplet](https://img.shields.io/badge/Create%20a%20Droplet-0069ff?style=flat-square&logo=digitalocean&logoColor=white)](https://marketplace.digitalocean.com/apps/speckle-server?refcode=947a2b5d7dc1) ⇒ deploying an instance in 1 click ### Resources @@ -47,7 +47,7 @@ Give Speckle a try in no time by: ## Usage -Send and receive data from a Speckle Server with `operations`, interact with the Speckle API with the `SpeckleClient`, create and extend your own custom Speckle Objects with `Base`, and more! +Send and receive data from a Speckle Server with `operations`, interact with the Speckle API with the `SpeckleClient`, create and extend your own custom Speckle Objects with `Base`, and more! Head to the [**📚 specklepy docs**](https://speckle.guide/dev/python.html) for more information and usage examples. @@ -65,6 +65,12 @@ To execute any python script run `$ poetry run python my_script.py` > Alternatively you may roll your own virtual-env with either venv, virtualenv, pyenv-virtualenv etc. Poetry will play along an recognize if it is invoked from inside a virtual environment. +### Style guide + +All our repo wide styling linting and other rules are checked and enforced by `pre-commit`, which is included in the dev dependencies. +It is recommended to set up `pre-commit` after installing the dependencies by running `$ pre-commit install`. +Commiting code that doesn't adhere to the given rules, will fail the checks in our CI system. + ### Local Data Paths It may be helpful to know where the local accounts and object cache dbs are stored. Depending on on your OS, you can find the dbs at: @@ -82,7 +88,7 @@ The Speckle Community hangs out on [the forum](https://discourse.speckle.works), ## Security -For any security vulnerabilities or concerns, please contact us directly at security[at]speckle.systems. +For any security vulnerabilities or concerns, please contact us directly at security[at]speckle.systems. ## License diff --git a/pyproject.toml b/pyproject.toml index 5c01e55a..9dcdb08d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,4 +62,4 @@ requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.isort] -profile = "black" \ No newline at end of file +profile = "black" diff --git a/src/specklepy/api/resources/branch.py b/src/specklepy/api/resources/branch.py index 5e8aa10c..7f3f2280 100644 --- a/src/specklepy/api/resources/branch.py +++ b/src/specklepy/api/resources/branch.py @@ -87,7 +87,7 @@ def get(self, stream_id: str, name: str, commits_limit: int = 10): createdAt } } - } + } } } """ From 990cf4eb2ff4e77013dbebf666eab9f720aa4a82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= Date: Tue, 20 Dec 2022 10:45:22 +0100 Subject: [PATCH 5/8] style(whole-project): fixing linting and typing errors --- .pre-commit-config.yaml | 10 +++- example/many_children.py | 1 - example/send_receive.py | 15 ++++++ example/stream_objects.py | 1 - patch_version.py | 2 +- poetry.lock | 52 ++++++++++++++++++- pyproject.toml | 5 +- src/specklepy/api/client.py | 41 ++++++++++----- src/specklepy/api/credentials.py | 22 +++++--- src/specklepy/api/models.py | 33 +++++++++--- src/specklepy/api/operations.py | 31 +++++++---- src/specklepy/api/resource.py | 33 +++++++----- src/specklepy/api/resources/__init__.py | 3 +- src/specklepy/api/resources/active_user.py | 48 ++++++++++++----- src/specklepy/api/resources/object.py | 17 ++++-- src/specklepy/api/resources/other_user.py | 35 ++++++++++--- src/specklepy/api/resources/server.py | 4 +- src/specklepy/api/resources/stream.py | 31 +++++------ src/specklepy/api/resources/subscriptions.py | 38 +++++++++----- src/specklepy/api/resources/user.py | 9 +++- src/specklepy/api/wrapper.py | 49 +++++++++++------ src/specklepy/logging/exceptions.py | 11 ++-- src/specklepy/logging/metrics.py | 8 ++- src/specklepy/objects/base.py | 30 +++++++---- src/specklepy/objects/geometry.py | 12 +++-- src/specklepy/objects/other.py | 23 +++++--- src/specklepy/objects/structural/loading.py | 7 --- .../objects/structural/properties.py | 1 - .../serialization/base_object_serializer.py | 40 +++++++++----- src/specklepy/transports/server/__init__.py | 2 +- .../transports/server/batch_sender.py | 12 +++-- src/specklepy/transports/server/server.py | 44 +++++++++------- src/specklepy/transports/sqlite.py | 32 +++++++----- tests/test_base.py | 12 ++--- tests/test_commit.py | 2 +- tests/test_geometry.py | 3 +- tests/test_other_user.py | 1 - tests/test_serialization.py | 1 - tests/test_stream.py | 2 - tests/test_transforms.py | 9 +--- tests/test_wrapper.py | 11 ++-- 41 files changed, 506 insertions(+), 237 deletions(-) create mode 100644 example/send_receive.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f8693834..600e0faf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,9 @@ repos: + - repo: https://github.com/charliermarsh/ruff-pre-commit + hooks: + - id: ruff + rev: v0.0.186 + - repo: https://github.com/commitizen-tools/commitizen hooks: - id: commitizen @@ -8,9 +13,10 @@ repos: rev: v2.38.0 - repo: https://github.com/pycqa/isort - rev: 5.10.1 + rev: v5.11.3 hooks: - id: isort + - repo: https://github.com/psf/black rev: 22.12.0 hooks: @@ -21,7 +27,7 @@ repos: # https://pre-commit.com/#top_level-default_language_version # language_version: python3.11 - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.3.0 + rev: v4.4.0 hooks: - id: end-of-file-fixer - id: trailing-whitespace diff --git a/example/many_children.py b/example/many_children.py index 64a15543..1f5849a3 100644 --- a/example/many_children.py +++ b/example/many_children.py @@ -27,7 +27,6 @@ def clean_db(): def one_pass(clean: bool, randomize: bool, child_count: int): - foo = Base() for i in range(child_count): stuff = random_string() if randomize else "stuff" diff --git a/example/send_receive.py b/example/send_receive.py new file mode 100644 index 00000000..59d3fc03 --- /dev/null +++ b/example/send_receive.py @@ -0,0 +1,15 @@ +from devtools import debug + +from specklepy.api import operations +from specklepy.api.wrapper import StreamWrapper + +if __name__ == "__main__": + stream_url = "https://latest.speckle.dev/streams/7d051a6449" + wrapper = StreamWrapper(stream_url) + + transport = wrapper.get_transport() + + rec = operations.receive("98396753f8bf7fe1cb60c5193e9f9d86", transport) + + # hash = operations.send(base=foo, transports=[transport], use_default_cache=False) + debug(rec) diff --git a/example/stream_objects.py b/example/stream_objects.py index cc4ecb82..ca8e50e9 100644 --- a/example/stream_objects.py +++ b/example/stream_objects.py @@ -25,7 +25,6 @@ def create_object(child_count: int) -> Base: if __name__ == "__main__": - stream_url = "http://hyperion:3000/streams/2372b54c35" child_count = 10 diff --git a/patch_version.py b/patch_version.py index 10bd2bf0..1c7262cb 100644 --- a/patch_version.py +++ b/patch_version.py @@ -9,7 +9,7 @@ def patch(tag): lines = f.readlines() if "version" not in lines[2]: - raise Exception(f"Invalid pyproject.toml. Could not patch version.") + raise Exception("Invalid pyproject.toml. Could not patch version.") lines[2] = f'version = "{tag}"\n' with open("pyproject.toml", "w") as file: diff --git a/poetry.lock b/poetry.lock index 0e6304f7..33ede636 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1172,6 +1172,32 @@ files = [ [package.dependencies] requests = ">=2.0.1,<3.0.0" +[[package]] +name = "ruff" +version = "0.0.187" +description = "An extremely fast Python linter, written in Rust." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.0.187-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:d90cbd30c585a9551695af09c91c07542a4bfebe9870f8ca4de5d9ac34478665"}, + {file = "ruff-0.0.187-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:bca4d85f182c7452f5b607e99c03a0957126bfb260815b824f7fabde519708d8"}, + {file = "ruff-0.0.187-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c498a7e183c2cd58e8cc0bed93d88e44305365a93132463911680d20d158ae8a"}, + {file = "ruff-0.0.187-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb525861aae5b005e92c7f32dff8382bbd13a2da5a06b950a11ba879bb9fef15"}, + {file = "ruff-0.0.187-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41cfed788d5f8bd618710432583b0f61195769919e8bc1a77f080d5db2ebbb93"}, + {file = "ruff-0.0.187-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:25a9f74ee9b9472b750c7f0e25551b6f3b298a62126d0386bc9bdda1fed00c35"}, + {file = "ruff-0.0.187-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24d0e61041abd2811cf841b43572fed1d0343e96704aedfac388f03dc2f1f53e"}, + {file = "ruff-0.0.187-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88722ddbeec8614c9a5fd90eac3aa13372ede98559c36ef95581a26954a85fb5"}, + {file = "ruff-0.0.187-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9032f221d28897852c5de173cd6890185f4c86a93eca4ed0c215076e8f0f626"}, + {file = "ruff-0.0.187-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11833a0e80ff9d244d11c16cc4d1283e84cf0ac47f2440d88093ee3076687fcb"}, + {file = "ruff-0.0.187-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:debcd3740da13b786656fcf23caa1a328c678b19ab822243bd00a25efb00ab7b"}, + {file = "ruff-0.0.187-py3-none-musllinux_1_2_i686.whl", hash = "sha256:51f4bf4940a57b4e04254f2823a0e4de52595987c65e0c9ed7b4546c5362f60e"}, + {file = "ruff-0.0.187-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ab7e50ba517f3bfaaadaba3f9e68e0a95ff04abab5c480f05015a156f58f16d3"}, + {file = "ruff-0.0.187-py3-none-win32.whl", hash = "sha256:25e55cc000ca6fe83df6d25080adec86acb3a39cd623ed9ff122ccede02ab6ba"}, + {file = "ruff-0.0.187-py3-none-win_amd64.whl", hash = "sha256:a81acd2b111b267cda09c507ad72a7ca47fa6f47e1ec240e594eef37db1bdf8d"}, + {file = "ruff-0.0.187.tar.gz", hash = "sha256:d209efb6cb4f03b31c76d7be770cb387cbdf0592c604f0d0639c1a6f742db04c"}, +] + [[package]] name = "setuptools" version = "65.6.3" @@ -1286,6 +1312,30 @@ files = [ {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, ] +[[package]] +name = "types-deprecated" +version = "1.2.9" +description = "Typing stubs for Deprecated" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "types-Deprecated-1.2.9.tar.gz", hash = "sha256:e04ce58929509865359e91dcc38720123262b4cd68fa2a8a90312d50390bb6fa"}, + {file = "types_Deprecated-1.2.9-py3-none-any.whl", hash = "sha256:53d05621e1d75de537f5a57d93508c8df17e37c07ee60b9fb09d39e1b7586c1e"}, +] + +[[package]] +name = "types-ujson" +version = "5.6.0.0" +description = "Typing stubs for ujson" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "types-ujson-5.6.0.0.tar.gz", hash = "sha256:1a20cf7946772756736582612e0da5656d2dbeccd24be4c1e97d1e66b072b97e"}, + {file = "types_ujson-5.6.0.0-py3-none-any.whl", hash = "sha256:010b221260c24a915c6e713a83f366b91390766850ec110304de5b20c86b4b11"}, +] + [[package]] name = "typing-extensions" version = "4.4.0" @@ -1670,4 +1720,4 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "2.0" python-versions = ">=3.7.2, <4.0" -content-hash = "fba4eaa4891e1f626c0d6a04a919985d90a8d0a8bbf334d2846e2a16da28304c" +content-hash = "18bc7c2f98f551538bf1dfca42a0c3c352e98f2c0a7a59619b8fd16bd2c13e39" diff --git a/pyproject.toml b/pyproject.toml index 9dcdb08d..b03344b8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,6 +32,9 @@ pylint = "^2.14.4" mypy = "^0.982" pre-commit = "^2.20.0" commitizen = "^2.38.0" +ruff = "^0.0.187" +types-deprecated = "^1.2.9" +types-ujson = "^5.6.0.0" [tool.black] exclude = ''' @@ -50,7 +53,7 @@ exclude = ''' ''' include = '\.pyi?$' line-length = 88 -target-version = ["py37", "py38", "py39", "py310"] +target-version = ["py37", "py38", "py39", "py310", "py311"] [tool.commitizen] diff --git a/src/specklepy/api/client.py b/src/specklepy/api/client.py index d1b78eed..40207da3 100644 --- a/src/specklepy/api/client.py +++ b/src/specklepy/api/client.py @@ -26,10 +26,13 @@ class SpeckleClient: """ - The `SpeckleClient` is your entry point for interacting with your Speckle Server's GraphQL API. - You'll need to have access to a server to use it, or you can use our public server `speckle.xyz`. + The `SpeckleClient` is your entry point for interacting with + your Speckle Server's GraphQL API. + You'll need to have access to a server to use it, + or you can use our public server `speckle.xyz`. - To authenticate the client, you'll need to have downloaded the [Speckle Manager](https://speckle.guide/#speckle-manager) + To authenticate the client, you'll need to have downloaded + the [Speckle Manager](https://speckle.guide/#speckle-manager) and added your account. ```py @@ -92,15 +95,22 @@ def __init__(self, host: str = DEFAULT_HOST, use_ssl: bool = USE_SSL) -> None: # ) from ex def __repr__(self): - return f"SpeckleClient( server: {self.url}, authenticated: {self.account.token is not None} )" + return ( + f"SpeckleClient( server: {self.url}, authenticated:" + f" {self.account.token is not None} )" + ) @deprecated( version="2.6.0", - reason="Renamed: please use `authenticate_with_account` or `authenticate_with_token` instead.", + reason=( + "Renamed: please use `authenticate_with_account` or" + " `authenticate_with_token` instead." + ), ) def authenticate(self, token: str) -> None: """Authenticate the client using a personal access token - The token is saved in the client object and a synchronous GraphQL entrypoint is created + The token is saved in the client object and a synchronous GraphQL + entrypoint is created Arguments: token {str} -- an api token @@ -109,8 +119,10 @@ def authenticate(self, token: str) -> None: self._set_up_client() def authenticate_with_token(self, token: str) -> None: - """Authenticate the client using a personal access token - The token is saved in the client object and a synchronous GraphQL entrypoint is created + """ + Authenticate the client using a personal access token. + The token is saved in the client object and a synchronous GraphQL + entrypoint is created Arguments: token {str} -- an api token @@ -121,10 +133,12 @@ def authenticate_with_token(self, token: str) -> None: def authenticate_with_account(self, account: Account) -> None: """Authenticate the client using an Account object - The account is saved in the client object and a synchronous GraphQL entrypoint is created + The account is saved in the client object and a synchronous GraphQL + entrypoint is created Arguments: - account {Account} -- the account object which can be found with `get_default_account` or `get_local_accounts` + account {Account} -- the account object which can be found with + `get_default_account` or `get_local_accounts` """ metrics.track(metrics.CLIENT, account, {"name": "authenticate with account"}) self.account = account @@ -153,7 +167,8 @@ def _set_up_client(self) -> None: if self.user.get() is None: warn( SpeckleWarning( - f"Possibly invalid token - could not authenticate Speckle Client for server {self.url}" + "Possibly invalid token - could not authenticate Speckle Client" + f" for server {self.url}" ) ) @@ -167,7 +182,7 @@ def _init_resources(self) -> None: server_version = None try: server_version = self.server.version() - except: + except Exception: pass self.user = user.Resource( account=self.account, @@ -214,7 +229,7 @@ def __getattr__(self, name): return attr.Resource( account=self.account, basepath=self.url, client=self.httpclient ) - except: + except AttributeError: raise SpeckleException( f"Method {name} is not supported by the SpeckleClient class" ) diff --git a/src/specklepy/api/credentials.py b/src/specklepy/api/credentials.py index 689c5b9c..c18fe797 100644 --- a/src/specklepy/api/credentials.py +++ b/src/specklepy/api/credentials.py @@ -26,7 +26,10 @@ class Account(BaseModel): id: Optional[str] = None def __repr__(self) -> str: - return f"Account(email: {self.userInfo.email}, server: {self.serverInfo.url}, isDefault: {self.isDefault})" + return ( + f"Account(email: {self.userInfo.email}, server: {self.serverInfo.url}," + f" isDefault: {self.isDefault})" + ) def __str__(self) -> str: return self.__repr__() @@ -45,7 +48,8 @@ def get_local_accounts(base_path: Optional[str] = None) -> List[Account]: base_path {str} -- custom base path if you are not using the system default Returns: - List[Account] -- list of all local accounts or an empty list if no accounts were found + List[Account] -- list of all local accounts or an empty list if + no accounts were found """ accounts: List[Account] = [] try: @@ -95,7 +99,9 @@ def get_local_accounts(base_path: Optional[str] = None) -> List[Account]: def get_default_account(base_path: Optional[str] = None) -> Optional[Account]: - """Gets this environment's default account if any. If there is no default, the first found will be returned and set as default. + """ + Gets this environment's default account if any. If there is no default, + the first found will be returned and set as default. Arguments: base_path {str} -- custom base path if you are not using the system default @@ -121,7 +127,8 @@ def get_account_from_token(token: str, server_url: str = None) -> Account: token {str} -- the api token Returns: - Account -- the local account with this token or a shell account containing just the token and url if no local account is found + Account -- the local account with this token or a shell account containing + just the token and url if no local account is found """ accounts = get_local_accounts() if not accounts: @@ -145,6 +152,9 @@ def get_account_from_token(token: str, server_url: str = None) -> Account: class StreamWrapper: def __init__(self, url: str = None) -> None: raise SpeckleException( - message="The StreamWrapper has moved as of v2.6.0! Please import from specklepy.api.wrapper", - exception=DeprecationWarning, + message=( + "The StreamWrapper has moved as of v2.6.0! Please import from" + " specklepy.api.wrapper" + ), + exception=DeprecationWarning(), ) diff --git a/src/specklepy/api/models.py b/src/specklepy/api/models.py index 4729095c..defec361 100644 --- a/src/specklepy/api/models.py +++ b/src/specklepy/api/models.py @@ -25,7 +25,11 @@ class Commit(BaseModel): parents: Optional[List[str]] def __repr__(self) -> str: - return f"Commit( id: {self.id}, message: {self.message}, referencedObject: {self.referencedObject}, authorName: {self.authorName}, branchName: {self.branchName}, createdAt: {self.createdAt} )" + return ( + f"Commit( id: {self.id}, message: {self.message}, referencedObject:" + f" {self.referencedObject}, authorName: {self.authorName}, branchName:" + f" {self.branchName}, createdAt: {self.createdAt} )" + ) def __str__(self) -> str: return self.__repr__() @@ -75,7 +79,10 @@ class Stream(BaseModel): favoritesCount: Optional[int] = None def __repr__(self): - return f"Stream( id: {self.id}, name: {self.name}, description: {self.description}, isPublic: {self.isPublic})" + return ( + f"Stream( id: {self.id}, name: {self.name}, description:" + f" {self.description}, isPublic: {self.isPublic})" + ) def __str__(self) -> str: return self.__repr__() @@ -99,7 +106,10 @@ class User(BaseModel): streams: Optional[Streams] def __repr__(self): - return f"User( id: {self.id}, name: {self.name}, email: {self.email}, company: {self.company} )" + return ( + f"User( id: {self.id}, name: {self.name}, email: {self.email}, company:" + f" {self.company} )" + ) def __str__(self) -> str: return self.__repr__() @@ -129,7 +139,11 @@ class PendingStreamCollaborator(BaseModel): token: Optional[str] def __repr__(self): - return f"PendingStreamCollaborator( inviteId: {self.inviteId}, streamId: {self.streamId}, role: {self.role}, title: {self.title}, invitedBy: {self.user.name if self.user else None})" + return ( + f"PendingStreamCollaborator( inviteId: {self.inviteId}, streamId:" + f" {self.streamId}, role: {self.role}, title: {self.title}, invitedBy:" + f" {self.user.name if self.user else None})" + ) def __str__(self) -> str: return self.__repr__() @@ -146,7 +160,10 @@ class Activity(BaseModel): time: Optional[datetime] def __repr__(self) -> str: - return f"Activity( streamId: {self.streamId}, actionType: {self.actionType}, message: {self.message}, userId: {self.userId} )" + return ( + f"Activity( streamId: {self.streamId}, actionType: {self.actionType}," + f" message: {self.message}, userId: {self.userId} )" + ) def __str__(self) -> str: return self.__repr__() @@ -158,7 +175,11 @@ class ActivityCollection(BaseModel): cursor: Optional[datetime] def __repr__(self) -> str: - return f"ActivityCollection( totalCount: {self.totalCount}, items: {len(self.items) if self.items else 0}, cursor: {self.cursor.isoformat() if self.cursor else None} )" + return ( + f"ActivityCollection( totalCount: {self.totalCount}, items:" + f" {len(self.items) if self.items else 0}, cursor:" + f" {self.cursor.isoformat() if self.cursor else None} )" + ) def __str__(self) -> str: return self.__repr__() diff --git a/src/specklepy/api/operations.py b/src/specklepy/api/operations.py index 722cd40f..600f0641 100644 --- a/src/specklepy/api/operations.py +++ b/src/specklepy/api/operations.py @@ -18,7 +18,8 @@ def send( Arguments: obj {Base} -- the object you want to send transports {list} -- where you want to send them - use_default_cache {bool} -- toggle for the default cache. If set to false, it will only send to the provided transports + use_default_cache {bool} -- toggle for the default cache. + If set to false, it will only send to the provided transports Returns: str -- the object id of the sent object @@ -26,7 +27,10 @@ def send( if not transports and not use_default_cache: raise SpeckleException( - message="You need to provide at least one transport: cannot send with an empty transport list and no default cache" + message=( + "You need to provide at least one transport: cannot send with an empty" + " transport list and no default cache" + ) ) if isinstance(transports, AbstractTransport): @@ -62,7 +66,6 @@ def _untracked_receive( remote_transport: Optional[AbstractTransport] = None, local_transport: Optional[AbstractTransport] = None, ) -> Base: - """Receives an object from a transport. Arguments: @@ -86,7 +89,10 @@ def _untracked_receive( if not remote_transport: raise SpeckleException( - message="Could not find the specified object using the local transport, and you didn't provide a fallback remote from which to pull it." + message=( + "Could not find the specified object using the local transport, and you" + " didn't provide a fallback remote from which to pull it." + ) ) obj_string = remote_transport.copy_object_and_children( @@ -98,12 +104,14 @@ def _untracked_receive( def serialize(base: Base, write_transports: List[AbstractTransport] = []) -> str: """ - Serialize a base object. If no write transports are provided, the object will be serialized + Serialize a base object. If no write transports are provided, + the object will be serialized without detaching or chunking any of the attributes. Arguments: base {Base} -- the object to serialize - write_transports {List[AbstractTransport]} -- optional: the transports to write to + write_transports {List[AbstractTransport]} + -- optional: the transports to write to Returns: str -- the serialized object @@ -118,12 +126,17 @@ def deserialize( obj_string: str, read_transport: Optional[AbstractTransport] = None ) -> Base: """ - Deserialize a string object into a Base object. If the object contains referenced child objects that are not stored in the local db, a read transport needs to be provided in order to recompose the base with the children objects. + Deserialize a string object into a Base object. + + If the object contains referenced child objects that are not stored in the local db, + a read transport needs to be provided in order to recompose + the base with the children objects. Arguments: obj_string {str} -- the string object to deserialize - read_transport {AbstractTransport} -- the transport to fetch children objects from - (defaults to SQLiteTransport) + read_transport {AbstractTransport} + -- the transport to fetch children objects from + (defaults to SQLiteTransport) Returns: Base -- the deserialized object diff --git a/src/specklepy/api/resource.py b/src/specklepy/api/resource.py index fd1519b1..47e24dfa 100644 --- a/src/specklepy/api/resource.py +++ b/src/specklepy/api/resource.py @@ -52,7 +52,7 @@ def _parse_response(self, response: Union[dict, list, None], schema=None): elif self.schema: try: return self.schema.parse_obj(response) - except: + except Exception: s = BaseObjectSerializer(read_transport=SQLiteTransport()) return s.recompose_base(response) else: @@ -61,7 +61,7 @@ def _parse_response(self, response: Union[dict, list, None], schema=None): def make_request( self, query: DocumentNode, - params: Dict = None, + params: Optional[Dict] = None, return_type: Union[str, List, None] = None, schema=None, parse_response: bool = True, @@ -72,13 +72,19 @@ def make_request( except Exception as ex: if isinstance(ex, TransportQueryError): return GraphQLException( - message=f"Failed to execute the GraphQL {self.name} request. Errors: {ex.errors}", + message=( + f"Failed to execute the GraphQL {self.name} request. Errors:" + f" {ex.errors}" + ), errors=ex.errors, data=ex.data, ) else: return SpeckleException( - message=f"Failed to execute the GraphQL {self.name} request. Inner exception: {ex}", + message=( + f"Failed to execute the GraphQL {self.name} request. Inner" + f" exception: {ex}" + ), exception=ex, ) @@ -90,16 +96,20 @@ def make_request( return response def _check_server_version_at_least( - self, target_version: Tuple[Any, ...], unsupported_message: str = None + self, target_version: Tuple[Any, ...], unsupported_message: Optional[str] = None ): """Use this check to guard against making unsupported requests on older servers. Arguments: - target_version {tuple} -- the minimum server version in the format (major, minor, patch, (tag, build)) - eg (2, 6, 3) for a stable build and (2, 6, 4, 'alpha', 4711) for alpha + target_version {tuple} + the minimum server version in the format (major, minor, patch, (tag, build)) + eg (2, 6, 3) for a stable build and (2, 6, 4, 'alpha', 4711) for alpha """ if not unsupported_message: - unsupported_message = f"The client method used is not supported on Speckle Server versions prior to v{'.'.join(target_version)}" + unsupported_message = ( + "The client method used is not supported on Speckle Server versions" + f" prior to v{'.'.join(target_version)}" + ) # if version is dev, it should be supported... (or not) if self.server_version == ("dev",): return @@ -112,8 +122,7 @@ def _check_invites_supported(self): """ self._check_server_version_at_least( (2, 6, 4), - ( - "Stream invites are only supported as of Speckle Server v2.6.4. " - "Please update your Speckle Server to use this method or use the `grant_permission` flow instead." - ), + "Stream invites are only supported as of Speckle Server v2.6.4. Please" + " update your Speckle Server to use this method or use the" + " `grant_permission` flow instead.", ) diff --git a/src/specklepy/api/resources/__init__.py b/src/specklepy/api/resources/__init__.py index 42512fa4..13beff43 100644 --- a/src/specklepy/api/resources/__init__.py +++ b/src/specklepy/api/resources/__init__.py @@ -2,8 +2,7 @@ import sys from importlib import import_module -for (_, name, _) in pkgutil.iter_modules(__path__): - +for _, name, _ in pkgutil.iter_modules(__path__): imported_module = import_module("." + name, package=__name__) if hasattr(imported_module, "Resource"): diff --git a/src/specklepy/api/resources/active_user.py b/src/specklepy/api/resources/active_user.py index 46fb6b71..9f9128a6 100644 --- a/src/specklepy/api/resources/active_user.py +++ b/src/specklepy/api/resources/active_user.py @@ -25,7 +25,9 @@ def __init__(self, account, basepath, client, server_version) -> None: self.schema = User def get(self) -> User: - """Gets the profile of a user. If no id argument is provided, will return the current authenticated user's profile (as extracted from the authorization header). + """Gets the profile of a user. If no id argument is provided, + will return the current authenticated user's profile + (as extracted from the authorization header). Arguments: id {str} -- the user id @@ -88,7 +90,9 @@ def update( if not params["user"]: return SpeckleException( - message="You must provide at least one field to update your user profile" + message=( + "You must provide at least one field to update your user profile" + ) ) return self.make_request( @@ -104,24 +108,42 @@ def activity( cursor: Optional[datetime] = None, ): """ - Get the activity from a given stream in an Activity collection. Step into the activity `items` for the list of activity. - If no id argument is provided, will return the current authenticated user's activity (as extracted from the authorization header). + Get the activity from a given stream in an Activity collection. + Step into the activity `items` for the list of activity. + If no id argument is provided, will return the current authenticated user's + activity (as extracted from the authorization header). - Note: all timestamps arguments should be `datetime` of any tz as they will be converted to UTC ISO format strings + Note: all timestamps arguments should be `datetime` of any tz as they will be + converted to UTC ISO format strings user_id {str} -- the id of the user to get the activity from - action_type {str} -- filter results to a single action type (eg: `commit_create` or `commit_receive`) + action_type {str} -- filter results to a single action type + (eg: `commit_create` or `commit_receive`) limit {int} -- max number of Activity items to return - before {datetime} -- latest cutoff for activity (ie: return all activity _before_ this time) - after {datetime} -- oldest cutoff for activity (ie: return all activity _after_ this time) + before {datetime} -- latest cutoff for activity + (ie: return all activity _before_ this time) + after {datetime} -- oldest cutoff for activity + (ie: return all activity _after_ this time) cursor {datetime} -- timestamp cursor for pagination """ query = gql( """ - query UserActivity($action_type: String, $before:DateTime, $after: DateTime, $cursor: DateTime, $limit: Int){ + query UserActivity( + $action_type: String, + $before:DateTime, + $after: DateTime, + $cursor: DateTime, + $limit: Int + ){ activeUser { - activity(actionType: $action_type, before: $before, after: $after, cursor: $cursor, limit: $limit) { + activity( + actionType: $action_type, + before: $before, + after: $after, + cursor: $cursor, + limit: $limit + ) { totalCount cursor items { @@ -161,7 +183,8 @@ def get_all_pending_invites(self) -> List[PendingStreamCollaborator]: Requires Speckle Server version >= 2.6.4 Returns: - List[PendingStreamCollaborator] -- a list of pending invites for the current user + List[PendingStreamCollaborator] + -- a list of pending invites for the current user """ metrics.track(metrics.INVITE, self.account, {"name": "get"}) self._check_invites_supported() @@ -207,7 +230,8 @@ def get_pending_invite( token {str} -- the token of the invite to look for (optional) Returns: - PendingStreamCollaborator -- the invite for the given stream (or None if it isn't found) + PendingStreamCollaborator + -- the invite for the given stream (or None if it isn't found) """ metrics.track(metrics.INVITE, self.account, {"name": "get"}) self._check_invites_supported() diff --git a/src/specklepy/api/resources/object.py b/src/specklepy/api/resources/object.py index dd802382..70e116b5 100644 --- a/src/specklepy/api/resources/object.py +++ b/src/specklepy/api/resources/object.py @@ -61,21 +61,28 @@ def create(self, stream_id: str, objects: List[Dict]) -> str: """ Not advised - generally, you want to use `operations.send()`. - Create a new object on a stream. To send a base object, you can prepare it by running it through the - `BaseObjectSerializer.traverse_base()` function to get a valid (serialisable) object to send. + Create a new object on a stream. + To send a base object, you can prepare it by running it through the + `BaseObjectSerializer.traverse_base()` function to get a valid (serialisable) + object to send. - NOTE: this does not create a commit - you can create one with `SpeckleClient.commit.create`. Dynamic fields will be located in the 'data' dict of the received `Base` object + NOTE: this does not create a commit - you can create one with + `SpeckleClient.commit.create`. + Dynamic fields will be located in the 'data' dict of the received `Base` object Arguments: stream_id {str} -- the id of the stream you want to send the object to - objects {List[Dict]} -- a list of base dictionary objects (NOTE: must be json serialisable) + objects {List[Dict]} + -- a list of base dictionary objects (NOTE: must be json serialisable) Returns: str -- the id of the object """ query = gql( """ - mutation ObjectCreate($object_input: ObjectCreateInput!) { objectCreate(objectInput: $object_input) } + mutation ObjectCreate($object_input: ObjectCreateInput!) { + objectCreate(objectInput: $object_input) + } """ ) params = {"object_input": {"streamId": stream_id, "objects": objects}} diff --git a/src/specklepy/api/resources/other_user.py b/src/specklepy/api/resources/other_user.py index 8496c794..a95f3700 100644 --- a/src/specklepy/api/resources/other_user.py +++ b/src/specklepy/api/resources/other_user.py @@ -58,7 +58,8 @@ def get(self, id: str) -> LimitedUser: def search( self, search_query: str, limit: int = 25 ) -> Union[List[LimitedUser], SpeckleException]: - """Searches for user by name or email. The search query must be at least 3 characters long + """Searches for user by name or email. The search query must be at least + 3 characters long Arguments: search_query {str} -- a string to search for @@ -104,23 +105,41 @@ def activity( cursor: Optional[datetime] = None, ) -> ActivityCollection: """ - Get the activity from a given stream in an Activity collection. Step into the activity `items` for the list of activity. + Get the activity from a given stream in an Activity collection. + Step into the activity `items` for the list of activity. - Note: all timestamps arguments should be `datetime` of any tz as they will be converted to UTC ISO format strings + Note: all timestamps arguments should be `datetime` of + any tz as they will be converted to UTC ISO format strings user_id {str} -- the id of the user to get the activity from - action_type {str} -- filter results to a single action type (eg: `commit_create` or `commit_receive`) + action_type {str} -- filter results to a single action type + (eg: `commit_create` or `commit_receive`) limit {int} -- max number of Activity items to return - before {datetime} -- latest cutoff for activity (ie: return all activity _before_ this time) - after {datetime} -- oldest cutoff for activity (ie: return all activity _after_ this time) + before {datetime} -- latest cutoff for activity + (ie: return all activity _before_ this time) + after {datetime} -- oldest cutoff for activity + (ie: return all activity _after_ this time) cursor {datetime} -- timestamp cursor for pagination """ query = gql( """ - query UserActivity($user_id: String!, $action_type: String, $before:DateTime, $after: DateTime, $cursor: DateTime, $limit: Int){ + query UserActivity( + $user_id: String!, + $action_type: String, + $before:DateTime, + $after: DateTime, + $cursor: DateTime, + $limit: Int + ){ otherUser(id: $user_id) { - activity(actionType: $action_type, before: $before, after: $after, cursor: $cursor, limit: $limit) { + activity( + actionType: $action_type, + before: $before, + after: $after, + cursor: $cursor, + limit: $limit + ) { totalCount cursor items { diff --git a/src/specklepy/api/resources/server.py b/src/specklepy/api/resources/server.py index c2d4163d..c7566cc4 100644 --- a/src/specklepy/api/resources/server.py +++ b/src/specklepy/api/resources/server.py @@ -66,8 +66,8 @@ def version(self) -> Tuple[Any, ...]: """Get the server version Returns: - tuple -- the server version in the format (major, minor, patch, (tag, build)) - eg (2, 6, 3) for a stable build and (2, 6, 4, 'alpha', 4711) for alpha + the server version in the format (major, minor, patch, (tag, build)) + eg (2, 6, 3) for a stable build and (2, 6, 4, 'alpha', 4711) for alpha """ # not tracking as it will be called along with other mutations / queries as a check query = gql( diff --git a/src/specklepy/api/resources/stream.py b/src/specklepy/api/resources/stream.py index a1306cf1..a6cd267f 100644 --- a/src/specklepy/api/resources/stream.py +++ b/src/specklepy/api/resources/stream.py @@ -1,5 +1,5 @@ from datetime import datetime, timezone -from typing import List, Optional +from typing import List from deprecated import deprecated from gql import gql @@ -346,8 +346,8 @@ def favorite(self, stream_id: str, favorited: bool = True): @deprecated( version="2.6.4", reason=( - "As of Speckle Server v2.6.4, this method is deprecated. " - "Users need to be invited and accept the invite before being added to a stream" + "As of Speckle Server v2.6.4, this method is deprecated. Users need to be" + " invited and accept the invite before being added to a stream" ), ) def grant_permission(self, stream_id: str, user_id: str, role: str): @@ -370,11 +370,10 @@ def grant_permission(self, stream_id: str, user_id: str, role: str): self.server_version == ("dev",) or self.server_version >= (2, 6, 4) ): raise UnsupportedException( - ( - "Server mutation `grant_permission` is no longer supported as of Speckle Server v2.6.4. " - "Please use the new `update_permission` method to change an existing user's permission " - "or use the `invite` method to invite a user to a stream." - ) + "Server mutation `grant_permission` is no longer supported as of" + " Speckle Server v2.6.4. Please use the new `update_permission` method" + " to change an existing user's permission or use the `invite` method to" + " invite a user to a stream." ) query = gql( @@ -482,7 +481,8 @@ def invite( if email is None and user_id is None: raise SpeckleException( - "You must provide either an email or a user id to use the `stream.invite` method" + "You must provide either an email or a user id to use the" + " `stream.invite` method" ) query = gql( @@ -533,7 +533,8 @@ def invite_batch( self._check_invites_supported() if emails is None and user_ids is None: raise SpeckleException( - "You must provide either an email or a user id to use the `stream.invite` method" + "You must provide either an email or a user id to use the" + " `stream.invite` method" ) query = gql( @@ -650,10 +651,9 @@ def update_permission(self, stream_id: str, user_id: str, role: str): self.server_version != ("dev",) and self.server_version < (2, 6, 4) ): raise UnsupportedException( - ( - "Server mutation `update_permission` is only supported as of Speckle Server v2.6.4. " - "Please update your Speckle Server to use this method or use the `grant_permission` method instead." - ) + "Server mutation `update_permission` is only supported as of Speckle" + " Server v2.6.4. Please update your Speckle Server to use this method" + " or use the `grant_permission` method instead." ) query = gql( """ @@ -764,7 +764,8 @@ def activity( } except AttributeError as e: raise SpeckleException( - "Could not get stream activity - `before`, `after`, and `cursor` must be in `datetime` format if provided", + "Could not get stream activity - `before`, `after`, and `cursor` must" + " be in `datetime` format if provided", ValueError, ) from e diff --git a/src/specklepy/api/resources/subscriptions.py b/src/specklepy/api/resources/subscriptions.py index 8bdf021b..9651a0fd 100644 --- a/src/specklepy/api/resources/subscriptions.py +++ b/src/specklepy/api/resources/subscriptions.py @@ -1,5 +1,5 @@ from functools import wraps -from typing import Callable, Dict, List, Union +from typing import Callable, Dict, List, Optional, Union from gql import gql from graphql import DocumentNode @@ -36,11 +36,13 @@ def __init__(self, account, basepath, client) -> None: ) @check_wsclient - async def stream_added(self, callback: Callable = None): - """Subscribes to new stream added event for your profile. Use this to display an up-to-date list of streams. + async def stream_added(self, callback: Optional[Callable] = None): + """Subscribes to new stream added event for your profile. + Use this to display an up-to-date list of streams. Arguments: - callback {Callable[Stream]} -- a function that takes the updated stream as an argument and executes each time a stream is added + callback {Callable[Stream]} -- a function that takes the updated stream + as an argument and executes each time a stream is added Returns: Stream -- the update stream @@ -55,12 +57,16 @@ async def stream_added(self, callback: Callable = None): ) @check_wsclient - async def stream_updated(self, id: str, callback: Callable = None): - """Subscribes to stream updated event. Use this in clients/components that pertain only to this stream. + async def stream_updated(self, id: str, callback: Optional[Callable] = None): + """ + Subscribes to stream updated event. + Use this in clients/components that pertain only to this stream. Arguments: id {str} -- the stream id of the stream to subscribe to - callback {Callable[Stream]} -- a function that takes the updated stream as an argument and executes each time the stream is updated + callback {Callable[Stream]} + -- a function that takes the updated stream + as an argument and executes each time the stream is updated Returns: Stream -- the update stream @@ -81,11 +87,17 @@ async def stream_updated(self, id: str, callback: Callable = None): ) @check_wsclient - async def stream_removed(self, callback: Callable = None): - """Subscribes to stream removed event for your profile. Use this to display an up-to-date list of streams for your profile. NOTE: If someone revokes your permissions on a stream, this subscription will be triggered with an extra value of revokedBy in the payload. + async def stream_removed(self, callback: Optional[Callable] = None): + """Subscribes to stream removed event for your profile. + Use this to display an up-to-date list of streams for your profile. + NOTE: If someone revokes your permissions on a stream, + this subscription will be triggered with an extra value of revokedBy + in the payload. Arguments: - callback {Callable[Dict]} -- a function that takes the returned dict as an argument and executes each time a stream is removed + callback {Callable[Dict]} + -- a function that takes the returned dict as an argument + and executes each time a stream is removed Returns: dict -- dict containing 'id' of stream removed and optionally 'revokedBy' @@ -107,9 +119,9 @@ async def stream_removed(self, callback: Callable = None): async def subscribe( self, query: DocumentNode, - params: Dict = None, - callback: Callable = None, - return_type: Union[str, List] = None, + params: Optional[Dict] = None, + callback: Optional[Callable] = None, + return_type: Optional[Union[str, List]] = None, schema=None, parse_response: bool = True, ): diff --git a/src/specklepy/api/resources/user.py b/src/specklepy/api/resources/user.py index 4e234173..602a3708 100644 --- a/src/specklepy/api/resources/user.py +++ b/src/specklepy/api/resources/user.py @@ -12,7 +12,10 @@ NAME = "user" DEPRECATION_VERSION = "2.9.0" -DEPRECATION_TEXT = "The user resource is deprecated, please use the active_user or other_user resources" +DEPRECATION_TEXT = ( + "The user resource is deprecated, please use the active_user or other_user" + " resources" +) class Resource(ResourceBase): @@ -137,7 +140,9 @@ def update( if not params["user"]: return SpeckleException( - message="You must provide at least one field to update your user profile" + message=( + "You must provide at least one field to update your user profile" + ) ) return self.make_request( diff --git a/src/specklepy/api/wrapper.py b/src/specklepy/api/wrapper.py index d6e3b018..b2074c6c 100644 --- a/src/specklepy/api/wrapper.py +++ b/src/specklepy/api/wrapper.py @@ -14,11 +14,15 @@ class StreamWrapper: """ - The `StreamWrapper` gives you some handy helpers to deal with urls and get authenticated clients and transports. - - Construct a `StreamWrapper` with a stream, branch, commit, or object URL. The corresponding ids will be stored - in the wrapper. If you have local accounts on the machine, you can use the `get_account` and `get_client` methods - to get a local account for the server. You can also pass a token into `get_client` if you don't have a corresponding + The `StreamWrapper` gives you some handy helpers to deal with urls and + get authenticated clients and transports. + + Construct a `StreamWrapper` with a stream, branch, commit, or object URL. + The corresponding ids will be stored + in the wrapper. If you have local accounts on the machine, + you can use the `get_account` and `get_client` methods + to get a local account for the server. You can also pass a token into `get_client` + if you don't have a corresponding local account for the server. ```py @@ -46,7 +50,10 @@ class StreamWrapper: _account: Account = None def __repr__(self): - return f"StreamWrapper( server: {self.host}, stream_id: {self.stream_id}, type: {self.type} )" + return ( + f"StreamWrapper( server: {self.host}, stream_id: {self.stream_id}, type:" + f" {self.type} )" + ) def __str__(self) -> str: return self.__repr__() @@ -72,7 +79,8 @@ def __init__(self, url: str) -> None: if not segments or len(segments) < 2: raise SpeckleException( - f"Cannot parse {url} into a stream wrapper class - invalid URL provided." + f"Cannot parse {url} into a stream wrapper class - invalid URL" + " provided." ) while segments: @@ -91,7 +99,8 @@ def __init__(self, url: str) -> None: self.commit_id = segments.pop(0) else: raise SpeckleException( - f"Cannot parse {url} into a stream wrapper class - invalid URL provided." + f"Cannot parse {url} into a stream wrapper class - invalid URL" + " provided." ) if not self.stream_id: @@ -105,7 +114,8 @@ def server_url(self): def get_account(self, token: str = None) -> Account: """ - Gets an account object for this server from the local accounts db (added via Speckle Manager or a json file) + Gets an account object for this server from the local accounts db + (added via Speckle Manager or a json file) """ if self._account and self._account.token: return self._account @@ -129,14 +139,18 @@ def get_account(self, token: str = None) -> Account: def get_client(self, token: str = None) -> SpeckleClient: """ - Gets an authenticated client for this server. You may provide a token if there aren't any local accounts on this - machine. If no account is found and no token is provided, an unauthenticated client is returned. + Gets an authenticated client for this server. + You may provide a token if there aren't any local accounts on this + machine. If no account is found and no token is provided, + an unauthenticated client is returned. Arguments: - token {str} -- optional token if no local account is available (defaults to None) + token {str} + -- optional token if no local account is available (defaults to None) Returns: - SpeckleClient -- authenticated with a corresponding local account or the provided token + SpeckleClient + -- authenticated with a corresponding local account or the provided token """ if self._client and token is None: return self._client @@ -160,11 +174,14 @@ def get_client(self, token: str = None) -> SpeckleClient: def get_transport(self, token: str = None) -> ServerTransport: """ - Gets a server transport for this stream using an authenticated client. If there is no local account for this - server and the client was not authenticated with a token, this will throw an exception. + Gets a server transport for this stream using an authenticated client. + If there is no local account for this + server and the client was not authenticated with a token, + this will throw an exception. Returns: - ServerTransport -- constructed for this stream with a pre-authenticated client + ServerTransport -- constructed for this stream + with a pre-authenticated client """ if not self._account or not self._account.token: self.get_account(token) diff --git a/src/specklepy/logging/exceptions.py b/src/specklepy/logging/exceptions.py index 04eb452c..bf7ecefa 100644 --- a/src/specklepy/logging/exceptions.py +++ b/src/specklepy/logging/exceptions.py @@ -13,9 +13,11 @@ def __str__(self) -> str: class SpeckleInvalidUnitException(SpeckleException): def __init__(self, invalid_unit: Any) -> None: - super().__init__( - message=f"Invalid units: expected type str but received {type(invalid_unit)} ({invalid_unit}).", + message=( + "Invalid units: expected type str but received" + f" {type(invalid_unit)} ({invalid_unit})." + ), exception=None, ) @@ -27,7 +29,10 @@ def __init__(self, message: str, obj: Any, exception: Exception = None) -> None: self.unhandled_type = type(obj) def __str__(self) -> str: - return f"SpeckleException: Could not serialize object of type {self.unhandled_type}" + return ( + "SpeckleException: Could not serialize object of type" + f" {self.unhandled_type}" + ) class GraphQLException(SpeckleException): diff --git a/src/specklepy/logging/metrics.py b/src/specklepy/logging/metrics.py index fc197aaf..56e9302c 100644 --- a/src/specklepy/logging/metrics.py +++ b/src/specklepy/logging/metrics.py @@ -58,7 +58,11 @@ def set_host_app(host_app: str, host_app_version: Optional[str] = None): HOST_APP_VERSION = host_app_version or HOST_APP_VERSION -def track(action: str, account: "Account" = None, custom_props: Optional[dict] = None): +def track( + action: str, + account: Optional["Account"] = None, + custom_props: Optional[dict] = None, +): if not TRACK: return try: @@ -84,7 +88,7 @@ def track(action: str, account: "Account" = None, custom_props: Optional[dict] = LOG.debug(f"Error queueing metrics request: {str(ex)}") -def initialise_tracker(account: "Account" = None): +def initialise_tracker(account: Optional["Account"] = None): global METRICS_TRACKER if not METRICS_TRACKER: METRICS_TRACKER = MetricsTracker() diff --git a/src/specklepy/objects/base.py b/src/specklepy/objects/base.py index 6e5ac0ab..11150682 100644 --- a/src/specklepy/objects/base.py +++ b/src/specklepy/objects/base.py @@ -149,7 +149,7 @@ def __init_subclass__( raise ValueError( f"The speckle_type: {speckle_type} is already registered for type: " f"{cls._type_registry[cls.speckle_type].__name__}. " - f"Please choose a different type name." + "Please choose a different type name." ) cls._type_registry[cls.speckle_type] = cls # type: ignore try: @@ -334,11 +334,14 @@ def __setattr__(self, name: str, value: Any) -> None: @classmethod def update_forward_refs(cls) -> None: """ - Attempts to populate the internal defined types dict for type checking sometime after defining the class. - This is already done when defining the class, but can be called again if references to undefined types were + Attempts to populate the internal defined types dict for type checking + sometime after defining the class. + This is already done when defining the class, but can be called + again if references to undefined types were included. - See `objects.geometry` for an example of how this is used with the Brep class definitions + See `objects.geometry` for an example of how this is used with + the Brep class definitions. """ try: cls._attr_types = get_type_hints(cls) @@ -387,7 +390,8 @@ def add_chunkable_attrs(self, **kwargs: int) -> None: Mark defined attributes as chunkable for serialisation Arguments: - kwargs {int} -- the name of the attribute as the keyword and the chunk size as the arg + kwargs {int} -- the name of the attribute as the keyword + and the chunk size as the arg """ chunkable = {k: v for k, v in kwargs.items() if isinstance(v, int)} self._chunkable = dict(self._chunkable, **chunkable) @@ -397,7 +401,7 @@ def add_detachable_attrs(self, names: Set[str]) -> None: Mark defined attributes as detachable for serialisation Arguments: - names {Set[str]} -- the names of the attributes to detach as a set of strings + names {Set[str]} -- the names of the attributes to detach as a set of string """ self._detachable = self._detachable.union(names) @@ -409,7 +413,7 @@ def units(self) -> Union[str, None]: @units.setter def units(self, value: Union[str, Units, None]): - if value == None: + if value is None: units = value elif isinstance(value, Units): units: Units = value @@ -448,13 +452,17 @@ def get_children_count(self) -> int: def get_id(self, decompose: bool = False) -> str: """ - Gets the id (a unique hash) of this object. ⚠️ This method fully serializes the object which, - in the case of large objects (with many sub-objects), has a tangible cost. Avoid using it! + Gets the id (a unique hash) of this object. + ⚠️ This method fully serializes the object which, + in the case of large objects (with many sub-objects), has a tangible cost. + Avoid using it! - Note: the hash of a decomposed object differs from that of a non-decomposed object + Note: the hash of a decomposed object differs from that of a + non-decomposed object Arguments: - decompose {bool} -- if True, will decompose the object in the process of hashing it + decompose {bool} -- if True, will decompose the object in + the process of hashing it Returns: str -- the hash (id) of the fully serialized object diff --git a/src/specklepy/objects/geometry.py b/src/specklepy/objects/geometry.py index 78d9a349..469cc65e 100644 --- a/src/specklepy/objects/geometry.py +++ b/src/specklepy/objects/geometry.py @@ -1,4 +1,4 @@ -from enum import Enum, IntEnum, auto +from enum import Enum from typing import Any, List, Optional from specklepy.objects.base import Base @@ -15,11 +15,17 @@ class Point(Base, speckle_type=GEOMETRY + "Point"): z: float = 0.0 def __repr__(self) -> str: - return f"{self.__class__.__name__}(x: {self.x}, y: {self.y}, z: {self.z}, id: {self.id}, speckle_type: {self.speckle_type})" + return ( + f"{self.__class__.__name__}(x: {self.x}, y: {self.y}, z: {self.z}, id:" + f" {self.id}, speckle_type: {self.speckle_type})" + ) @classmethod def from_list(cls, args: List[float]) -> "Point": - """Create a new Point from a list of three floats representing the x, y, and z coordinates""" + """ + Create a new Point from a list of three floats + representing the x, y, and z coordinates + """ return cls(x=args[0], y=args[1], z=args[2]) def to_list(self) -> List[Any]: diff --git a/src/specklepy/objects/other.py b/src/specklepy/objects/other.py index 705e05d2..9ba3921a 100644 --- a/src/specklepy/objects/other.py +++ b/src/specklepy/objects/other.py @@ -77,7 +77,8 @@ class Transform( """The 4x4 transformation matrix The 3x3 sub-matrix determines scaling. - The 4th column defines translation, where the last value is a divisor (usually equal to 1). + The 4th column defines translation, + where the last value is a divisor (usually equal to 1). """ _value: Optional[List[float]] = None @@ -93,12 +94,14 @@ def value(self, value: List[float]) -> None: value = [float(x) for x in value] except (ValueError, TypeError) as error: raise ValueError( - f"Could not create a Transform object with the requested value. Input must be a 16 element list of numbers. Value provided: {value}" + "Could not create a Transform object with the requested value. Input" + f" must be a 16 element list of numbers. Value provided: {value}" ) from error if len(value) != 16: raise ValueError( - f"Could not create a Transform object: input list should be 16 floats long, but was {len(value)} long" + "Could not create a Transform object: input list should be 16 floats" + f" long, but was {len(value)} long" ) self._value = value @@ -163,14 +166,16 @@ def apply_to_points_values(self, points_value: List[float]) -> List[float]: """Transform a list of speckle Points Arguments: - points {List[float]} -- a flat list of floats representing points to transform + points {List[float]} + -- a flat list of floats representing points to transform Returns: List[float] -- a new transformed list """ if len(points_value) % 3 != 0: raise ValueError( - "Cannot apply transform as the points list is malformed: expected length to be multiple of 3" + "Cannot apply transform as the points list is malformed: expected" + " length to be multiple of 3" ) transformed = [] for i in range(0, len(points_value), 3): @@ -207,11 +212,13 @@ def apply_to_vector_value(self, vector_value: List[float]) -> List[float]: ][:3] @classmethod - def from_list(cls, value: List[float] = None) -> "Transform": - """Returns a Transform object from a list of 16 numbers. If no value is provided, an identity transform will be returned. + def from_list(cls, value: Optional[List[float]] = None) -> "Transform": + """Returns a Transform object from a list of 16 numbers. + If no value is provided, an identity transform will be returned. Arguments: - value {List[float]} -- the matrix as a flat list of 16 numbers (defaults to the identity transform) + value {List[float]} -- the matrix as a flat list of 16 numbers + (defaults to the identity transform) Returns: Transform -- a complete transform object diff --git a/src/specklepy/objects/structural/loading.py b/src/specklepy/objects/structural/loading.py index 95d92fdc..9e6f1e59 100644 --- a/src/specklepy/objects/structural/loading.py +++ b/src/specklepy/objects/structural/loading.py @@ -9,7 +9,6 @@ class LoadType(int, Enum): - none = 0 Dead = 1 SuperDead = 2 @@ -32,7 +31,6 @@ class LoadType(int, Enum): class ActionType(int, Enum): - none = 0 Permanent = 1 Variable = 2 @@ -40,7 +38,6 @@ class ActionType(int, Enum): class BeamLoadType(int, Enum): - Point = 0 Uniform = 1 Linear = 2 @@ -49,21 +46,18 @@ class BeamLoadType(int, Enum): class FaceLoadType(int, Enum): - Constant = 0 Variable = 1 Point = 2 class LoadDirection2D(int, Enum): - X = 0 Y = 1 Z = 2 class LoadDirection(int, Enum): - X = 0 Y = 1 Z = 2 @@ -81,7 +75,6 @@ class LoadAxisType(int, Enum): class CombinationType(int, Enum): - LinearAdd = 0 Envelope = 1 AbsoluteAdd = 2 diff --git a/src/specklepy/objects/structural/properties.py b/src/specklepy/objects/structural/properties.py index a3e3138e..2d10780c 100644 --- a/src/specklepy/objects/structural/properties.py +++ b/src/specklepy/objects/structural/properties.py @@ -38,7 +38,6 @@ class ReferenceSurface(int, Enum): class PropertyType2D(int, Enum): - Stress = 0 Fabric = 1 Plate = 2 diff --git a/src/specklepy/serialization/base_object_serializer.py b/src/specklepy/serialization/base_object_serializer.py index 7d4f1548..acf11d72 100644 --- a/src/specklepy/serialization/base_object_serializer.py +++ b/src/specklepy/serialization/base_object_serializer.py @@ -2,15 +2,13 @@ import re import warnings from enum import Enum -from typing import Any, Dict, List, Tuple +from typing import Any, Dict, List, Optional, Tuple from uuid import uuid4 from warnings import warn import ujson # import for serialization -import specklepy.objects.geometry -import specklepy.objects.other from specklepy.logging.exceptions import SpeckleException, SpeckleWarning from specklepy.objects.base import Base, DataChunk from specklepy.transports.abstract_transport import AbstractTransport @@ -29,7 +27,8 @@ def safe_json_loads(obj: str, obj_id=None) -> Any: import json warn( - f"Failed to deserialise object (id: {obj_id}). This is likely a ujson big int error - falling back to json. \nError: {err}", + f"Failed to deserialise object (id: {obj_id}). This is likely a ujson big" + f" int error - falling back to json. \nError: {err}", SpeckleWarning, ) return json.loads(obj) @@ -47,7 +46,9 @@ class BaseObjectSerializer: ] # holds deserialized objects so objects with same id return the same instance def __init__( - self, write_transports: List[AbstractTransport] = None, read_transport=None + self, + write_transports: Optional[List[AbstractTransport]] = None, + read_transport: Optional[AbstractTransport] = None, ) -> None: self.write_transports = write_transports or [] self.read_transport = read_transport @@ -63,7 +64,8 @@ def write_json(self, base: Base): base {Base} -- the base object to be decomposed and serialized Returns: - (str, str) -- a tuple containing the object id of the base object and the serialized object string + (str, str) -- a tuple containing the object id of the base object and + the serialized object string """ obj_id, obj = self.traverse_base(base) @@ -77,7 +79,8 @@ def traverse_base(self, base: Base) -> Tuple[str, Dict]: base {Base} -- the base object to be decomposed and serialized Returns: - (str, dict) -- a tuple containing the object id of the base object and the constructed serializable dictionary + (str, dict) -- a tuple containing the object id of the base object and + the constructed serializable dictionary """ self.__reset_writer() @@ -247,16 +250,19 @@ def traverse_value(self, obj: Any, detach: bool = False) -> Any: else: try: return obj.dict() - except: + except Exception: warn( - f"Failed to handle {type(obj)} in `BaseObjectSerializer.traverse_value`", + f"Failed to handle {type(obj)} in" + " `BaseObjectSerializer.traverse_value`", SpeckleWarning, ) return str(obj) def detach_helper(self, ref_id: str) -> Dict[str, str]: - """Helper to keep track of detached objects and their depth in the family tree and create reference objects to place in the parent object + """ + Helper to keep track of detached objects and their depth in the family tree + and create reference objects to place in the parent object Arguments: ref_id {str} -- the id of the fully traversed object @@ -279,7 +285,10 @@ def detach_helper(self, ref_id: str) -> Dict[str, str]: } def __reset_writer(self) -> None: - """Reinitializes the lineage, and other variables that get used during the json writing process""" + """ + Reinitializes the lineage, and other variables that get used during the json + writing process + """ self.detach_lineage = [True] self.lineage = [] self.family_tree = {} @@ -356,7 +365,8 @@ def recompose_base(self, obj: dict) -> Base: base.__setattr__(prop, self.recompose_base(obj=ref_obj)) else: warnings.warn( - f"Could not find the referenced child object of id `{ref_id}` in the given read transport: {self.read_transport.name}", + f"Could not find the referenced child object of id `{ref_id}`" + f" in the given read transport: {self.read_transport.name}", SpeckleWarning, ) base.__setattr__(prop, self.handle_value(value)) @@ -371,7 +381,8 @@ def recompose_base(self, obj: dict) -> Base: return base def handle_value(self, obj: Any): - """Helper for recomposing a base object by handling the dictionary representation's values + """Helper for recomposing a base object by handling the dictionary + representation's values Arguments: obj {Any} -- a value from the base object dictionary @@ -417,7 +428,8 @@ def get_child(self, obj: Dict): ref_obj_str = self.read_transport.get_object(id=ref_id) if not ref_obj_str: warnings.warn( - f"Could not find the referenced child object of id `{ref_id}` in the given read transport: {self.read_transport.name}", + f"Could not find the referenced child object of id `{ref_id}` in the" + f" given read transport: {self.read_transport.name}", SpeckleWarning, ) return obj diff --git a/src/specklepy/transports/server/__init__.py b/src/specklepy/transports/server/__init__.py index 60bf56d1..2eb5762e 100644 --- a/src/specklepy/transports/server/__init__.py +++ b/src/specklepy/transports/server/__init__.py @@ -1 +1 @@ -from .server import ServerTransport +from specklepy.transports.server.server import ServerTransport diff --git a/src/specklepy/transports/server/batch_sender.py b/src/specklepy/transports/server/batch_sender.py index 55c7f2a0..45daf1a5 100644 --- a/src/specklepy/transports/server/batch_sender.py +++ b/src/specklepy/transports/server/batch_sender.py @@ -108,7 +108,8 @@ def _bg_send_batch(self, session, batch): if not new_objects: LOG.info( - f"Uploading batch of {len(batch)} objects: all objects are already in the server" + f"Uploading batch of {len(batch)} objects: all objects are already in" + " the server" ) return @@ -127,11 +128,16 @@ def _bg_send_batch(self, session, batch): if r.status_code != 201: LOG.warning("Upload server response: %s", r.text) raise SpeckleException( - message=f"Could not save the object to the server - status code {r.status_code}" + message=( + "Could not save the object to the server - status code" + f" {r.status_code}" + ) ) except json.JSONDecodeError as error: return SpeckleException( - f"Failed to send objects to {self.server_url}. Please ensure this stream ({self.stream_id}) exists on this server and that you have permission to send to it.", + f"Failed to send objects to {self.server_url}. Please ensure this" + f" stream ({self.stream_id}) exists on this server and that you have" + " permission to send to it.", error, ) diff --git a/src/specklepy/transports/server/server.py b/src/specklepy/transports/server/server.py index 805799fd..7ea2e713 100644 --- a/src/specklepy/transports/server/server.py +++ b/src/specklepy/transports/server/server.py @@ -1,5 +1,5 @@ import json -from typing import Any, Dict, List +from typing import Any, Dict, List, Optional from warnings import warn import requests @@ -14,10 +14,10 @@ class ServerTransport(AbstractTransport): """ - The `ServerTransport` is the vehicle through which you transport objects to and from a Speckle Server. Provide it to - `operations.send()` or `operations.receive()`. + The `ServerTransport` is the vehicle through which you transport objects to and + from a Speckle Server. Provide it to `operations.send()` or `operations.receive()`. - The `ServerTransport` can be authenticted two different ways: + The `ServerTransport` can be authenticated two different ways: 1. by providing a `SpeckleClient` 2. by providing an `Account` 3. by providing a `token` and `url` @@ -29,14 +29,15 @@ class ServerTransport(AbstractTransport): # here's the data you want to send block = Block(length=2, height=4) - # next create the server transport - this is the vehicle through which you will send and receive + # next create the server transport - this is the vehicle through which + # you will send and receive transport = ServerTransport(stream_id=new_stream_id, client=client) # this serialises the block and sends it to the transport hash = operations.send(base=block, transports=[transport]) # you can now create a commit on your stream with this object - commid_id = client.commit.create( + commit_id = client.commit.create( stream_id=new_stream_id, obj_id=hash, message="this is a block I made in speckle-py", @@ -45,25 +46,26 @@ class ServerTransport(AbstractTransport): """ _name = "RemoteTransport" - url: str = None - stream_id: str = None - account: Account = None + url: Optional[str] = None + stream_id: Optional[str] = None + account: Optional[Account] = None saved_obj_count: int = 0 - session: requests.Session = None + session: Optional[requests.Session] = None def __init__( self, stream_id: str, - client: SpeckleClient = None, - account: Account = None, - token: str = None, - url: str = None, + client: Optional[SpeckleClient] = None, + account: Optional[Account] = None, + token: Optional[str] = None, + url: Optional[str] = None, **data: Any, ) -> None: super().__init__(**data) if client is None and account is None and token is None and url is None: raise SpeckleException( - "You must provide either a client or a token and url to construct a ServerTransport." + "You must provide either a client or a token and url to construct a" + " ServerTransport." ) if account: @@ -74,7 +76,8 @@ def __init__( if not client.account.token: warn( SpeckleWarning( - f"Unauthenticated Speckle Client provided to Server Transport for {self.url}. Receiving from private streams will fail." + "Unauthenticated Speckle Client provided to Server Transport" + f" for {self.url}. Receiving from private streams will fail." ) ) else: @@ -118,8 +121,10 @@ def get_object(self, id: str) -> str: # return obj raise SpeckleException( - "Getting a single object using `ServerTransport.get_object()` is not implemented. To get an object from the server, please use the `SpeckleClient.object.get()` route", - NotImplementedError, + "Getting a single object using `ServerTransport.get_object()` is not" + " implemented. To get an object from the server, please use the" + " `SpeckleClient.object.get()` route", + NotImplementedError(), ) def has_objects(self, id_list: List[str]) -> Dict[str, bool]: @@ -134,7 +139,8 @@ def copy_object_and_children( if r.status_code != 200: raise SpeckleException( - f"Can't get object {self.stream_id}/{id}: HTTP error {r.status_code} ({r.text[:1000]})" + f"Can't get object {self.stream_id}/{id}: HTTP error" + f" {r.status_code} ({r.text[:1000]})" ) root_obj_serialized = r.text root_obj = json.loads(root_obj_serialized) diff --git a/src/specklepy/transports/sqlite.py b/src/specklepy/transports/sqlite.py index d79b526f..d0e67a07 100644 --- a/src/specklepy/transports/sqlite.py +++ b/src/specklepy/transports/sqlite.py @@ -10,21 +10,21 @@ class SQLiteTransport(AbstractTransport): _name = "SQLite" - _base_path: str = None - _root_path: str = None - __connection: sqlite3.Connection = None + _base_path: Optional[str] = None + _root_path: Optional[str] = None + __connection: Optional[sqlite3.Connection] = None app_name: str = "" scope: str = "" saved_obj_count: int = 0 - max_size: int = None - _current_batch: List[Tuple[str, str]] = None - _current_batch_size: int = None + max_size: Optional[int] = None + _current_batch: Optional[List[Tuple[str, str]]] = None + _current_batch_size: Optional[int] = None def __init__( self, base_path: Optional[str] = None, app_name: Optional[str] = None, - scope: str = None, + scope: Optional[str] = None, max_batch_size_mb: float = 10.0, **data: Any, ) -> None: @@ -45,7 +45,9 @@ def __init__( self.__initialise() except Exception as ex: raise SpeckleException( - f"SQLiteTransport could not initialise {self.scope}.db at {self._base_path}. Either provide a different `base_path` or use an alternative transport.", + f"SQLiteTransport could not initialise {self.scope}.db at" + f" {self._base_path}. Either provide a different `base_path` or use an" + " alternative transport.", ex, ) @@ -79,14 +81,16 @@ def save_object_from_transport( Arguments: id {str} -- the object id - source_transport {AbstractTransport) -- the transport through which the object can be found + source_transport {AbstractTransport) + -- the transport through which the object can be found """ serialized_object = source_transport.get_object(id) self.save_object(id, serialized_object) def save_object(self, id: str, serialized_object: str) -> None: """ - Adds an object to the current batch to be written to the db. If the current batch is full, + Adds an object to the current batch to be written to the db. + If the current batch is full, the batch is written to the db and the current batch is reset. Arguments: @@ -118,7 +122,8 @@ def save_current_batch(self) -> None: self.__connection.commit() except Exception as ex: raise SpeckleException( - f"Could not save the batch of objects to the local db. Inner exception: {ex}", + "Could not save the batch of objects to the local db. Inner exception:" + f" {ex}", ex, ) @@ -157,7 +162,10 @@ def copy_object_and_children( raise NotImplementedError def get_all_objects(self): - """Returns all the objects in the store. NOTE: do not use for large collections!""" + """ + Returns all the objects in the store. + NOTE: do not use for large collections! + """ self.__check_connection() with closing(self.__connection.cursor()) as c: rows = c.execute("SELECT * FROM objects").fetchall() diff --git a/tests/test_base.py b/tests/test_base.py index dd667a92..f653a3a4 100644 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -13,11 +13,11 @@ @pytest.mark.parametrize( "invalid_prop_name", [ - (""), - ("@"), - ("@@wow"), - ("this.is.bad"), - ("super/bad"), + "", + "@", + "@@wow", + "this.is.bad", + "super/bad", ], ) def test_empty_prop_names(invalid_prop_name: str) -> None: @@ -95,7 +95,7 @@ def test_setting_units(): assert b.units == "ft" b.units = None # None should be a valid arg - assert b.units == None + assert b.units is None b.units = Units.none assert b.units == "none" diff --git a/tests/test_commit.py b/tests/test_commit.py index f9347e2e..9ce3c815 100644 --- a/tests/test_commit.py +++ b/tests/test_commit.py @@ -85,4 +85,4 @@ def test_commit_marked_as_received(self, client, stream, mesh) -> None: message="testing received", ) - assert commit_marked_received == True + assert commit_marked_received is True diff --git a/tests/test_geometry.py b/tests/test_geometry.py index 9c63cfdd..6b3637b3 100644 --- a/tests/test_geometry.py +++ b/tests/test_geometry.py @@ -517,8 +517,7 @@ def test_mesh_create(): mesh = Mesh.create(vertices, faces) with pytest.raises(SpeckleException): - # pylint: disable=unused-variable - bad_mesh = Mesh.create(vertices=7, faces=faces) + bad_mesh = Mesh.create(vertices=7, faces=faces) # noqa: F841 assert mesh.vertices == vertices assert mesh.textureCoordinates == [] diff --git a/tests/test_other_user.py b/tests/test_other_user.py index bd171477..106e9641 100644 --- a/tests/test_other_user.py +++ b/tests/test_other_user.py @@ -2,7 +2,6 @@ from specklepy.api.client import SpeckleClient from specklepy.api.models import Activity, ActivityCollection, LimitedUser -from specklepy.logging.exceptions import SpeckleException @pytest.mark.run(order=4) diff --git a/tests/test_serialization.py b/tests/test_serialization.py index 474bc70b..6f444795 100644 --- a/tests/test_serialization.py +++ b/tests/test_serialization.py @@ -6,7 +6,6 @@ from specklepy.objects import Base from specklepy.objects.fakemesh import FakeMesh from specklepy.objects.geometry import Point -from specklepy.serialization.base_object_serializer import BaseObjectSerializer from specklepy.transports.memory import MemoryTransport from specklepy.transports.server import ServerTransport diff --git a/tests/test_stream.py b/tests/test_stream.py index 3111a6b7..b9e06153 100644 --- a/tests/test_stream.py +++ b/tests/test_stream.py @@ -1,5 +1,3 @@ -from datetime import datetime - import pytest from specklepy.api.client import SpeckleClient diff --git a/tests/test_transforms.py b/tests/test_transforms.py index 2e8c8788..8a8fc20b 100644 --- a/tests/test_transforms.py +++ b/tests/test_transforms.py @@ -4,12 +4,7 @@ from specklepy.api import operations from specklepy.objects.geometry import Point, Vector -from specklepy.objects.other import ( - IDENTITY_TRANSFORM, - BlockDefinition, - BlockInstance, - Transform, -) +from specklepy.objects.other import Transform @pytest.fixture() @@ -81,7 +76,7 @@ def test_point_transform(point: Point, transform: Transform): def test_points_transform(points: List[Point], transform: Transform): new_points = transform.apply_to_points(points) - for (i, new_point) in enumerate(new_points): + for i, new_point in enumerate(new_points): assert new_point.x == points[i].x + 1 assert new_point.y == points[i].y + 2 assert new_point.z == points[i].z * 0.5 diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 5099110c..6129ea4d 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -1,11 +1,11 @@ import json from pathlib import Path +from typing import Generator, Iterable import pytest from specklepy.api.wrapper import StreamWrapper from specklepy.paths import accounts_path -from specklepy.transports.sqlite import SQLiteTransport def test_parse_stream(): @@ -60,7 +60,8 @@ def test_parse_globals_as_commit(): assert wrap.type == "commit" -#! NOTE: the following three tests may not pass locally if you have a `speckle.xyz` account in manager +#! NOTE: the following three tests may not pass locally +# if you have a `speckle.xyz` account in manager def test_get_client_without_auth(): wrap = StreamWrapper("https://speckle.xyz/streams/4c3ce1459c/commits/8b9b831792") client = wrap.get_client() @@ -88,16 +89,16 @@ def test_get_transport_with_token(): @pytest.fixture -def user_path() -> Path: +def user_path() -> Iterable[Path]: path = accounts_path().joinpath("test_acc.json") # hey, py37 doesn't support the missing_ok argument try: path.unlink() - except: + except Exception: pass try: path.unlink(missing_ok=True) - except: + except Exception: pass path.parent.absolute().mkdir(exist_ok=True) yield path From 2cf9b64221125d8dea90ac2a0d53bab3e7428143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= Date: Tue, 20 Dec 2022 10:47:48 +0100 Subject: [PATCH 6/8] style(server-transport): fix import export --- src/specklepy/transports/server/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/specklepy/transports/server/__init__.py b/src/specklepy/transports/server/__init__.py index 2eb5762e..00ece8e7 100644 --- a/src/specklepy/transports/server/__init__.py +++ b/src/specklepy/transports/server/__init__.py @@ -1 +1,4 @@ from specklepy.transports.server.server import ServerTransport + + +__all__ = ["ServerTransport"] From fcc33f89899b6818ffbe99cb4f00eb31ec7e92ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= Date: Tue, 20 Dec 2022 14:46:36 +0100 Subject: [PATCH 7/8] style(all-project): fix all linting errors across the project with the current setup --- example/units_none.py | 3 +- poetry.lock | 29 ++++- pyproject.toml | 1 + src/specklepy/api/resources/branch.py | 14 ++- src/specklepy/api/resources/commit.py | 25 ++-- src/specklepy/api/resources/stream.py | 118 ++++++++++++------ src/specklepy/api/resources/user.py | 45 +++++-- src/specklepy/logging/metrics.py | 4 +- .../transports/abstract_transport.py | 25 ++-- src/specklepy/transports/server/__init__.py | 1 - tests/test_wrapper.py | 2 +- 11 files changed, 191 insertions(+), 76 deletions(-) diff --git a/example/units_none.py b/example/units_none.py index 0e94bc77..1c8e06e1 100644 --- a/example/units_none.py +++ b/example/units_none.py @@ -1,3 +1,5 @@ +from devtools import debug + from specklepy.api import operations from specklepy.objects.geometry import Base from specklepy.objects.units import Units @@ -13,7 +15,6 @@ for prop, value in dct.items(): base.__setattr__(prop, value) -from devtools import debug debug(base) debug(base.units) diff --git a/poetry.lock b/poetry.lock index 33ede636..70e6c905 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1324,6 +1324,21 @@ files = [ {file = "types_Deprecated-1.2.9-py3-none-any.whl", hash = "sha256:53d05621e1d75de537f5a57d93508c8df17e37c07ee60b9fb09d39e1b7586c1e"}, ] +[[package]] +name = "types-requests" +version = "2.28.11.5" +description = "Typing stubs for requests" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "types-requests-2.28.11.5.tar.gz", hash = "sha256:a7df37cc6fb6187a84097da951f8e21d335448aa2501a6b0a39cbd1d7ca9ee2a"}, + {file = "types_requests-2.28.11.5-py3-none-any.whl", hash = "sha256:091d4a5a33c1b4f20d8b1b952aa8fa27a6e767c44c3cf65e56580df0b05fd8a9"}, +] + +[package.dependencies] +types-urllib3 = "<1.27" + [[package]] name = "types-ujson" version = "5.6.0.0" @@ -1336,6 +1351,18 @@ files = [ {file = "types_ujson-5.6.0.0-py3-none-any.whl", hash = "sha256:010b221260c24a915c6e713a83f366b91390766850ec110304de5b20c86b4b11"}, ] +[[package]] +name = "types-urllib3" +version = "1.26.25.4" +description = "Typing stubs for urllib3" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "types-urllib3-1.26.25.4.tar.gz", hash = "sha256:eec5556428eec862b1ac578fb69aab3877995a99ffec9e5a12cf7fbd0cc9daee"}, + {file = "types_urllib3-1.26.25.4-py3-none-any.whl", hash = "sha256:ed6b9e8a8be488796f72306889a06a3fc3cb1aa99af02ab8afb50144d7317e49"}, +] + [[package]] name = "typing-extensions" version = "4.4.0" @@ -1720,4 +1747,4 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "2.0" python-versions = ">=3.7.2, <4.0" -content-hash = "18bc7c2f98f551538bf1dfca42a0c3c352e98f2c0a7a59619b8fd16bd2c13e39" +content-hash = "cf8d8ae156d93c7a12ec96e876570e02de64f8763d14b4a2263cffdf98651c00" diff --git a/pyproject.toml b/pyproject.toml index b03344b8..aae42e97 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,6 +35,7 @@ commitizen = "^2.38.0" ruff = "^0.0.187" types-deprecated = "^1.2.9" types-ujson = "^5.6.0.0" +types-requests = "^2.28.11.5" [tool.black] exclude = ''' diff --git a/src/specklepy/api/resources/branch.py b/src/specklepy/api/resources/branch.py index 7f3f2280..100423dd 100644 --- a/src/specklepy/api/resources/branch.py +++ b/src/specklepy/api/resources/branch.py @@ -1,3 +1,5 @@ +from typing import Optional + from gql import gql from specklepy.api.models import Branch @@ -113,7 +115,11 @@ def list(self, stream_id: str, branches_limit: int = 10, commits_limit: int = 10 metrics.track(metrics.BRANCH, self.account, {"name": "get"}) query = gql( """ - query BranchesGet($stream_id: String!, $branches_limit: Int!, $commits_limit: Int!) { + query BranchesGet( + $stream_id: String!, + $branches_limit: Int!, + $commits_limit: Int! + ) { stream(id: $stream_id) { branches(limit: $branches_limit) { items { @@ -152,7 +158,11 @@ def list(self, stream_id: str, branches_limit: int = 10, commits_limit: int = 10 ) def update( - self, stream_id: str, branch_id: str, name: str = None, description: str = None + self, + stream_id: str, + branch_id: str, + name: Optional[str] = None, + description: Optional[str] = None, ): """Update a branch diff --git a/src/specklepy/api/resources/commit.py b/src/specklepy/api/resources/commit.py index b3eed8f9..fa190253 100644 --- a/src/specklepy/api/resources/commit.py +++ b/src/specklepy/api/resources/commit.py @@ -116,9 +116,13 @@ def create( Arguments: stream_id {str} -- the stream you want to commit to object_id {str} -- the hash of your commit object - branch_name {str} -- the name of the branch to commit to (defaults to "main") - message {str} -- optional: a message to give more information about the commit - source_application{str} -- optional: the application from which the commit was created (defaults to "python") + branch_name {str} + -- the name of the branch to commit to (defaults to "main") + message {str} + -- optional: a message to give more information about the commit + source_application{str} + -- optional: the application from which the commit was created + (defaults to "python") parents {List[str]} -- optional: the id of the parent commits Returns: @@ -127,7 +131,8 @@ def create( metrics.track(metrics.COMMIT, self.account, {"name": "create"}) query = gql( """ - mutation CommitCreate ($commit: CommitCreateInput!){ commitCreate(commit: $commit)} + mutation CommitCreate ($commit: CommitCreateInput!) + { commitCreate(commit: $commit)} """ ) params = { @@ -151,7 +156,8 @@ def update(self, stream_id: str, commit_id: str, message: str) -> bool: Update a commit Arguments: - stream_id {str} -- the id of the stream that contains the commit you'd like to update + stream_id {str} + -- the id of the stream that contains the commit you'd like to update commit_id {str} -- the id of the commit you'd like to update message {str} -- the updated commit message @@ -161,7 +167,8 @@ def update(self, stream_id: str, commit_id: str, message: str) -> bool: metrics.track(metrics.COMMIT, self.account, {"name": "update"}) query = gql( """ - mutation CommitUpdate($commit: CommitUpdateInput!){ commitUpdate(commit: $commit)} + mutation CommitUpdate($commit: CommitUpdateInput!) + { commitUpdate(commit: $commit)} """ ) params = { @@ -177,7 +184,8 @@ def delete(self, stream_id: str, commit_id: str) -> bool: Delete a commit Arguments: - stream_id {str} -- the id of the stream that contains the commit you'd like to delete + stream_id {str} + -- the id of the stream that contains the commit you'd like to delete commit_id {str} -- the id of the commit you'd like to delete Returns: @@ -186,7 +194,8 @@ def delete(self, stream_id: str, commit_id: str) -> bool: metrics.track(metrics.COMMIT, self.account, {"name": "delete"}) query = gql( """ - mutation CommitDelete($commit: CommitDeleteInput!){ commitDelete(commit: $commit)} + mutation CommitDelete($commit: CommitDeleteInput!) + { commitDelete(commit: $commit)} """ ) params = {"commit": {"streamId": stream_id, "id": commit_id}} diff --git a/src/specklepy/api/resources/stream.py b/src/specklepy/api/resources/stream.py index a6cd267f..6868f570 100644 --- a/src/specklepy/api/resources/stream.py +++ b/src/specklepy/api/resources/stream.py @@ -1,5 +1,5 @@ from datetime import datetime, timezone -from typing import List +from typing import List, Optional from deprecated import deprecated from gql import gql @@ -153,7 +153,8 @@ def create( Arguments: name {str} -- the name of the string description {str} -- a short description of the stream - is_public {bool} -- whether or not the stream can be viewed by anyone with the id + is_public {bool} + -- whether or not the stream can be viewed by anyone with the id Returns: id {str} -- the id of the newly created stream @@ -176,7 +177,11 @@ def create( ) def update( - self, id: str, name: str = None, description: str = None, is_public: bool = None + self, + id: str, + name: Optional[str] = None, + description: Optional[str] = None, + is_public: Optional[bool] = None, ) -> bool: """Update an existing stream @@ -184,7 +189,8 @@ def update( id {str} -- the id of the stream to be updated name {str} -- the name of the string description {str} -- a short description of the stream - is_public {bool} -- whether or not the stream can be viewed by anyone with the id + is_public {bool} + -- whether or not the stream can be viewed by anyone with the id Returns: bool -- whether the stream update was successful @@ -256,7 +262,12 @@ def search( metrics.track(metrics.STREAM, self.account, {"name": "search"}) query = gql( """ - query StreamSearch($search_query: String!,$limit: Int!, $branch_limit:Int!, $commit_limit:Int!) { + query StreamSearch( + $search_query: String!, + $limit: Int!, + $branch_limit:Int!, + $commit_limit:Int! + ) { streams(query: $search_query, limit: $limit) { items { id @@ -315,7 +326,8 @@ def favorite(self, stream_id: str, favorited: bool = True): Arguments: stream_id {str} -- the id of the stream to favorite / unfavorite - favorited {bool} -- whether to favorite (True) or unfavorite (False) the stream + favorited {bool} + -- whether to favorite (True) or unfavorite (False) the stream Returns: Stream -- the stream with its `id`, `name`, and `favoritedDate` @@ -378,7 +390,9 @@ def grant_permission(self, stream_id: str, user_id: str, role: str): query = gql( """ - mutation StreamGrantPermission($permission_params: StreamGrantPermissionInput !) { + mutation StreamGrantPermission( + $permission_params: StreamGrantPermissionInput ! + ) { streamGrantPermission(permissionParams: $permission_params) } """ @@ -411,7 +425,8 @@ def get_all_pending_invites( stream_id {str} -- the stream id from which to get the pending invites Returns: - List[PendingStreamCollaborator] -- a list of pending invites for the specified stream + List[PendingStreamCollaborator] + -- a list of pending invites for the specified stream """ metrics.track(metrics.INVITE, self.account, {"name": "get"}) self._check_invites_supported() @@ -457,10 +472,10 @@ def get_all_pending_invites( def invite( self, stream_id: str, - email: str = None, - user_id: str = None, + email: Optional[str] = None, + user_id: Optional[str] = None, role: str = "stream:contributor", # should default be reviewer? - message: str = None, + message: Optional[str] = None, ): """Invite someone to a stream using either their email or user id @@ -470,8 +485,10 @@ def invite( stream_id {str} -- the id of the stream to invite the user to email {str} -- the email of the user to invite (use this OR `user_id`) user_id {str} -- the id of the user to invite (use this OR `email`) - role {str} -- the role to assign to the user (defaults to `stream:contributor`) - message {str} -- a message to send along with this invite to the specified user + role {str} + -- the role to assign to the user (defaults to `stream:contributor`) + message {str} + -- a message to send along with this invite to the specified user Returns: bool -- True if the operation was successful @@ -512,9 +529,9 @@ def invite( def invite_batch( self, stream_id: str, - emails: List[str] = None, - user_ids: List[None] = None, - message: str = None, + emails: Optional[List[str]] = None, + user_ids: Optional[List[None]] = None, + message: Optional[str] = None, ) -> bool: """Invite a batch of users to a specified stream. @@ -522,9 +539,12 @@ def invite_batch( Arguments: stream_id {str} -- the id of the stream to invite the user to - emails {List[str]} -- the email of the user to invite (use this and/or `user_ids`) - user_id {List[str]} -- the id of the user to invite (use this and/or `emails`) - message {str} -- a message to send along with this invite to the specified user + emails {List[str]} + -- the email of the user to invite (use this and/or `user_ids`) + user_id {List[str]} + -- the id of the user to invite (use this and/or `emails`) + message {str} + -- a message to send along with this invite to the specified user Returns: bool -- True if the operation was successful @@ -604,7 +624,8 @@ def invite_use(self, stream_id: str, token: str, accept: bool = True) -> bool: Requires Speckle Server version >= 2.6.4 Arguments: - stream_id {str} -- the id of the stream for which the user has a pending invite + stream_id {str} + -- the id of the stream for which the user has a pending invite token {str} -- the token of the invite to use accept {bool} -- whether or not to accept the invite (defaults to True) @@ -616,7 +637,11 @@ def invite_use(self, stream_id: str, token: str, accept: bool = True) -> bool: query = gql( """ - mutation StreamInviteUse($accept: Boolean!, $streamId: String!, $token: String!) { + mutation StreamInviteUse( + $accept: Boolean!, + $streamId: String!, + $token: String! + ) { streamInviteUse(accept: $accept, streamId: $streamId, token: $token) } """ @@ -657,7 +682,9 @@ def update_permission(self, stream_id: str, user_id: str, role: str): ) query = gql( """ - mutation StreamUpdatePermission($permission_params: StreamUpdatePermissionInput !) { + mutation StreamUpdatePermission( + $permission_params: StreamUpdatePermissionInput! + ) { streamUpdatePermission(permissionParams: $permission_params) } """ @@ -691,7 +718,9 @@ def revoke_permission(self, stream_id: str, user_id: str): metrics.track(metrics.PERMISSION, self.account, {"name": "revoke"}) query = gql( """ - mutation StreamRevokePermission($permission_params: StreamRevokePermissionInput !) { + mutation StreamRevokePermission( + $permission_params: StreamRevokePermissionInput! + ) { streamRevokePermission(permissionParams: $permission_params) } """ @@ -709,29 +738,48 @@ def revoke_permission(self, stream_id: str, user_id: str): def activity( self, stream_id: str, - action_type: str = None, + action_type: Optional[str] = None, limit: int = 20, - before: datetime = None, - after: datetime = None, - cursor: datetime = None, + before: Optional[datetime] = None, + after: Optional[datetime] = None, + cursor: Optional[datetime] = None, ): """ - Get the activity from a given stream in an Activity collection. Step into the activity `items` for the list of activity. + Get the activity from a given stream in an Activity collection. + Step into the activity `items` for the list of activity. - Note: all timestamps arguments should be `datetime` of any tz as they will be converted to UTC ISO format strings + Note: all timestamps arguments should be `datetime` of any tz + as they will be converted to UTC ISO format strings stream_id {str} -- the id of the stream to get activity from - action_type {str} -- filter results to a single action type (eg: `commit_create` or `commit_receive`) + action_type {str} + -- filter results to a single action type + (eg: `commit_create` or `commit_receive`) limit {int} -- max number of Activity items to return - before {datetime} -- latest cutoff for activity (ie: return all activity _before_ this time) - after {datetime} -- oldest cutoff for activity (ie: return all activity _after_ this time) + before {datetime} + -- latest cutoff for activity (ie: return all activity _before_ this time) + after {datetime} + -- oldest cutoff for activity (ie: return all activity _after_ this time) cursor {datetime} -- timestamp cursor for pagination """ query = gql( """ - query StreamActivity($stream_id: String!, $action_type: String, $before:DateTime, $after: DateTime, $cursor: DateTime, $limit: Int){ + query StreamActivity( + $stream_id: String!, + $action_type: String, + $before:DateTime, + $after: DateTime, + $cursor: DateTime, + $limit: Int + ){ stream(id: $stream_id) { - activity(actionType: $action_type, before: $before, after: $after, cursor: $cursor, limit: $limit) { + activity( + actionType: $action_type, + before: $before, + after: $after, + cursor: $cursor, + limit: $limit + ) { totalCount cursor items { @@ -766,7 +814,7 @@ def activity( raise SpeckleException( "Could not get stream activity - `before`, `after`, and `cursor` must" " be in `datetime` format if provided", - ValueError, + ValueError(), ) from e return self.make_request( diff --git a/src/specklepy/api/resources/user.py b/src/specklepy/api/resources/user.py index 602a3708..e46b1ac2 100644 --- a/src/specklepy/api/resources/user.py +++ b/src/specklepy/api/resources/user.py @@ -71,7 +71,9 @@ def get(self, id: Optional[str] = None) -> User: def search( self, search_query: str, limit: int = 25 ) -> Union[List[User], SpeckleException]: - """Searches for user by name or email. The search query must be at least 3 characters long + """ + Searches for user by name or email. + The search query must be at least 3 characters long Arguments: search_query {str} -- a string to search for @@ -160,24 +162,43 @@ def activity( cursor: Optional[datetime] = None, ): """ - Get the activity from a given stream in an Activity collection. Step into the activity `items` for the list of activity. - If no id argument is provided, will return the current authenticated user's activity (as extracted from the authorization header). + Get the activity from a given stream in an Activity collection. + Step into the activity `items` for the list of activity. + If no id argument is provided, will return the current authenticated + user's activity (as extracted from the authorization header). - Note: all timestamps arguments should be `datetime` of any tz as they will be converted to UTC ISO format strings + Note: all timestamps arguments should be `datetime` of any tz as + they will be converted to UTC ISO format strings user_id {str} -- the id of the user to get the activity from - action_type {str} -- filter results to a single action type (eg: `commit_create` or `commit_receive`) + action_type {str} -- filter results to a single action type + (eg: `commit_create` or `commit_receive`) limit {int} -- max number of Activity items to return - before {datetime} -- latest cutoff for activity (ie: return all activity _before_ this time) - after {datetime} -- oldest cutoff for activity (ie: return all activity _after_ this time) + before {datetime} + -- latest cutoff for activity (ie: return all activity _before_ this time) + after {datetime} + -- oldest cutoff for activity (ie: return all activity _after_ this time) cursor {datetime} -- timestamp cursor for pagination """ query = gql( """ - query UserActivity($user_id: String, $action_type: String, $before:DateTime, $after: DateTime, $cursor: DateTime, $limit: Int){ + query UserActivity( + $user_id: String, + $action_type: String, + $before:DateTime, + $after: DateTime, + $cursor: DateTime, + $limit: Int + ){ user(id: $user_id) { - activity(actionType: $action_type, before: $before, after: $after, cursor: $cursor, limit: $limit) { + activity( + actionType: $action_type, + before: $before, + after: $after, + cursor: $cursor, + limit: $limit + ) { totalCount cursor items { @@ -219,7 +240,8 @@ def get_all_pending_invites(self) -> List[PendingStreamCollaborator]: Requires Speckle Server version >= 2.6.4 Returns: - List[PendingStreamCollaborator] -- a list of pending invites for the current user + List[PendingStreamCollaborator] + -- a list of pending invites for the current user """ metrics.track(metrics.INVITE, self.account, {"name": "get"}) self._check_invites_supported() @@ -266,7 +288,8 @@ def get_pending_invite( token {str} -- the token of the invite to look for (optional) Returns: - PendingStreamCollaborator -- the invite for the given stream (or None if it isn't found) + PendingStreamCollaborator + -- the invite for the given stream (or None if it isn't found) """ metrics.track(metrics.INVITE, self.account, {"name": "get"}) self._check_invites_supported() diff --git a/src/specklepy/logging/metrics.py b/src/specklepy/logging/metrics.py index 56e9302c..36a30873 100644 --- a/src/specklepy/logging/metrics.py +++ b/src/specklepy/logging/metrics.py @@ -60,7 +60,7 @@ def set_host_app(host_app: str, host_app_version: Optional[str] = None): def track( action: str, - account: Optional["Account"] = None, + account, custom_props: Optional[dict] = None, ): if not TRACK: @@ -88,7 +88,7 @@ def track( LOG.debug(f"Error queueing metrics request: {str(ex)}") -def initialise_tracker(account: Optional["Account"] = None): +def initialise_tracker(account=None): global METRICS_TRACKER if not METRICS_TRACKER: METRICS_TRACKER = MetricsTracker() diff --git a/src/specklepy/transports/abstract_transport.py b/src/specklepy/transports/abstract_transport.py index 3235557f..5e7a056a 100644 --- a/src/specklepy/transports/abstract_transport.py +++ b/src/specklepy/transports/abstract_transport.py @@ -4,15 +4,6 @@ from pydantic import BaseModel from pydantic.config import Extra -# __________________ -# | | -# | this is v wip | -# | pls be careful | -# |__________________| -# (\__/) || -# (•ㅅ•) || -# /   づ - class AbstractTransport(ABC, BaseModel): _name: str = "Abstract" @@ -28,7 +19,9 @@ def begin_write(self) -> None: @abstractmethod def end_write(self) -> None: - """Optional: signals to the transport that no more items will need to be written.""" + """ + Optional: signals to the transport that no more items will need to be written. + """ pass @abstractmethod @@ -49,7 +42,8 @@ def save_object_from_transport( Arguments: id {str} -- the hash of the object - source_transport {AbstractTransport) -- the transport through which the object can be found + source_transport {AbstractTransport) + -- the transport through which the object can be found """ pass @@ -61,7 +55,8 @@ def get_object(self, id: str) -> Optional[str]: id {str} -- the hash of the object Returns: - str -- the full string representation of the object (or null if no object is found) + str -- the full string representation + of the object (or null if no object is found) """ pass @@ -73,7 +68,8 @@ def has_objects(self, id_list: List[str]) -> Dict[str, bool]: id_list -- List of object id to be checked Returns: - Dict[str, bool] -- keys: input ids, values: whether the transport has that object + Dict[str, bool] -- keys: input ids, values: + whether the transport has that object """ pass @@ -85,7 +81,8 @@ def copy_object_and_children( Arguments: id {str} -- the id of the object you want to copy - target_transport {AbstractTransport} -- the transport you want to copy the object to + target_transport {AbstractTransport} + -- the transport you want to copy the object to Returns: str -- the string representation of the root object """ diff --git a/src/specklepy/transports/server/__init__.py b/src/specklepy/transports/server/__init__.py index 00ece8e7..748f41bf 100644 --- a/src/specklepy/transports/server/__init__.py +++ b/src/specklepy/transports/server/__init__.py @@ -1,4 +1,3 @@ from specklepy.transports.server.server import ServerTransport - __all__ = ["ServerTransport"] diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 6129ea4d..0ba19787 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py @@ -1,6 +1,6 @@ import json from pathlib import Path -from typing import Generator, Iterable +from typing import Iterable import pytest From afb9065fb97df65f1cb3a26522c621f8dfd0a3ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Jedlicska?= Date: Tue, 20 Dec 2022 14:53:59 +0100 Subject: [PATCH 8/8] fix(metrics): fix missing default arg to track function --- src/specklepy/logging/metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/specklepy/logging/metrics.py b/src/specklepy/logging/metrics.py index 36a30873..e06e4d1e 100644 --- a/src/specklepy/logging/metrics.py +++ b/src/specklepy/logging/metrics.py @@ -60,7 +60,7 @@ def set_host_app(host_app: str, host_app_version: Optional[str] = None): def track( action: str, - account, + account=None, custom_props: Optional[dict] = None, ): if not TRACK: