Compare commits
	
		
			145 Commits
		
	
	
		
			snyk-fix-0
			...
			6bef915002
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6bef915002 | |||
| 95b2bf5044 | |||
| 0da568d5eb | |||
| 800ad92e52 | |||
| 97a8457fee | |||
| 65050c1f12 | |||
| 153a4f5342 | |||
| 0202619cb8 | |||
| c64b2b71ac | |||
| fa9ea8eafb | |||
| d5dd7907fb | |||
| fd8d04c89d | |||
| ecc7d43233 | |||
| 62d2d3420c | |||
| ea5d8983ba | |||
| e0fc232fd9 | |||
| 73215d2ce3 | |||
| 0900648d24 | |||
| 1d00f9d02a | |||
| ff00f0ad19 | |||
| 7bbeacf612 | |||
| 0fc4847f41 | |||
| ad2f6351dc | |||
| f0742309d8 | |||
| 77d9004ef5 | |||
| 1766ad712a | |||
| 709ad18edd | |||
| 178381fb12 | |||
| 47e1bd575f | |||
| 3ea3a256b8 | |||
| 78b3a6ea78 | |||
| 4c33d7423e | |||
| f3c8eaf7af | |||
| cdbb74fff6 | |||
| 5be9596412 | |||
| fdf6a15794 | |||
| af3d53197e | |||
| 7390ad24e8 | |||
| b11dc2397b | |||
| 0b3651cadb | |||
| f5bb553057 | |||
| eb80f304c7 | |||
| 10e9cf74d3 | |||
| d5492d4812 | |||
| 359868cecd | |||
|  | 24e0563ccf | ||
|  | d307b866c8 | ||
|  | e3ff9e9ec7 | ||
|  | 618cd49a02 | ||
|  | cf066e3974 | ||
| 9f55f3b207 | |||
| f5b13c7d14 | |||
|  | d753053e87 | ||
|  | 33186a47c7 | ||
| 948d223fa4 | |||
| 70a92c76db | |||
| b11cc26daa | |||
| 6cac9dc9c2 | |||
| ebca87230a | |||
| 5efa42d35d | |||
| 2d4a1294cb | |||
| cf2d542e16 | |||
| 609fee445f | |||
| f611b685b3 | |||
| 31269af218 | |||
| 968ec8eb77 | |||
|  | 1ee89e28e9 | ||
|  | d2025e2bb8 | ||
|  | a833aaaa63 | ||
|  | d6b15f6bfc | ||
|  | 702d74d71b | ||
|  | 81bdf2acf7 | ||
|  | 7d36d4320c | ||
|  | e26c785b7e | ||
|  | a00a900073 | ||
|  | ca7c3dca91 | ||
|  | 073afd068f | ||
|  | 179e91b7be | ||
|  | 03db6de0b1 | ||
|  | 2ca76ae20c | ||
|  | cc94936924 | ||
|  | af330c3a87 | ||
|  | 7d52db1221 | ||
|  | 88d487eaa7 | ||
|  | abd343bd61 | ||
|  | 128d50c299 | ||
|  | 68eeb3f8d5 | ||
|  | 912d9f739c | ||
|  | 48c84ec319 | ||
|  | 1611f1dce6 | ||
|  | bcce79b5f0 | ||
|  | 90be5d3a79 | ||
|  | 3d7354bd27 | ||
|  | 4041beb667 | ||
|  | 9013262ed2 | ||
|  | 59536eac2c | ||
|  | 268e7e7f6a | ||
|  | 5cfe2a41d4 | ||
|  | 94a9e7fc10 | ||
|  | 4305728d53 | ||
|  | c0f06a8555 | ||
| b758d0dfda | |||
|  | 56f1cb924e | ||
|  | 4d4514dd95 | ||
|  | c7128daf73 | ||
|  | 78af3313bd | ||
|  | 567906e574 | ||
|  | 0e425a35e6 | ||
|  | 95de56be42 | ||
|  | 5cc5aa3718 | ||
|  | 413560e6e2 | ||
|  | f198798a89 | ||
|  | 9e9266ed94 | ||
|  | d3ba06fa0b | ||
| 6c1c5edf04 | |||
|  | 0188d8e43d | ||
| 4994aa301d | |||
|  | 9ad8fae9ac | ||
|  | 59e4916711 | ||
|  | 437c9d87d1 | ||
| 4bd87538dd | |||
|  | 69f5dfaf20 | ||
| 82bcffc498 | |||
|  | f3b4b61f45 | ||
|  | c60494ce60 | ||
|  | d9b815b664 | ||
| 50d8f81c63 | |||
| 6985f4dbe8 | |||
| a314379091 | |||
| 6e4d78cfcd | |||
| 6832c03f8d | |||
| 2cf102db5d | |||
| cfdc7311d2 | |||
| b22363a87f | |||
| 6674fccb6a | |||
| eb4f19ee3f | |||
| 014085f693 | |||
| 3f318d6d70 | |||
| 43696f16e1 | |||
| 3cf66ab503 | |||
| a808a51c6d | |||
|  | 4ff8f90225 | ||
|  | e8d8058278 | ||
|  | 9714080a5d | ||
|  | 0e70b9c959 | 
							
								
								
									
										854
									
								
								.archive/poetry.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										854
									
								
								.archive/poetry.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,854 @@ | |||||||
|  | # This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "astroid" | ||||||
|  | version = "3.3.8" | ||||||
|  | description = "An abstract syntax tree for Python with inference support." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9.0" | ||||||
|  | files = [ | ||||||
|  |     {file = "astroid-3.3.8-py3-none-any.whl", hash = "sha256:187ccc0c248bfbba564826c26f070494f7bc964fd286b6d9fff4420e55de828c"}, | ||||||
|  |     {file = "astroid-3.3.8.tar.gz", hash = "sha256:a88c7994f914a4ea8572fac479459f4955eeccc877be3f2d959a33273b0cf40b"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "backoff" | ||||||
|  | version = "2.2.1" | ||||||
|  | description = "Function decoration for backoff and retry" | ||||||
|  | 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" | ||||||
|  | version = "24.10.0" | ||||||
|  | description = "The uncompromising code formatter." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9" | ||||||
|  | files = [ | ||||||
|  |     {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, | ||||||
|  |     {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, | ||||||
|  |     {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, | ||||||
|  |     {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, | ||||||
|  |     {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, | ||||||
|  |     {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, | ||||||
|  |     {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, | ||||||
|  |     {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, | ||||||
|  |     {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, | ||||||
|  |     {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, | ||||||
|  |     {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, | ||||||
|  |     {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, | ||||||
|  |     {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, | ||||||
|  |     {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, | ||||||
|  |     {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, | ||||||
|  |     {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, | ||||||
|  |     {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, | ||||||
|  |     {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, | ||||||
|  |     {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, | ||||||
|  |     {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, | ||||||
|  |     {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, | ||||||
|  |     {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dependencies] | ||||||
|  | click = ">=8.0.0" | ||||||
|  | mypy-extensions = ">=0.4.3" | ||||||
|  | packaging = ">=22.0" | ||||||
|  | pathspec = ">=0.9.0" | ||||||
|  | platformdirs = ">=2" | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | colorama = ["colorama (>=0.4.3)"] | ||||||
|  | d = ["aiohttp (>=3.10)"] | ||||||
|  | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] | ||||||
|  | uvloop = ["uvloop (>=0.15.2)"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "certifi" | ||||||
|  | version = "2024.8.30" | ||||||
|  | description = "Python package for providing Mozilla's CA Bundle." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.6" | ||||||
|  | files = [ | ||||||
|  |     {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, | ||||||
|  |     {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "charset-normalizer" | ||||||
|  | version = "3.4.0" | ||||||
|  | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.7.0" | ||||||
|  | files = [ | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, | ||||||
|  |     {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "click" | ||||||
|  | version = "8.1.7" | ||||||
|  | description = "Composable command line interface toolkit" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.7" | ||||||
|  | files = [ | ||||||
|  |     {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, | ||||||
|  |     {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dependencies] | ||||||
|  | colorama = {version = "*", markers = "platform_system == \"Windows\""} | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "colorama" | ||||||
|  | version = "0.4.6" | ||||||
|  | description = "Cross-platform colored terminal text." | ||||||
|  | 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 = "coloredlogs" | ||||||
|  | version = "15.0.1" | ||||||
|  | description = "Colored terminal output for Python's logging module" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" | ||||||
|  | files = [ | ||||||
|  |     {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"}, | ||||||
|  |     {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dependencies] | ||||||
|  | humanfriendly = ">=9.1" | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | cron = ["capturer (>=2.4)"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "coverage" | ||||||
|  | version = "7.6.10" | ||||||
|  | description = "Code coverage measurement for Python" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9" | ||||||
|  | files = [ | ||||||
|  |     {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, | ||||||
|  |     {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, | ||||||
|  |     {file = "coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a"}, | ||||||
|  |     {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165"}, | ||||||
|  |     {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988"}, | ||||||
|  |     {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5"}, | ||||||
|  |     {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3"}, | ||||||
|  |     {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5"}, | ||||||
|  |     {file = "coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244"}, | ||||||
|  |     {file = "coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e"}, | ||||||
|  |     {file = "coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3"}, | ||||||
|  |     {file = "coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43"}, | ||||||
|  |     {file = "coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132"}, | ||||||
|  |     {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f"}, | ||||||
|  |     {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994"}, | ||||||
|  |     {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99"}, | ||||||
|  |     {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd"}, | ||||||
|  |     {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377"}, | ||||||
|  |     {file = "coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8"}, | ||||||
|  |     {file = "coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609"}, | ||||||
|  |     {file = "coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853"}, | ||||||
|  |     {file = "coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078"}, | ||||||
|  |     {file = "coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0"}, | ||||||
|  |     {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50"}, | ||||||
|  |     {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022"}, | ||||||
|  |     {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b"}, | ||||||
|  |     {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0"}, | ||||||
|  |     {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852"}, | ||||||
|  |     {file = "coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359"}, | ||||||
|  |     {file = "coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312"}, | ||||||
|  |     {file = "coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d"}, | ||||||
|  |     {file = "coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a"}, | ||||||
|  |     {file = "coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27"}, | ||||||
|  |     {file = "coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4"}, | ||||||
|  |     {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f"}, | ||||||
|  |     {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25"}, | ||||||
|  |     {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315"}, | ||||||
|  |     {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90"}, | ||||||
|  |     {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d"}, | ||||||
|  |     {file = "coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18"}, | ||||||
|  |     {file = "coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59"}, | ||||||
|  |     {file = "coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f"}, | ||||||
|  |     {file = "coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | toml = ["tomli"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "datetime" | ||||||
|  | version = "5.5" | ||||||
|  | description = "This package provides a DateTime data type, as known from Zope. Unless you need to communicate with Zope APIs, you're probably better off using Python's built-in datetime module." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.7" | ||||||
|  | files = [ | ||||||
|  |     {file = "DateTime-5.5-py3-none-any.whl", hash = "sha256:0abf6c51cb4ba7cee775ca46ccc727f3afdde463be28dbbe8803631fefd4a120"}, | ||||||
|  |     {file = "DateTime-5.5.tar.gz", hash = "sha256:21ec6331f87a7fcb57bd7c59e8a68bfffe6fcbf5acdbbc7b356d6a9a020191d3"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dependencies] | ||||||
|  | pytz = "*" | ||||||
|  | "zope.interface" = "*" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "dill" | ||||||
|  | version = "0.3.9" | ||||||
|  | description = "serialize all of Python" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | files = [ | ||||||
|  |     {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, | ||||||
|  |     {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | graph = ["objgraph (>=1.7.2)"] | ||||||
|  | profile = ["gprof2dot (>=2022.7.29)"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "future" | ||||||
|  | version = "1.0.0" | ||||||
|  | description = "Clean single-source support for Python 3 and 2" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" | ||||||
|  | files = [ | ||||||
|  |     {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, | ||||||
|  |     {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "humanfriendly" | ||||||
|  | version = "10.0" | ||||||
|  | description = "Human friendly output for text interfaces using Python" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" | ||||||
|  | files = [ | ||||||
|  |     {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, | ||||||
|  |     {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dependencies] | ||||||
|  | pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""} | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "idna" | ||||||
|  | version = "3.10" | ||||||
|  | description = "Internationalized Domain Names in Applications (IDNA)" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.6" | ||||||
|  | files = [ | ||||||
|  |     {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, | ||||||
|  |     {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "iniconfig" | ||||||
|  | version = "2.0.0" | ||||||
|  | description = "brain-dead simple config-ini parsing" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.7" | ||||||
|  | files = [ | ||||||
|  |     {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, | ||||||
|  |     {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "isort" | ||||||
|  | version = "5.13.2" | ||||||
|  | description = "A Python utility / library to sort Python imports." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8.0" | ||||||
|  | files = [ | ||||||
|  |     {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, | ||||||
|  |     {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | colors = ["colorama (>=0.4.6)"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "mccabe" | ||||||
|  | version = "0.7.0" | ||||||
|  | description = "McCabe checker, plugin for flake8" | ||||||
|  | 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 = "mypy-extensions" | ||||||
|  | version = "1.0.0" | ||||||
|  | description = "Type system extensions for programs checked with the mypy type checker." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.5" | ||||||
|  | files = [ | ||||||
|  |     {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, | ||||||
|  |     {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "packaging" | ||||||
|  | version = "24.2" | ||||||
|  | description = "Core utilities for Python packages" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | files = [ | ||||||
|  |     {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, | ||||||
|  |     {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pathspec" | ||||||
|  | version = "0.12.1" | ||||||
|  | description = "Utility library for gitignore style pattern matching of file paths." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | files = [ | ||||||
|  |     {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, | ||||||
|  |     {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "platformdirs" | ||||||
|  | version = "4.3.6" | ||||||
|  | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | files = [ | ||||||
|  |     {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, | ||||||
|  |     {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] | ||||||
|  | test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] | ||||||
|  | type = ["mypy (>=1.11.2)"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pluggy" | ||||||
|  | version = "1.5.0" | ||||||
|  | description = "plugin and hook calling mechanisms for python" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | files = [ | ||||||
|  |     {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, | ||||||
|  |     {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | dev = ["pre-commit", "tox"] | ||||||
|  | testing = ["pytest", "pytest-benchmark"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pyjwt" | ||||||
|  | version = "2.10.0" | ||||||
|  | description = "JSON Web Token implementation in Python" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9" | ||||||
|  | files = [ | ||||||
|  |     {file = "PyJWT-2.10.0-py3-none-any.whl", hash = "sha256:543b77207db656de204372350926bed5a86201c4cbff159f623f79c7bb487a15"}, | ||||||
|  |     {file = "pyjwt-2.10.0.tar.gz", hash = "sha256:7628a7eb7938959ac1b26e819a1df0fd3259505627b575e4bad6d08f76db695c"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | crypto = ["cryptography (>=3.4.0)"] | ||||||
|  | dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] | ||||||
|  | docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] | ||||||
|  | tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pylint" | ||||||
|  | version = "3.3.3" | ||||||
|  | description = "python code static checker" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9.0" | ||||||
|  | files = [ | ||||||
|  |     {file = "pylint-3.3.3-py3-none-any.whl", hash = "sha256:26e271a2bc8bce0fc23833805a9076dd9b4d5194e2a02164942cb3cdc37b4183"}, | ||||||
|  |     {file = "pylint-3.3.3.tar.gz", hash = "sha256:07c607523b17e6d16e2ae0d7ef59602e332caa762af64203c24b41c27139f36a"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dependencies] | ||||||
|  | astroid = ">=3.3.8,<=3.4.0-dev0" | ||||||
|  | colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} | ||||||
|  | dill = [ | ||||||
|  |     {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, | ||||||
|  |     {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, | ||||||
|  | ] | ||||||
|  | isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" | ||||||
|  | mccabe = ">=0.6,<0.8" | ||||||
|  | platformdirs = ">=2.2.0" | ||||||
|  | tomlkit = ">=0.10.1" | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | spelling = ["pyenchant (>=3.2,<4.0)"] | ||||||
|  | testutils = ["gitpython (>3)"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pylint-exit" | ||||||
|  | version = "1.2.0" | ||||||
|  | description = "Exit code handler for pylint command line utility." | ||||||
|  | optional = false | ||||||
|  | python-versions = "*" | ||||||
|  | files = [ | ||||||
|  |     {file = "pylint-exit-1.2.0.zip", hash = "sha256:b6ad02884c01c5560a5275079fe5a6c792afff90ecccf0c02513e1547ee280b0"}, | ||||||
|  |     {file = "pylint_exit-1.2.0-py2.py3-none-any.whl", hash = "sha256:65c9e7856e9058705a92d7c45628d604b2a4b8ee2b3c18a7303be77f9ed87cbe"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pyreadline3" | ||||||
|  | version = "3.5.4" | ||||||
|  | description = "A python implementation of GNU readline." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | files = [ | ||||||
|  |     {file = "pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6"}, | ||||||
|  |     {file = "pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | dev = ["build", "flake8", "mypy", "pytest", "twine"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pytest" | ||||||
|  | version = "8.3.4" | ||||||
|  | description = "pytest: simple powerful testing with Python" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | files = [ | ||||||
|  |     {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, | ||||||
|  |     {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dependencies] | ||||||
|  | colorama = {version = "*", markers = "sys_platform == \"win32\""} | ||||||
|  | iniconfig = "*" | ||||||
|  | packaging = "*" | ||||||
|  | pluggy = ">=1.5,<2" | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pytz" | ||||||
|  | version = "2024.2" | ||||||
|  | description = "World timezone definitions, modern and historical" | ||||||
|  | optional = false | ||||||
|  | python-versions = "*" | ||||||
|  | files = [ | ||||||
|  |     {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, | ||||||
|  |     {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "requests" | ||||||
|  | version = "2.32.3" | ||||||
|  | description = "Python HTTP for Humans." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | files = [ | ||||||
|  |     {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, | ||||||
|  |     {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dependencies] | ||||||
|  | certifi = ">=2017.4.17" | ||||||
|  | charset-normalizer = ">=2,<4" | ||||||
|  | idna = ">=2.5,<4" | ||||||
|  | urllib3 = ">=1.21.1,<3" | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | socks = ["PySocks (>=1.5.6,!=1.5.7)"] | ||||||
|  | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "requests-toolbelt" | ||||||
|  | version = "1.0.0" | ||||||
|  | description = "A utility belt for advanced users of python-requests" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" | ||||||
|  | files = [ | ||||||
|  |     {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, | ||||||
|  |     {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dependencies] | ||||||
|  | requests = ">=2.0.1,<3.0.0" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "setuptools" | ||||||
|  | version = "75.6.0" | ||||||
|  | description = "Easily download, build, install, upgrade, and uninstall Python packages" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9" | ||||||
|  | files = [ | ||||||
|  |     {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, | ||||||
|  |     {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] | ||||||
|  | core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] | ||||||
|  | cover = ["pytest-cov"] | ||||||
|  | doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] | ||||||
|  | enabler = ["pytest-enabler (>=2.2)"] | ||||||
|  | test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] | ||||||
|  | type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "tomlkit" | ||||||
|  | version = "0.13.2" | ||||||
|  | description = "Style preserving TOML library" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | files = [ | ||||||
|  |     {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, | ||||||
|  |     {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "urllib3" | ||||||
|  | version = "2.2.3" | ||||||
|  | description = "HTTP library with thread-safe connection pooling, file post, and more." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | files = [ | ||||||
|  |     {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, | ||||||
|  |     {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] | ||||||
|  | h2 = ["h2 (>=4,<5)"] | ||||||
|  | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] | ||||||
|  | zstd = ["zstandard (>=0.18.0)"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "webex-bot" | ||||||
|  | version = "0.5.2" | ||||||
|  | description = "Python package for a Webex Bot based on websockets." | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | files = [ | ||||||
|  |     {file = "webex_bot-0.5.2-py2.py3-none-any.whl", hash = "sha256:1ccde69de4f44bf4ad4d3c9dcc41666c09d0ff40326155f13a4213732352783e"}, | ||||||
|  |     {file = "webex_bot-0.5.2.tar.gz", hash = "sha256:6b381d4ed0ba500d5f1d3e96a68db599ac38466f66d98afda8762cf66138f9ff"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dependencies] | ||||||
|  | backoff = "*" | ||||||
|  | coloredlogs = "*" | ||||||
|  | webexteamssdk = "1.6.1" | ||||||
|  | websockets = "11.0.3" | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | proxy = ["websockets-proxy (>=0.1.1)"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "webexteamssdk" | ||||||
|  | version = "1.6.1" | ||||||
|  | description = "Community-developed Python SDK for the Webex Teams APIs" | ||||||
|  | optional = false | ||||||
|  | python-versions = "*" | ||||||
|  | files = [ | ||||||
|  |     {file = "webexteamssdk-1.6.1-py3-none-any.whl", hash = "sha256:52a7f9d515cd3d53a853e679e16572ec6ca036a223e35b14fea14c99f492a6a4"}, | ||||||
|  |     {file = "webexteamssdk-1.6.1.tar.gz", hash = "sha256:bbc7672f381b26fb22d0d03f87d131a2fa1e7d54c2f37f2e4cd28d725b8b5dfb"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dependencies] | ||||||
|  | future = "*" | ||||||
|  | PyJWT = "*" | ||||||
|  | requests = ">=2.4.2" | ||||||
|  | requests-toolbelt = "*" | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "websockets" | ||||||
|  | version = "11.0.3" | ||||||
|  | description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.7" | ||||||
|  | files = [ | ||||||
|  |     {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, | ||||||
|  |     {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, | ||||||
|  |     {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, | ||||||
|  |     {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, | ||||||
|  |     {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, | ||||||
|  |     {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, | ||||||
|  |     {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, | ||||||
|  |     {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, | ||||||
|  |     {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, | ||||||
|  |     {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, | ||||||
|  |     {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, | ||||||
|  |     {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, | ||||||
|  |     {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, | ||||||
|  |     {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, | ||||||
|  |     {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, | ||||||
|  |     {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, | ||||||
|  |     {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, | ||||||
|  |     {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, | ||||||
|  |     {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, | ||||||
|  |     {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, | ||||||
|  |     {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, | ||||||
|  |     {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, | ||||||
|  |     {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, | ||||||
|  |     {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, | ||||||
|  |     {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, | ||||||
|  |     {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, | ||||||
|  |     {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, | ||||||
|  |     {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, | ||||||
|  |     {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, | ||||||
|  |     {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, | ||||||
|  |     {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, | ||||||
|  |     {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, | ||||||
|  |     {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, | ||||||
|  |     {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, | ||||||
|  |     {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, | ||||||
|  |     {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, | ||||||
|  |     {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, | ||||||
|  |     {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, | ||||||
|  |     {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, | ||||||
|  |     {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, | ||||||
|  |     {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, | ||||||
|  |     {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, | ||||||
|  |     {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, | ||||||
|  |     {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, | ||||||
|  |     {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, | ||||||
|  |     {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, | ||||||
|  |     {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, | ||||||
|  |     {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, | ||||||
|  |     {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, | ||||||
|  |     {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, | ||||||
|  |     {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, | ||||||
|  |     {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, | ||||||
|  |     {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, | ||||||
|  |     {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, | ||||||
|  |     {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, | ||||||
|  |     {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, | ||||||
|  |     {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, | ||||||
|  |     {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, | ||||||
|  |     {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, | ||||||
|  |     {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, | ||||||
|  |     {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, | ||||||
|  |     {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, | ||||||
|  |     {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, | ||||||
|  |     {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, | ||||||
|  |     {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, | ||||||
|  |     {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, | ||||||
|  |     {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, | ||||||
|  |     {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, | ||||||
|  |     {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, | ||||||
|  |     {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "zipp" | ||||||
|  | version = "3.21.0" | ||||||
|  | description = "Backport of pathlib-compatible object wrapper for zip files" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.9" | ||||||
|  | files = [ | ||||||
|  |     {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, | ||||||
|  |     {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] | ||||||
|  | cover = ["pytest-cov"] | ||||||
|  | doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] | ||||||
|  | enabler = ["pytest-enabler (>=2.2)"] | ||||||
|  | test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] | ||||||
|  | type = ["pytest-mypy"] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "zope-interface" | ||||||
|  | version = "7.1.1" | ||||||
|  | description = "Interfaces for Python" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8" | ||||||
|  | files = [ | ||||||
|  |     {file = "zope.interface-7.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6650bd56ef350d37c8baccfd3ee8a0483ed6f8666e641e4b9ae1a1827b79f9e5"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84e87eba6b77a3af187bae82d8de1a7c208c2a04ec9f6bd444fd091b811ad92e"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c4e1b4c06d9abd1037c088dae1566c85f344a3e6ae4350744c3f7f7259d9c67"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cd5e3d910ac87652a09f6e5db8e41bc3b49cf08ddd2d73d30afc644801492cd"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca95594d936ee349620900be5b46c0122a1ff6ce42d7d5cb2cf09dc84071ef16"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:ad339509dcfbbc99bf8e147db6686249c4032f26586699ec4c82f6e5909c9fe2"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e59f175e868f856a77c0a77ba001385c377df2104fdbda6b9f99456a01e102a"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0de23bcb93401994ea00bc5c677ef06d420340ac0a4e9c10d80e047b9ce5af3f"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdb7e7e5524b76d3ec037c1d81a9e2c7457b240fd4cb0a2476b65c3a5a6c81f"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3603ef82a9920bd0bfb505423cb7e937498ad971ad5a6141841e8f76d2fd5446"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1d52d052355e0c5c89e0630dd2ff7c0b823fd5f56286a663e92444761b35e25"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:179ad46ece518c9084cb272e4a69d266b659f7f8f48e51706746c2d8a426433e"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e6503534b52bb1720ace9366ee30838a58a3413d3e197512f3338c8f34b5d89d"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f85b290e5b8b11814efb0d004d8ce6c9a483c35c462e8d9bf84abb93e79fa770"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d029fac6a80edae80f79c37e5e3abfa92968fe921886139b3ee470a1b177321a"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5836b8fb044c6e75ba34dfaabc602493019eadfa0faf6ff25f4c4c356a71a853"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7395f13533318f150ee72adb55b29284b16e73b6d5f02ab21f173b3e83f242b8"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:1d0e23c6b746eb8ce04573cc47bcac60961ac138885d207bd6f57e27a1431ae8"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:9fad9bd5502221ab179f13ea251cb30eef7cf65023156967f86673aff54b53a0"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:55c373becbd36a44d0c9be1d5271422fdaa8562d158fb44b4192297b3c67096c"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed1df8cc01dd1e3970666a7370b8bfc7457371c58ba88c57bd5bca17ab198053"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99c14f0727c978639139e6cad7a60e82b7720922678d75aacb90cf4ef74a068c"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b1eed7670d564f1025d7cda89f99f216c30210e42e95de466135be0b4a499d9"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:3defc925c4b22ac1272d544a49c6ba04c3eefcce3200319ee1be03d9270306dd"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8d0fe45be57b5219aa4b96e846631c04615d5ef068146de5a02ccd15c185321f"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bcbeb44fc16e0078b3b68a95e43f821ae34dcbf976dde6985141838a5f23dd3d"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8e7b05dc6315a193cceaec071cc3cf1c180cea28808ccded0b1283f1c38ba73"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d553e02b68c0ea5a226855f02edbc9eefd99f6a8886fa9f9bdf999d77f46585"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81744a7e61b598ebcf4722ac56a7a4f50502432b5b4dc7eb29075a89cf82d029"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7720322763aceb5e0a7cadcc38c67b839efe599f0887cbf6c003c55b1458c501"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ed0852c25950cf430067f058f8d98df6288502ac313861d9803fe7691a9b3"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9595e478047ce752b35cfa221d7601a5283ccdaab40422e0dc1d4a334c70f580"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2317e1d4dba68203a5227ea3057f9078ec9376275f9700086b8f0ffc0b358e1b"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6821ef9870f32154da873fcde439274f99814ea452dd16b99fa0b66345c4b6b"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:190eeec67e023d5aac54d183fa145db0b898664234234ac54643a441da434616"}, | ||||||
|  |     {file = "zope.interface-7.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:d17e7fc814eaab93409b80819fd6d30342844345c27f3bc3c4b43c2425a8d267"}, | ||||||
|  |     {file = "zope.interface-7.1.1.tar.gz", hash = "sha256:4284d664ef0ff7b709836d4de7b13d80873dc5faeffc073abdb280058bfac5e3"}, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dependencies] | ||||||
|  | setuptools = "*" | ||||||
|  |  | ||||||
|  | [package.extras] | ||||||
|  | docs = ["Sphinx", "furo", "repoze.sphinx.autointerface"] | ||||||
|  | test = ["coverage[toml]", "zope.event", "zope.testing"] | ||||||
|  | testing = ["coverage[toml]", "zope.event", "zope.testing"] | ||||||
|  |  | ||||||
|  | [metadata] | ||||||
|  | lock-version = "2.0" | ||||||
|  | python-versions = "^3.11" | ||||||
|  | content-hash = "1e8ca8c6a9e1c9117c393101e390bfbfcdc16211bf5d32e83098064e01d52c70" | ||||||
| @@ -1,47 +1,47 @@ | |||||||
| appdirs==1.4.4 | appdirs==1.4.4 | ||||||
| astroid==3.2.2 | astroid==3.3.8 | ||||||
| attrs==23.2.0 | attrs==24.2.0 | ||||||
| autopep8==2.3.1 | autopep8==2.3.1 | ||||||
| backoff==2.2.1 | backoff==2.2.1 | ||||||
| certifi==2024.7.4 | certifi==2024.8.30 | ||||||
| cfgv==3.4.0 | cfgv==3.4.0 | ||||||
| charset-normalizer==3.3.2 | charset-normalizer==3.4.1 | ||||||
| click==8.1.7 | click==8.1.7 | ||||||
| coloredlogs==15.0.1 | coloredlogs==15.0.1 | ||||||
| dill==0.3.8 | dill==0.3.9 | ||||||
| distlib==0.3.8 | distlib==0.3.9 | ||||||
| filelock==3.15.4 | filelock==3.16.1 | ||||||
| future==1.0.0 | future==1.0.0 | ||||||
| humanfriendly==10.0 | humanfriendly==10.0 | ||||||
| identify==2.6.0 | identify==2.6.2 | ||||||
| idna==3.7 | idna==3.10 | ||||||
| iniconfig==2.0.0 | iniconfig==2.0.0 | ||||||
| lazy-object-proxy==1.10.0 | lazy-object-proxy==1.10.0 | ||||||
| mccabe==0.7.0 | mccabe==0.7.0 | ||||||
| mypy-extensions==1.0.0 | mypy-extensions==1.0.0 | ||||||
| nodeenv==1.9.1 | nodeenv==1.9.1 | ||||||
| packaging==24.1 | packaging==24.2 | ||||||
| pathspec==0.12.1 | pathspec==0.12.1 | ||||||
| platformdirs==4.2.2 | platformdirs==4.3.6 | ||||||
| pluggy==1.5.0 | pluggy==1.5.0 | ||||||
| py==1.11.0 | py==1.11.0 | ||||||
| pycodestyle==2.12.0 | pycodestyle==2.12.1 | ||||||
| PyJWT==2.8.0 | PyJWT==2.10.0 | ||||||
| pyparsing==3.1.2 | pyparsing==3.2.0 | ||||||
| python-dateutil==2.9.0.post0 | python-dateutil==2.9.0.post0 | ||||||
| python-dotenv==1.0.1 | python-dotenv==1.0.1 | ||||||
| PyYAML==6.0.1 | PyYAML==6.0.2 | ||||||
| requests==2.32.3 | requests==2.32.3 | ||||||
| requests-toolbelt==1.0.0 | requests-toolbelt==1.0.0 | ||||||
| sentry-sdk==2.7.1 |  | ||||||
| six==1.16.0 | six==1.16.0 | ||||||
| toml==0.10.2 | toml==0.10.2 | ||||||
| tomli==2.0.1 | tomli==2.1.0 | ||||||
| tomlkit==0.12.5 | tomlkit==0.13.2 | ||||||
| urllib3==2.2.2 | urllib3==2.2.3 | ||||||
| virtualenv==20.26.3 | virtualenv==20.27.1 | ||||||
| webex-bot==0.5.1 | webex-bot==0.5.2 | ||||||
| webexteamssdk==1.6.1 | webexteamssdk==1.6.1 | ||||||
| websockets==11.0.3 | websockets==11.0.3 | ||||||
| wrapt==1.16.0 | wrapt==1.16.0 | ||||||
| xmltodict==0.13.0 | xmltodict==0.14.2 | ||||||
|  | zipp>=3.19.1 # not directly required, pinned by Snyk to avoid a vulnerability | ||||||
| @@ -1,8 +1,9 @@ | |||||||
| APP_LIFECYCLE="dev" |  | ||||||
| SENTRY_ENABLED="False" |  | ||||||
| SENTRY_DSN="" |  | ||||||
| ADMIN_EMAIL="" | ADMIN_EMAIL="" | ||||||
| ADMIN_FIRST_NAME="" | ADMIN_FIRST_NAME="" | ||||||
|  | APP_LIFECYCLE="dev" | ||||||
|  | APPROVED_DOMAINS="example.com,hello.com" | ||||||
|  | APPROVED_ROOMS="abc123,def456" | ||||||
|  | APPROVED_USERS="bob@example.com,john@me.com" | ||||||
| BOT_NAME="" | BOT_NAME="" | ||||||
| N8N_WEBHOOK_URL="" | N8N_WEBHOOK_URL="" | ||||||
| WEBEX_API_KEY="" | WEBEX_API_KEY="" | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								.gitea/CODEOWNERS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitea/CODEOWNERS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | *   @luke | ||||||
							
								
								
									
										168
									
								
								.gitea/workflows-disabled/release.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								.gitea/workflows-disabled/release.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,168 @@ | |||||||
|  | name: Release | ||||||
|  | on: | ||||||
|  |   schedule: | ||||||
|  |     - cron: "0 9 * * 0" | ||||||
|  |   issue_comment: | ||||||
|  |     types: [created] | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   manual_trigger: | ||||||
|  |     name: Manual Trigger Cleanup | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     if: ${{ gitea.event_name == 'issue_comment' }} | ||||||
|  |     steps: | ||||||
|  |       - name: Log event metadata | ||||||
|  |         run: | | ||||||
|  |           echo "Issue: ${{ gitea.event.issue.number }}" | ||||||
|  |           echo "Comment: ${{ gitea.event.comment.body }}" | ||||||
|  |           echo "User: ${{ gitea.event.comment.user.login }}" | ||||||
|  |  | ||||||
|  |       - name: Stop workflow if required conditions are not met | ||||||
|  |         if: ${{ !contains(gitea.event.issue.number, '329') || !contains(gitea.event.comment.body, '/trigger-release') || !contains(gitea.event.comment.user.login, 'luke') }} | ||||||
|  |         run: exit 1 | ||||||
|  |  | ||||||
|  |       - name: Delete issue comment | ||||||
|  |         run: | | ||||||
|  |           curl -X DELETE \ | ||||||
|  |             -H "Authorization: token ${{ gitea.token }}" \ | ||||||
|  |             "${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}/issues/comments/${{ gitea.event.comment.id }}" | ||||||
|  |  | ||||||
|  |   # test: | ||||||
|  |   #   name: Unit Test | ||||||
|  |   #   uses: https://git.tainton.uk/public/roboluke-tasks/.gitea/workflows/ci.yml@main | ||||||
|  |   #   continue-on-error: true | ||||||
|  |  | ||||||
|  |   create_release: | ||||||
|  |     name: Create Release | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     # needs: test | ||||||
|  |     outputs: | ||||||
|  |       release_name: ${{ steps.get_next_version.outputs.tag }} | ||||||
|  |     steps: | ||||||
|  |       - name: Check out repository | ||||||
|  |         uses: actions/checkout@v4.2.2 | ||||||
|  |         with: | ||||||
|  |           fetch-depth: 0 | ||||||
|  |  | ||||||
|  |       - name: Changes since last tag | ||||||
|  |         id: changes | ||||||
|  |         run: | | ||||||
|  |           rm -f .changes | ||||||
|  |           git log $(git describe --tags --abbrev=0)..HEAD --no-merges --oneline >> .changes | ||||||
|  |           cat .changes | ||||||
|  |  | ||||||
|  |       - name: Check for changes | ||||||
|  |         run: | | ||||||
|  |           if [[ -z $(grep '[^[:space:]]' .changes) ]] ; then | ||||||
|  |             echo "changes=false" | ||||||
|  |             echo "changes=false" >> "$GITEA_OUTPUT" | ||||||
|  |           else | ||||||
|  |             echo "changes=true" | ||||||
|  |             echo "changes=true" >> "$GITEA_OUTPUT" | ||||||
|  |           fi | ||||||
|  |  | ||||||
|  |       - name: Cancel if no changes | ||||||
|  |         if: steps.changes.outputs.changes == 'false' | ||||||
|  |         run: exit 1 | ||||||
|  |  | ||||||
|  |       - name: Set server URL | ||||||
|  |         id: set_srvurl | ||||||
|  |         run: | | ||||||
|  |           SRVURL=$(echo "${{ gitea.server_url }}" | sed 's/https:\/\/\(.*\)/\1/') | ||||||
|  |           echo "srvurl=$SRVURL" >> "$GITEA_OUTPUT" | ||||||
|  |  | ||||||
|  |       - name: Get next version | ||||||
|  |         uses: TriPSs/conventional-changelog-action@v6 | ||||||
|  |         id: get_next_version | ||||||
|  |         with: | ||||||
|  |           git-url: ${{ steps.set_srvurl.outputs.srvurl }} | ||||||
|  |           github-token: ${{ gitea.token }} | ||||||
|  |           preset: "conventionalcommits" | ||||||
|  |           # preset: "angular"  # This is the default | ||||||
|  |           skip-commit: true | ||||||
|  |           release-count: 1 | ||||||
|  |           output-file: false | ||||||
|  |           create-summary: true | ||||||
|  |           skip-on-empty: true | ||||||
|  |           skip-version-file: true | ||||||
|  |           skip-tag: true | ||||||
|  |  | ||||||
|  |       - name: Create release | ||||||
|  |         run: | | ||||||
|  |           curl -s -X POST \ | ||||||
|  |             -H "Authorization: token ${{ secrets.ACTIONS_TOKEN }}" \ | ||||||
|  |             -H "accept: application/json" \ | ||||||
|  |             -H "Content-Type: application/json" \ | ||||||
|  |             -d "{\"tag_name\": \"${{ steps.get_next_version.outputs.tag }}\", \"name\": \"${{ steps.get_next_version.outputs.tag }}\", \"body\": \"${{ steps.get_next_version.outputs.changelog }}\"}" \ | ||||||
|  |             "${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}/releases" | ||||||
|  |  | ||||||
|  |   build_docker: | ||||||
|  |     name: Build Docker Images | ||||||
|  |     needs: create_release | ||||||
|  |     steps: | ||||||
|  |       - name: Update Docker configuration | ||||||
|  |         continue-on-error: true | ||||||
|  |         run: | | ||||||
|  |           mkdir -p /etc/default | ||||||
|  |           mkdir -p /etc/docker | ||||||
|  |           touch -a /etc/default/docker | ||||||
|  |           touch -a /etc/docker/daemon.json | ||||||
|  |           echo "DOCKER_OPTS=\"--insecure-registry ${{ vars.PACKAGES_REGISTRY_URL }}\"" >> /etc/default/docker | ||||||
|  |           echo "{\"insecure-registries\": [\"${{ vars.PACKAGES_REGISTRY_URL }}\"]}" > /etc/docker/daemon.json | ||||||
|  |  | ||||||
|  |       - name: Check out repository | ||||||
|  |         uses: actions/checkout@v4 | ||||||
|  |         with: | ||||||
|  |           fetch-depth: 0 | ||||||
|  |           ref: ${{ needs.create_release.outputs.release_name }} | ||||||
|  |  | ||||||
|  |       - name: Set up Docker Buildx | ||||||
|  |         uses: docker/setup-buildx-action@v3 | ||||||
|  |  | ||||||
|  |       - name: Log in to Gitea Container Registry | ||||||
|  |         uses: docker/login-action@v3 | ||||||
|  |         with: | ||||||
|  |           registry: ${{ vars.PACKAGES_REGISTRY_URL }} | ||||||
|  |           username: ${{ vars.ACTIONS_USERNAME }} | ||||||
|  |           password: ${{ secrets.ACTIONS_TOKEN }} | ||||||
|  |  | ||||||
|  |       - name: Log in to GitHub Container Registry | ||||||
|  |         uses: docker/login-action@v3 | ||||||
|  |         with: | ||||||
|  |           registry: ghcr.io | ||||||
|  |           username: ${{ vars.GHCR_USERNAME }} | ||||||
|  |           password: ${{ secrets.GHCR_TOKEN }} | ||||||
|  |  | ||||||
|  |       - name: Extract metadata (tags, labels) for Docker | ||||||
|  |         id: meta | ||||||
|  |         uses: docker/metadata-action@v5 | ||||||
|  |         with: | ||||||
|  |           images: | | ||||||
|  |             ghcr.io/${{ vars.GHCR_USERNAME }}/roboluke-tasks | ||||||
|  |             ${{ vars.PACKAGES_REGISTRY_URL }}/${{ gitea.repository }} | ||||||
|  |           tags: type=semver,pattern=v{{version}},value=${{ needs.create_release.outputs.release_name }} | ||||||
|  |  | ||||||
|  |       - name: Print metadata | ||||||
|  |         run: | | ||||||
|  |           printf "Annotations:\n${{ steps.meta.outputs.annotations }}" | ||||||
|  |           echo "" | ||||||
|  |           printf "Labels:\n${{ steps.meta.outputs.labels }}" | ||||||
|  |           echo "" | ||||||
|  |           printf "Tags:\n${{ steps.meta.outputs.tags }}" | ||||||
|  |  | ||||||
|  |       - name: Build images | ||||||
|  |         uses: docker/build-push-action@v6 | ||||||
|  |         with: | ||||||
|  |           context: . | ||||||
|  |           push: false | ||||||
|  |           load: true | ||||||
|  |           annotations: ${{ steps.meta.outputs.annotations }} | ||||||
|  |           labels: ${{ steps.meta.outputs.labels }} | ||||||
|  |           tags: ${{ steps.meta.outputs.tags }} | ||||||
|  |  | ||||||
|  |       - name: Push images | ||||||
|  |         run: | | ||||||
|  |           strtags="${{ steps.meta.outputs.tags }}" | ||||||
|  |           readarray -t lines <<<"$strtags" | ||||||
|  |           for element in "${lines[@]}"; do docker push "$element"; done | ||||||
|  |           unset strtags lines | ||||||
							
								
								
									
										18
									
								
								.gitea/workflows/build_docker.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								.gitea/workflows/build_docker.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | name: Build Docker | ||||||
|  | on: | ||||||
|  |   release: | ||||||
|  |     types: | ||||||
|  |       - published | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   create_docker: | ||||||
|  |     name: Create Docker Image | ||||||
|  |     uses: https://git.tainton.uk/actions/gha-workflows/.gitea/workflows/build-push-docker.yml@main | ||||||
|  |     with: | ||||||
|  |       release: ${{ gitea.event.release.name }} | ||||||
|  |       registry: ${{ vars.PACKAGES_REGISTRY_URL }} | ||||||
|  |       actions_username: ${{ vars.ACTIONS_USERNAME }} | ||||||
|  |       ghcr_username: ${{ vars.GHCR_USERNAME }} | ||||||
|  |     secrets: | ||||||
|  |       ACTIONS_TOKEN: ${{ secrets.ACTIONS_TOKEN }} | ||||||
|  |       GHCR_TOKEN: ${{ secrets.GHCR_TOKEN }} | ||||||
							
								
								
									
										95
									
								
								.gitea/workflows/ci.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								.gitea/workflows/ci.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | |||||||
|  | name: CI | ||||||
|  | on: | ||||||
|  |   pull_request: | ||||||
|  |     types: | ||||||
|  |       - opened | ||||||
|  |       - edited | ||||||
|  |       - synchronize | ||||||
|  |       - reopened | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   ci: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     steps: | ||||||
|  |       - name: Check out repository code | ||||||
|  |         uses: actions/checkout@v4.2.2 | ||||||
|  |         with: | ||||||
|  |           fetch-depth: 0 | ||||||
|  |  | ||||||
|  |       - name: Run Hadolint | ||||||
|  |         uses: hadolint/hadolint-action@v3.1.0 | ||||||
|  |         with: | ||||||
|  |           dockerfile: Dockerfile | ||||||
|  |           output-file: hadolint.out | ||||||
|  |           format: sonarqube | ||||||
|  |           no-fail: true | ||||||
|  |  | ||||||
|  |       - name: Setup Python | ||||||
|  |         uses: actions/setup-python@v5 | ||||||
|  |         with: | ||||||
|  |           python-version: "3.13" | ||||||
|  |  | ||||||
|  |       - name: uv cache | ||||||
|  |         uses: actions/cache@v4 | ||||||
|  |         with: | ||||||
|  |           path: /tmp/.uv-cache | ||||||
|  |           key: uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} | ||||||
|  |           restore-keys: | | ||||||
|  |             uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} | ||||||
|  |             uv-${{ runner.os }} | ||||||
|  |  | ||||||
|  |       - name: Install dependencies | ||||||
|  |         run: uv sync | ||||||
|  |        | ||||||
|  |       - name: Check Import Sorting | ||||||
|  |         run: uv run isort --check app/ tests/ | ||||||
|  |  | ||||||
|  |       - name: Lint | ||||||
|  |         run: | | ||||||
|  |           uv run pylint --fail-under=8 --recursive=yes --output-format=parseable --output=lintreport.txt app/ tests/ | ||||||
|  |           cat lintreport.txt | ||||||
|  |  | ||||||
|  |       - name: Unit Test | ||||||
|  |         run: | | ||||||
|  |           uv run coverage run -m pytest -v --junitxml=testresults.xml | ||||||
|  |           uv run coverage report | ||||||
|  |         # sed -i 's@${{ gitea.workspace }}@/github/workspace@g' coverage.xml | ||||||
|  |  | ||||||
|  |       - name: Minimize uv cache | ||||||
|  |         run: uv cache prune --ci | ||||||
|  |  | ||||||
|  |       # - name: SonarQube Scan | ||||||
|  |       #   uses: SonarSource/sonarqube-scan-action@v5.2.0 | ||||||
|  |       #   env: | ||||||
|  |       #     SONAR_HOST_URL: ${{ secrets.SONARQUBE_HOST_URL }} | ||||||
|  |       #     SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} | ||||||
|  |  | ||||||
|  |       - name: Set up environment for Snyk | ||||||
|  |         run: | | ||||||
|  |           uv pip freeze > requirements.txt | ||||||
|  |           mv pyproject.toml pyproject.toml.bak | ||||||
|  |           mv uv.lock uv.lock.bak | ||||||
|  |  | ||||||
|  |       - name: Snyk SAST Scan | ||||||
|  |         uses: snyk/actions/python@master | ||||||
|  |         env: | ||||||
|  |           SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} | ||||||
|  |         with: | ||||||
|  |           # command: snyk | ||||||
|  |           args: snyk code test #--all-projects --exclude=.archive | ||||||
|  |  | ||||||
|  |       # - name: Snyk Vulnerability Scan | ||||||
|  |       #   uses: snyk/actions/python@master | ||||||
|  |       #   continue-on-error: true # Sometimes vulns aren't immediately fixable | ||||||
|  |       #   env: | ||||||
|  |       #     SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} | ||||||
|  |       #     DEBUG: "*snyk*" | ||||||
|  |       #   with: | ||||||
|  |       #     # command: snyk | ||||||
|  |       #     args: snyk test #--all-projects --exclude=.archive | ||||||
|  |        | ||||||
|  |       - name: Reverse set up environment for Snyk | ||||||
|  |         run: | | ||||||
|  |           rm -f requirements.txt | ||||||
|  |           mv pyproject.toml.bak pyproject.toml | ||||||
|  |           mv uv.lock.bak uv.lock | ||||||
							
								
								
									
										16
									
								
								.gitea/workflows/conventional_commit.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								.gitea/workflows/conventional_commit.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | name: Validate PR Title | ||||||
|  | on: | ||||||
|  |   pull_request: | ||||||
|  |     types: | ||||||
|  |       - opened | ||||||
|  |       - edited | ||||||
|  |       - synchronize | ||||||
|  |       - reopened | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   validate: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     steps: | ||||||
|  |       - uses: https://git.tainton.uk/actions/conventional-commits-check-action@v1.2.4 | ||||||
|  |         with: | ||||||
|  |           commit-message: ${{ gitea.event.pull_request.title }} | ||||||
							
								
								
									
										118
									
								
								.gitea/workflows/release.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								.gitea/workflows/release.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,118 @@ | |||||||
|  | name: Release | ||||||
|  | on: | ||||||
|  |   workflow_dispatch: | ||||||
|  |   schedule: | ||||||
|  |     - cron: '0 9 * * 0' | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   # test: | ||||||
|  |   #   name: Test | ||||||
|  |   #   uses: https://git.tainton.uk/${{ gitea.repository }}/.gitea/workflows/ci.yml@main | ||||||
|  |  | ||||||
|  |   tag: | ||||||
|  |     name: Tag release | ||||||
|  |     uses: https://git.tainton.uk/actions/gha-workflows/.gitea/workflows/release-with-tag.yaml@main | ||||||
|  |  | ||||||
|  |   create_release: | ||||||
|  |     name: Create Release | ||||||
|  |     needs: tag | ||||||
|  |     uses: https://git.tainton.uk/actions/gha-workflows/.gitea/workflows/create-release-preexisting-tag.yaml@main | ||||||
|  |     with: | ||||||
|  |       tag: ${{ needs.tag.outputs.tag_name }} | ||||||
|  |       body: ${{ needs.tag.outputs.changelog }} | ||||||
|  |     secrets: | ||||||
|  |       ACTIONS_TOKEN: ${{ secrets.ACTIONS_TOKEN }} | ||||||
|  |  | ||||||
|  |   # get_release_id: | ||||||
|  |   #   name: Get Release ID | ||||||
|  |   #   runs-on: ubuntu-latest | ||||||
|  |   #   needs: create_release | ||||||
|  |   #   outputs: | ||||||
|  |   #     releaseid: ${{ steps.getid.outputs.releaseid }} | ||||||
|  |   #   steps: | ||||||
|  |   #     - name: Get Release ID | ||||||
|  |   #       id: getid | ||||||
|  |   #       run: | | ||||||
|  |   #         rid=$(curl -s -X 'GET' \ | ||||||
|  |   #         -H 'accept: application/json' \ | ||||||
|  |   #         '${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}/releases/latest' | jq -r '.id') | ||||||
|  |   #         echo "releaseid=$rid" >> "$GITEA_OUTPUT" | ||||||
|  |   #         echo "$rid" | ||||||
|  |  | ||||||
|  |   create_docker: | ||||||
|  |     name: Publish Docker Images | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     needs: [tag, create_release] | ||||||
|  |     steps: | ||||||
|  |       - name: Update Docker configuration | ||||||
|  |         continue-on-error: true | ||||||
|  |         run: | | ||||||
|  |           mkdir -p /etc/default | ||||||
|  |           mkdir -p /etc/docker | ||||||
|  |           touch -a /etc/default/docker | ||||||
|  |           touch -a /etc/docker/daemon.json | ||||||
|  |           echo "DOCKER_OPTS=\"--insecure-registry ${{ vars.PACKAGES_REGISTRY_URL }}\"" >> /etc/default/docker | ||||||
|  |           echo "{\"insecure-registries\": [\"${{ vars.PACKAGES_REGISTRY_URL }}\"]}" > /etc/docker/daemon.json | ||||||
|  |  | ||||||
|  |       - name: Get repo name | ||||||
|  |         id: split | ||||||
|  |         run: echo "repo=${REPO##*/}" >> "$GITEA_OUTPUT" | ||||||
|  |         env: | ||||||
|  |           REPO: ${{ gitea.repository }} | ||||||
|  |  | ||||||
|  |       - name: Check out repository | ||||||
|  |         uses: actions/checkout@v4.2.2 | ||||||
|  |         with: | ||||||
|  |           fetch-depth: 0 | ||||||
|  |           ref: ${{ needs.tag.outputs.tag_name }} | ||||||
|  |  | ||||||
|  |       - name: Set up Docker Buildx | ||||||
|  |         uses: docker/setup-buildx-action@v3 | ||||||
|  |  | ||||||
|  |       - name: Log in to Gitea Container Registry | ||||||
|  |         uses: docker/login-action@v3 | ||||||
|  |         with: | ||||||
|  |           registry: ${{ vars.PACKAGES_REGISTRY_URL }} | ||||||
|  |           username: ${{ vars.ACTIONS_USERNAME }} | ||||||
|  |           password: ${{ secrets.ACTIONS_TOKEN }} | ||||||
|  |  | ||||||
|  |       - name: Log in to GitHub Container Registry | ||||||
|  |         uses: docker/login-action@v3 | ||||||
|  |         with: | ||||||
|  |           registry: ghcr.io | ||||||
|  |           username: ${{ vars.GHCR_USERNAME }} | ||||||
|  |           password: ${{ secrets.GHCR_TOKEN }} | ||||||
|  |  | ||||||
|  |       - name: Extract metadata (tags, labels) for Docker | ||||||
|  |         id: meta | ||||||
|  |         uses: docker/metadata-action@v5 | ||||||
|  |         with: | ||||||
|  |           tags: type=semver,pattern=v{{version}},value=${{ needs.tag.outputs.tag_name }} | ||||||
|  |           images: | | ||||||
|  |             ghcr.io/${{ vars.GHCR_USERNAME }}/${{ steps.split.outputs.repo }} | ||||||
|  |             ${{ vars.PACKAGES_REGISTRY_URL }}/${{ gitea.repository }} | ||||||
|  |  | ||||||
|  |       - name: Print metadata | ||||||
|  |         run: | | ||||||
|  |           printf "Annotations:\n${{ steps.meta.outputs.annotations }}" | ||||||
|  |           echo "" | ||||||
|  |           printf "Labels:\n${{ steps.meta.outputs.labels }}" | ||||||
|  |           echo "" | ||||||
|  |           printf "Tags:\n${{ steps.meta.outputs.tags }}" | ||||||
|  |  | ||||||
|  |       - name: Build images | ||||||
|  |         uses: docker/build-push-action@v6 | ||||||
|  |         with: | ||||||
|  |           context: . | ||||||
|  |           push: false | ||||||
|  |           load: true | ||||||
|  |           annotations: ${{ steps.meta.outputs.annotations }} | ||||||
|  |           labels: ${{ steps.meta.outputs.labels }} | ||||||
|  |           tags: ${{ steps.meta.outputs.tags }} | ||||||
|  |  | ||||||
|  |       - name: Push images | ||||||
|  |         run: | | ||||||
|  |           strtags="${{ steps.meta.outputs.tags }}" | ||||||
|  |           readarray -t lines <<<"$strtags" | ||||||
|  |           for element in "${lines[@]}"; do docker push "$element"; done | ||||||
|  |           unset strtags lines | ||||||
							
								
								
									
										24
									
								
								.gitea/workflows/snyk.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								.gitea/workflows/snyk.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | name: Snyk | ||||||
|  |  | ||||||
|  | on: | ||||||
|  |   workflow_dispatch: | ||||||
|  |   push: | ||||||
|  |     branches: | ||||||
|  |       - main | ||||||
|  |   schedule: | ||||||
|  |     - cron: "@daily" | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   security: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     steps: | ||||||
|  |       - name: Checkout repo | ||||||
|  |         uses: actions/checkout@v4.2.2 | ||||||
|  |  | ||||||
|  |       - name: Snyk | ||||||
|  |         uses: snyk/actions/python@master | ||||||
|  |         continue-on-error: true | ||||||
|  |         env: | ||||||
|  |           SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} | ||||||
|  |         with: | ||||||
|  |           command: monitor | ||||||
							
								
								
									
										2
									
								
								.github/CODEOWNERS
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/CODEOWNERS
									
									
									
									
										vendored
									
									
								
							| @@ -1 +1 @@ | |||||||
| *   @luketainton | *   @luketainton | ||||||
|   | |||||||
							
								
								
									
										33
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | --- | ||||||
|  | name: Bug report | ||||||
|  | about: Create a report to help improve the bot. | ||||||
|  | title: 'BUG: ' | ||||||
|  | labels: bug | ||||||
|  | assignees: luketainton | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | **Describe the bug** | ||||||
|  | A clear and concise description of what the bug is. | ||||||
|  |  | ||||||
|  | **To Reproduce** | ||||||
|  | Steps to reproduce the behavior: | ||||||
|  | 1. Go to '...' | ||||||
|  | 2. Click on '....' | ||||||
|  | 3. Scroll down to '....' | ||||||
|  | 4. See error | ||||||
|  |  | ||||||
|  | **Expected behavior** | ||||||
|  | A clear and concise description of what you expected to happen. | ||||||
|  |  | ||||||
|  | **Screenshots** | ||||||
|  | If applicable, add screenshots to help explain your problem. | ||||||
|  |  | ||||||
|  | **Webex Client (please complete the following information):** | ||||||
|  |  - Type: [e.g. Browser, Desktop, Mobile] | ||||||
|  |  - OS: [e.g. iOS, Android, Windows, MacOS] | ||||||
|  |  - Browser: [e.g. Chrome, Safari] (only applicable for browser client) | ||||||
|  |  - Version: [e.g. 22] (only applicable for non-browser clients) | ||||||
|  |  | ||||||
|  | **Additional context** | ||||||
|  | Add any other context about the problem here. | ||||||
							
								
								
									
										20
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.github/ISSUE_TEMPLATE/feature_request.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | --- | ||||||
|  | name: Feature request | ||||||
|  | about: Suggest an enhancement for the bot. | ||||||
|  | title: 'FEATURE: ' | ||||||
|  | labels: enhancement | ||||||
|  | assignees: luketainton | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | **Is your feature request related to a problem? Please describe.** | ||||||
|  | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] | ||||||
|  |  | ||||||
|  | **Describe the solution you'd like** | ||||||
|  | A clear and concise description of what you want to happen. | ||||||
|  |  | ||||||
|  | **Describe alternatives you've considered** | ||||||
|  | A clear and concise description of any alternative solutions or features you've considered. | ||||||
|  |  | ||||||
|  | **Additional context** | ||||||
|  | Add any other context or screenshots about the feature request here. | ||||||
							
								
								
									
										34
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								.github/renovate.json
									
									
									
									
										vendored
									
									
								
							| @@ -1,47 +1,47 @@ | |||||||
| { | { | ||||||
|  |   "assignAutomerge": true, | ||||||
|  |   "assigneesFromCodeOwners": true, | ||||||
|  |   "baseBranches": [ | ||||||
|  |     "main" | ||||||
|  |   ], | ||||||
|  |   "dependencyDashboardAutoclose": true, | ||||||
|   "extends": [ |   "extends": [ | ||||||
|     "config:base", |     "config:base", | ||||||
|     ":semanticCommits", |     ":semanticCommits", | ||||||
|     ":semanticCommitTypeAll(fix)" |     ":semanticCommitTypeAll(fix)" | ||||||
|   ], |   ], | ||||||
|   "baseBranches": [ |  | ||||||
|     "next" |  | ||||||
|   ], |  | ||||||
|   "platformCommit": true, |  | ||||||
|   "dependencyDashboardAutoclose": true, |  | ||||||
|   "assignAutomerge": true, |  | ||||||
|   "assigneesFromCodeOwners": true, |  | ||||||
|   "rebaseWhen": "behind-base-branch", |  | ||||||
|   "rollbackPrs": true, |  | ||||||
|   "labels": [ |   "labels": [ | ||||||
|     "dependencies" |     "dependencies" | ||||||
|   ], |   ], | ||||||
|   "packageRules": [ |   "packageRules": [ | ||||||
|     { |     { | ||||||
|  |       "labels": [ | ||||||
|  |         "linting" | ||||||
|  |       ], | ||||||
|       "matchPackagePatterns": [ |       "matchPackagePatterns": [ | ||||||
|         "black", |         "black", | ||||||
|         "pylint" |         "pylint" | ||||||
|       ], |  | ||||||
|       "labels": [ |  | ||||||
|         "linting" |  | ||||||
|       ] |       ] | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|  |       "labels": [ | ||||||
|  |         "unit-tests" | ||||||
|  |       ], | ||||||
|       "matchPackagePatterns": [ |       "matchPackagePatterns": [ | ||||||
|         "coverage", |         "coverage", | ||||||
|         "pytest" |         "pytest" | ||||||
|       ], |  | ||||||
|       "labels": [ |  | ||||||
|         "unit-tests" |  | ||||||
|       ] |       ] | ||||||
|     } |     } | ||||||
|   ], |   ], | ||||||
|  |   "platformCommit": true, | ||||||
|  |   "rebaseWhen": "behind-base-branch", | ||||||
|  |   "rollbackPrs": true, | ||||||
|   "vulnerabilityAlerts": { |   "vulnerabilityAlerts": { | ||||||
|  |     "commitMessagePrefix": "[SECURITY] ", | ||||||
|     "enabled": true, |     "enabled": true, | ||||||
|     "labels": [ |     "labels": [ | ||||||
|       "security" |       "security" | ||||||
|     ], |     ], | ||||||
|     "commitMessagePrefix": "[SECURITY] ", |  | ||||||
|     "prCreation": "immediate" |     "prCreation": "immediate" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										64
									
								
								.github/workflows-old/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								.github/workflows-old/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | |||||||
|  | name: Build | ||||||
|  | on: | ||||||
|  |   push: | ||||||
|  |     branches: [main] | ||||||
|  |  | ||||||
|  | env: | ||||||
|  |   REGISTRY: ghcr.io | ||||||
|  |   IMAGE_NAME: ${{ github.repository }} | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   release: | ||||||
|  |     name: Release | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     outputs: | ||||||
|  |       new_tag: ${{ steps.tag_version.outputs.new_tag }} | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v4 | ||||||
|  |       - name: Bump version and push tag | ||||||
|  |         id: tag_version | ||||||
|  |         uses: mathieudutour/github-tag-action@v6.2 | ||||||
|  |         with: | ||||||
|  |           github_token: ${{ secrets.GITHUB_TOKEN }} | ||||||
|  |           default_bump: minor | ||||||
|  |       - name: Create a GitHub release | ||||||
|  |         uses: ncipollo/release-action@v1 | ||||||
|  |         with: | ||||||
|  |           tag: ${{ steps.tag_version.outputs.new_tag }} | ||||||
|  |           name: ${{ steps.tag_version.outputs.new_tag }} | ||||||
|  |           body: ${{ steps.tag_version.outputs.changelog }} | ||||||
|  |           generateReleaseNotes: true | ||||||
|  |  | ||||||
|  |   publish: | ||||||
|  |     name: GitHub Container Registry | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     needs: release | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       packages: write | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v4 | ||||||
|  |       - name: Login to GitHub Container Registry | ||||||
|  |         run: echo ${{ secrets.GITHUB_TOKEN }} | docker login ${{ env.REGISTRY }} -u ${{ github.actor }} --password-stdin | ||||||
|  |       - name: Build image for GitHub Package Registry | ||||||
|  |         run: | | ||||||
|  |           docker build . --file Dockerfile \ | ||||||
|  |           --build-arg "version=${{ needs.release.outputs.new_tag }}" \ | ||||||
|  |           --tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.release.outputs.new_tag }} \ | ||||||
|  |           --tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest | ||||||
|  |       - name: Push image to GitHub Package Registry | ||||||
|  |         run: | | ||||||
|  |           docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest | ||||||
|  |           docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.release.outputs.new_tag }} | ||||||
|  |  | ||||||
|  |   # deploy: | ||||||
|  |   #   name: Update Portainer Deployment | ||||||
|  |   #   runs-on: ubuntu-latest | ||||||
|  |   #   needs: publish | ||||||
|  |   #   steps: | ||||||
|  |   #     - uses: fjogeleit/http-request-action@v1 | ||||||
|  |   #       with: | ||||||
|  |   #         url: ${{ secrets.PORTAINER_WEBHOOK_URL }} | ||||||
|  |   #         method: POST | ||||||
|  |   #         timeout: 60000 | ||||||
|  |   #         preventFailureOnNoResponse: "true" | ||||||
							
								
								
									
										4
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							| @@ -12,7 +12,9 @@ on: | |||||||
|  |  | ||||||
| jobs: | jobs: | ||||||
|   ci: |   ci: | ||||||
|     uses: luketainton/gha-workflows/.github/workflows/ci-python-with-docker.yml@main |     uses: luketainton/gha-workflows/.github/workflows/ci-python-poetry-with-docker.yml@main | ||||||
|  |     with: | ||||||
|  |       python-version: 3.13 | ||||||
|     secrets: |     secrets: | ||||||
|       SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} |       SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} | ||||||
|       SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} |       SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} | ||||||
|   | |||||||
							
								
								
									
										73
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										73
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,57 +1,26 @@ | |||||||
| name: Build | name: Release | ||||||
| on: | on: | ||||||
|   push: |   workflow_dispatch: | ||||||
|     branches: [main] |   schedule: | ||||||
|  |     - cron: "0 9 * * 0" | ||||||
|  |  | ||||||
| jobs: | jobs: | ||||||
|   release: |   test: | ||||||
|     name: Release |     uses: luketainton/gha-workflows/.github/workflows/ci-python-poetry-with-docker.yml@main | ||||||
|     runs-on: ubuntu-latest |     with: | ||||||
|     outputs: |       python-version: 3.13 | ||||||
|       new_tag: ${{ steps.tag_version.outputs.new_tag }} |     secrets: | ||||||
|     steps: |       SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} | ||||||
|       - uses: actions/checkout@v4 |       SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} | ||||||
|       - name: Bump version and push tag |  | ||||||
|         id: tag_version |  | ||||||
|         uses: mathieudutour/github-tag-action@v6.2 |  | ||||||
|         with: |  | ||||||
|           github_token: ${{ secrets.GITHUB_TOKEN }} |  | ||||||
|           default_bump: minor |  | ||||||
|       - name: Create a GitHub release |  | ||||||
|         uses: ncipollo/release-action@v1 |  | ||||||
|         with: |  | ||||||
|           tag: ${{ steps.tag_version.outputs.new_tag }} |  | ||||||
|           name: ${{ steps.tag_version.outputs.new_tag }} |  | ||||||
|           body: ${{ steps.tag_version.outputs.changelog }} |  | ||||||
|           generateReleaseNotes: true |  | ||||||
|  |  | ||||||
|   publish: |   create_release: | ||||||
|     name: GitHub Container Registry |     name: Create Release | ||||||
|     runs-on: ubuntu-latest |     uses: luketainton/gha-workflows/.github/workflows/create-release.yml@main | ||||||
|     needs: release |  | ||||||
|     steps: |  | ||||||
|       - uses: actions/checkout@v4 |  | ||||||
|       - name: Login to GitHub Container Registry |  | ||||||
|         run: echo ${{ secrets.GHCR_ACCESS_TOKEN }} | docker login ghcr.io -u luketainton --password-stdin |  | ||||||
|       - name: Build image for GitHub Package Registry |  | ||||||
|         run: | |  | ||||||
|           docker build . --file Dockerfile \ |  | ||||||
|           --build-arg "version=${{ needs.release.outputs.new_tag }}" \ |  | ||||||
|           --tag ghcr.io/luketainton/roboluke-tasks:${{ needs.release.outputs.new_tag }} \ |  | ||||||
|           --tag ghcr.io/luketainton/roboluke-tasks:latest |  | ||||||
|       - name: Push image to GitHub Package Registry |  | ||||||
|         run: | |  | ||||||
|           docker push ghcr.io/luketainton/roboluke-tasks:latest |  | ||||||
|           docker push ghcr.io/luketainton/roboluke-tasks:${{ needs.release.outputs.new_tag }} |  | ||||||
|  |  | ||||||
|   deploy: |   create_docker: | ||||||
|     name: Update Portainer Deployment |     name: Create Docker Image | ||||||
|     runs-on: ubuntu-latest |     needs: create_release | ||||||
|     needs: publish |     if: ${{ needs.create_release.outputs.success == 'true' }} | ||||||
|     steps: |     uses: luketainton/gha-workflows/.github/workflows/build-push-attest-docker.yml@main | ||||||
|       - uses: fjogeleit/http-request-action@v1 |     with: | ||||||
|         with: |         release: ${{ needs.create_release.outputs.release_name }} | ||||||
|           url: ${{ secrets.PORTAINER_WEBHOOK_URL }} |  | ||||||
|           method: POST |  | ||||||
|           timeout: 60000 |  | ||||||
|           preventFailureOnNoResponse: "true" |  | ||||||
|   | |||||||
							
								
								
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -26,6 +26,8 @@ share/python-wheels/ | |||||||
| .installed.cfg | .installed.cfg | ||||||
| *.egg | *.egg | ||||||
| MANIFEST | MANIFEST | ||||||
|  | .pdm-build/ | ||||||
|  | requirements*.txt | ||||||
|  |  | ||||||
| # PyInstaller | # PyInstaller | ||||||
| #  Usually these files are written by a python script from a template | #  Usually these files are written by a python script from a template | ||||||
| @@ -52,6 +54,7 @@ coverage.xml | |||||||
| *.py,cover | *.py,cover | ||||||
| .hypothesis/ | .hypothesis/ | ||||||
| .pytest_cache/ | .pytest_cache/ | ||||||
|  | .ruff_cache/ | ||||||
|  |  | ||||||
| # Translations | # Translations | ||||||
| *.mo | *.mo | ||||||
| @@ -111,6 +114,7 @@ venv/ | |||||||
| ENV/ | ENV/ | ||||||
| env.bak/ | env.bak/ | ||||||
| venv.bak/ | venv.bak/ | ||||||
|  | .env.test | ||||||
|  |  | ||||||
| # Spyder project settings | # Spyder project settings | ||||||
| .spyderproject | .spyderproject | ||||||
| @@ -133,3 +137,6 @@ dmypy.json | |||||||
| # IDE | # IDE | ||||||
| .vscode | .vscode | ||||||
| .idea | .idea | ||||||
|  |  | ||||||
|  | # Other | ||||||
|  | .dccache | ||||||
|   | |||||||
							
								
								
									
										60
									
								
								.pre-commit-config.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								.pre-commit-config.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | fail_fast: false | ||||||
|  |  | ||||||
|  | minimum_pre_commit_version: 3.8.0 | ||||||
|  |  | ||||||
|  | default_install_hook_types: [pre-commit, commit-msg] | ||||||
|  |  | ||||||
|  | default_language_version: | ||||||
|  |   python: python3.11 | ||||||
|  |  | ||||||
|  | repos: | ||||||
|  |   - repo: https://github.com/pre-commit/pre-commit-hooks | ||||||
|  |     rev: v4.6.0 | ||||||
|  |     hooks: | ||||||
|  |       - id: trailing-whitespace | ||||||
|  |       - id: mixed-line-ending | ||||||
|  |       - id: end-of-file-fixer | ||||||
|  |       - id: requirements-txt-fixer | ||||||
|  |       - id: check-yaml | ||||||
|  |       - id: check-added-large-files | ||||||
|  |       - id: check-ast | ||||||
|  |       - id: check-docstring-first | ||||||
|  |       - id: check-json | ||||||
|  |       - id: check-merge-conflict | ||||||
|  |       - id: check-toml | ||||||
|  |       - id: check-xml | ||||||
|  |       - id: detect-private-key | ||||||
|  |       - id: no-commit-to-branch | ||||||
|  |       - id: requirements-txt-fixer | ||||||
|  |       - id: name-tests-test | ||||||
|  |         args: [--pytest-test-first] | ||||||
|  |       - id: pretty-format-json | ||||||
|  |         args: [--autofix] | ||||||
|  |  | ||||||
|  |   - repo: https://github.com/astral-sh/ruff-pre-commit | ||||||
|  |     rev: v0.5.6 | ||||||
|  |     hooks: | ||||||
|  |       - id: ruff-format # Run the formatter. | ||||||
|  |       - id: ruff # Run the linter. | ||||||
|  |         args: [--fix] | ||||||
|  |  | ||||||
|  |   - repo: https://github.com/pycqa/isort | ||||||
|  |     rev: 5.13.2 | ||||||
|  |     hooks: | ||||||
|  |       - id: isort | ||||||
|  |  | ||||||
|  |   - repo: https://github.com/pre-commit/pygrep-hooks | ||||||
|  |     rev: v1.10.0 | ||||||
|  |     hooks: | ||||||
|  |       - id: python-use-type-annotations | ||||||
|  |  | ||||||
|  |   - repo: https://github.com/asottile/pyupgrade | ||||||
|  |     rev: v3.17.0 | ||||||
|  |     hooks: | ||||||
|  |       - id: pyupgrade | ||||||
|  |  | ||||||
|  |   - repo: https://github.com/compilerla/conventional-pre-commit | ||||||
|  |     rev: v3.4.0 | ||||||
|  |     hooks: | ||||||
|  |       - id: conventional-pre-commit | ||||||
|  |         stages: [commit-msg] | ||||||
							
								
								
									
										15
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								Dockerfile
									
									
									
									
									
								
							| @@ -1,17 +1,22 @@ | |||||||
| FROM python:3.11-slim | FROM python:3.13-slim | ||||||
| LABEL maintainer="Luke Tainton <luke@tainton.uk>" | LABEL maintainer="Luke Tainton <luke@tainton.uk>" | ||||||
| LABEL org.opencontainers.image.source="https://github.com/luketainton/roboluke-tasks" |  | ||||||
| USER root | USER root | ||||||
|  |  | ||||||
| ENV PYTHONPATH="/run:/usr/local/lib/python3.11/lib-dynload:/usr/local/lib/python3.11/site-packages:/usr/local/lib/python3.11" | ENV PYTHONPATH="/run:/usr/local/lib/python3.11/lib-dynload:/usr/local/lib/python3.11/site-packages:/usr/local/lib/python3.11" | ||||||
|  | ENV UV_PROJECT_ENVIRONMENT="/usr/local/" | ||||||
|  |  | ||||||
| WORKDIR /run | WORKDIR /run | ||||||
|  |  | ||||||
| RUN mkdir -p /.local && \ | RUN mkdir -p /.local && \ | ||||||
|     chmod -R 777 /.local && \ |     chmod -R 777 /.local && \ | ||||||
|     pip install -U pip |     pip install -U pip uv==0.5.14 | ||||||
|  |  | ||||||
| COPY requirements.txt /run/requirements.txt | COPY pyproject.toml /run/pyproject.toml | ||||||
| RUN pip install --no-cache-dir -r requirements.txt | COPY uv.lock /run/uv.lock | ||||||
|  | # needed for PDM build | ||||||
|  | COPY README.md /run/README.md | ||||||
|  |  | ||||||
|  | RUN uv sync --frozen | ||||||
|  |  | ||||||
| ENTRYPOINT ["python3", "-B", "-m", "app.main"] | ENTRYPOINT ["python3", "-B", "-m", "app.main"] | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,6 +9,10 @@ Add tasks to a Wekan to do list via Webex and n8n. | |||||||
| 3. Edit `.env` as required: | 3. Edit `.env` as required: | ||||||
|     - `ADMIN_EMAIL` - comma-separated list of admin (who owns the to-do list) email addresses |     - `ADMIN_EMAIL` - comma-separated list of admin (who owns the to-do list) email addresses | ||||||
|     - `ADMIN_FIRST_NAME` - admin first name |     - `ADMIN_FIRST_NAME` - admin first name | ||||||
|  |     - `APP_LIFECYCLE` - set the name of the environment | ||||||
|  |     - `APPROVED_DOMAINS` - comma-separated list of domains that users are allowed to message the bot from | ||||||
|  |     - `APPROVED_ROOMS` - comma-separated list of room IDs that users are allowed to message the bot from | ||||||
|  |     - `APPROVED_USERS` - comma-separated list of email addresses of approved users | ||||||
|     - `BOT_NAME` - Webex bot name |     - `BOT_NAME` - Webex bot name | ||||||
|     - `N8N_WEBHOOK_URL` - n8n webhook URL |     - `N8N_WEBHOOK_URL` - n8n webhook URL | ||||||
|     - `WEBEX_API_KEY` - Webex API key |     - `WEBEX_API_KEY` - Webex API key | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| #!/usr/bin/env python3 | """Exit command.""" | ||||||
|  |  | ||||||
| import logging | import logging | ||||||
|  |  | ||||||
| @@ -8,7 +8,10 @@ log: logging.Logger = logging.getLogger(__name__) | |||||||
|  |  | ||||||
|  |  | ||||||
| class ExitCommand(Command): | class ExitCommand(Command): | ||||||
|  |     """Exit command class.""" | ||||||
|  |  | ||||||
|     def __init__(self) -> None: |     def __init__(self) -> None: | ||||||
|  |         """Exit command class.""" | ||||||
|         super().__init__( |         super().__init__( | ||||||
|             command_keyword="exit", |             command_keyword="exit", | ||||||
|             help_message="Exit", |             help_message="Exit", | ||||||
| @@ -17,10 +20,10 @@ class ExitCommand(Command): | |||||||
|         self.sender: str = "" |         self.sender: str = "" | ||||||
|  |  | ||||||
|     def pre_execute(self, message, attachment_actions, activity) -> None: |     def pre_execute(self, message, attachment_actions, activity) -> None: | ||||||
|         pass |         """Pre-execute method.""" | ||||||
|  |  | ||||||
|     def execute(self, message, attachment_actions, activity) -> None: |     def execute(self, message, attachment_actions, activity) -> None: | ||||||
|         pass |         """Execute method.""" | ||||||
|  |  | ||||||
|     def post_execute(self, message, attachment_actions, activity) -> None: |     def post_execute(self, message, attachment_actions, activity) -> None: | ||||||
|         pass |         """Post-execute method.""" | ||||||
|   | |||||||
| @@ -1,21 +1,12 @@ | |||||||
| #!/usr/bin/env python3 | """Submit task command.""" | ||||||
|  |  | ||||||
| import logging | import logging | ||||||
| import sentry_sdk |  | ||||||
|  |  | ||||||
| from webex_bot.models.command import Command | from webex_bot.models.command import Command | ||||||
| from webex_bot.models.response import Response, response_from_adaptive_card | from webex_bot.models.response import Response, response_from_adaptive_card | ||||||
| from webexteamssdk.models.cards import ( | from webexpythonsdk.models.cards import (AdaptiveCard, Column, ColumnSet, Date, | ||||||
|     AdaptiveCard, |                                          FontSize, FontWeight, Text, TextBlock) | ||||||
|     Column, | from webexpythonsdk.models.cards.actions import Submit | ||||||
|     ColumnSet, |  | ||||||
|     Date, |  | ||||||
|     FontSize, |  | ||||||
|     FontWeight, |  | ||||||
|     Text, |  | ||||||
|     TextBlock, |  | ||||||
| ) |  | ||||||
| from webexteamssdk.models.cards.actions import Submit |  | ||||||
|  |  | ||||||
| from app.utils.config import config | from app.utils.config import config | ||||||
| from app.utils.n8n import get_tasks, submit_task | from app.utils.n8n import get_tasks, submit_task | ||||||
| @@ -24,7 +15,10 @@ log: logging.Logger = logging.getLogger(__name__) | |||||||
|  |  | ||||||
|  |  | ||||||
| class SubmitTaskCommand(Command): | class SubmitTaskCommand(Command): | ||||||
|  |     """Submit task command.""" | ||||||
|  |  | ||||||
|     def __init__(self) -> None: |     def __init__(self) -> None: | ||||||
|  |         """Submit task command.""" | ||||||
|         super().__init__( |         super().__init__( | ||||||
|             command_keyword="submit_feedback_dstgmyn", |             command_keyword="submit_feedback_dstgmyn", | ||||||
|             help_message="Submit Task", |             help_message="Submit Task", | ||||||
| @@ -34,9 +28,11 @@ class SubmitTaskCommand(Command): | |||||||
|         self.sender: str = "" |         self.sender: str = "" | ||||||
|  |  | ||||||
|     def pre_execute(self, message, attachment_actions, activity) -> None: |     def pre_execute(self, message, attachment_actions, activity) -> None: | ||||||
|  |         """Pre-execute method.""" | ||||||
|         self.sender = activity.get("actor").get("id") |         self.sender = activity.get("actor").get("id") | ||||||
|  |  | ||||||
|     def execute(self, message, attachment_actions, activity) -> Response: |     def execute(self, message, attachment_actions, activity) -> Response: | ||||||
|  |         """Execute method.""" | ||||||
|         card_body: list = [ |         card_body: list = [ | ||||||
|             ColumnSet( |             ColumnSet( | ||||||
|                 columns=[ |                 columns=[ | ||||||
| @@ -48,7 +44,8 @@ class SubmitTaskCommand(Command): | |||||||
|                                 size=FontSize.MEDIUM, |                                 size=FontSize.MEDIUM, | ||||||
|                             ), |                             ), | ||||||
|                             TextBlock( |                             TextBlock( | ||||||
|                                 f"Add a task to {config.admin_first_name}'s To Do list. All fields are required. Please don't use special characters.", |                                 f"Add a task to {config.admin_first_name}'s To Do list. " | ||||||
|  |                                 + "All fields are required. Please don't use special characters.", | ||||||
|                                 wrap=True, |                                 wrap=True, | ||||||
|                                 isSubtle=True, |                                 isSubtle=True, | ||||||
|                             ), |                             ), | ||||||
| @@ -62,7 +59,9 @@ class SubmitTaskCommand(Command): | |||||||
|                     Column( |                     Column( | ||||||
|                         width=2, |                         width=2, | ||||||
|                         items=[ |                         items=[ | ||||||
|                             Text(id="issue_title", placeholder="Summary", maxLength=100), |                             Text( | ||||||
|  |                                 id="issue_title", placeholder="Summary", maxLength=100 | ||||||
|  |                             ), | ||||||
|                             Text( |                             Text( | ||||||
|                                 id="issue_description", |                                 id="issue_description", | ||||||
|                                 placeholder="Description", |                                 placeholder="Description", | ||||||
| @@ -85,7 +84,8 @@ class SubmitTaskCommand(Command): | |||||||
|                             items=[ |                             items=[ | ||||||
|                                 Text( |                                 Text( | ||||||
|                                     id="issue_requester", |                                     id="issue_requester", | ||||||
|                                     placeholder="Requester Email (leave blank to submit for yourself)", |                                     placeholder="Requester Email " | ||||||
|  |                                     + "(leave blank to submit for yourself)", | ||||||
|                                     maxLength=100, |                                     maxLength=100, | ||||||
|                                 ), |                                 ), | ||||||
|                             ], |                             ], | ||||||
| @@ -114,24 +114,31 @@ class SubmitTaskCommand(Command): | |||||||
|                 Submit(title="Cancel", data={"command_keyword": "exit"}), |                 Submit(title="Cancel", data={"command_keyword": "exit"}), | ||||||
|             ], |             ], | ||||||
|         ) |         ) | ||||||
|         with sentry_sdk.start_transaction(name="submit_task_command"): |         _result = response_from_adaptive_card(card) | ||||||
|             return response_from_adaptive_card(card) |         return _result | ||||||
|  |  | ||||||
|  |  | ||||||
| class SubmitTaskCallback(Command): | class SubmitTaskCallback(Command): | ||||||
|  |     """Submit task callback.""" | ||||||
|  |  | ||||||
|     def __init__(self) -> None: |     def __init__(self) -> None: | ||||||
|  |         """Submit task callback.""" | ||||||
|         super().__init__( |         super().__init__( | ||||||
|             card_callback_keyword="submit_task_callback_rbamzfyx", delete_previous_message=True |             card_callback_keyword="submit_task_callback_rbamzfyx", | ||||||
|  |             delete_previous_message=True, | ||||||
|         ) |         ) | ||||||
|         self.msg: str = "" |         self.msg: str = "" | ||||||
|  |  | ||||||
|     def pre_execute(self, message, attachment_actions, activity) -> None: |     def pre_execute(self, message, attachment_actions, activity) -> None: | ||||||
|  |         """Pre-execute method.""" | ||||||
|         issue_title: str = attachment_actions.inputs.get("issue_title") |         issue_title: str = attachment_actions.inputs.get("issue_title") | ||||||
|         issue_description: str = attachment_actions.inputs.get("issue_description") |         issue_description: str = attachment_actions.inputs.get("issue_description") | ||||||
|         completion_date: str = attachment_actions.inputs.get("completion_date") |         completion_date: str = attachment_actions.inputs.get("completion_date") | ||||||
|  |  | ||||||
|         sender: str = attachment_actions.inputs.get("sender") |         sender: str = attachment_actions.inputs.get("sender") | ||||||
|         issue_requester: str = attachment_actions.inputs.get("issue_requester") or sender |         issue_requester: str = ( | ||||||
|  |             attachment_actions.inputs.get("issue_requester") or sender | ||||||
|  |         ) | ||||||
|  |  | ||||||
|         if not issue_title or not issue_description or not completion_date: |         if not issue_title or not issue_description or not completion_date: | ||||||
|             self.msg = "Please complete all fields." |             self.msg = "Please complete all fields." | ||||||
| @@ -145,29 +152,37 @@ class SubmitTaskCallback(Command): | |||||||
|         ) |         ) | ||||||
|  |  | ||||||
|         self.msg = ( |         self.msg = ( | ||||||
|             "Submitting your task..." if result else "Failed to submit task. Please try again." |             "Submitting your task..." | ||||||
|  |             if result | ||||||
|  |             else "Failed to submit task. Please try again." | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|     def execute(self, message, attachment_actions, activity) -> str: |     def execute(self, message, attachment_actions, activity) -> str: | ||||||
|         with sentry_sdk.start_transaction(name="submit_task_callback"): |         """Execute method.""" | ||||||
|             return self.msg |         return self.msg | ||||||
|  |  | ||||||
|  |  | ||||||
| class MyTasksCallback(Command): | class MyTasksCallback(Command): | ||||||
|  |     """My tasks callback.""" | ||||||
|  |  | ||||||
|     def __init__(self) -> None: |     def __init__(self) -> None: | ||||||
|  |         """My tasks callback.""" | ||||||
|         super().__init__( |         super().__init__( | ||||||
|             card_callback_keyword="my_tasks_callback_rbamzfyx", delete_previous_message=True |             card_callback_keyword="my_tasks_callback_rbamzfyx", | ||||||
|  |             delete_previous_message=True, | ||||||
|         ) |         ) | ||||||
|         self.msg: str = "" |         self.msg: str = "" | ||||||
|  |  | ||||||
|     def pre_execute(self, message, attachment_actions, activity) -> str: |     def pre_execute(self, message, attachment_actions, activity) -> str: | ||||||
|         with sentry_sdk.start_transaction(name="my_tasks_preexec"): |         """Pre-execute method.""" | ||||||
|             return "Getting your tasks..." |         _msg: str = "Getting your tasks..." | ||||||
|  |         return _msg | ||||||
|  |  | ||||||
|     def execute(self, message, attachment_actions, activity) -> str | None: |     def execute(self, message, attachment_actions, activity) -> str | None: | ||||||
|  |         """Execute method.""" | ||||||
|         sender: str = attachment_actions.inputs.get("sender") |         sender: str = attachment_actions.inputs.get("sender") | ||||||
|         result: bool = get_tasks(requestor=sender) |         result: bool = get_tasks(requestor=sender) | ||||||
|         with sentry_sdk.start_transaction(name="my_tasks_exec"): |         _msg: str = "Failed to get tasks. Please try again." | ||||||
|             if not result: |         if not result: | ||||||
|                 return "Failed to get tasks. Please try again." |             return _msg | ||||||
|             return |         return None | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								app/main.py
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								app/main.py
									
									
									
									
									
								
							| @@ -1,7 +1,6 @@ | |||||||
| #!/usr/bin/env python3 | """Main module.""" | ||||||
|  |  | ||||||
| import sentry_sdk | import sys | ||||||
| from sentry_sdk.integrations.stdlib import StdlibIntegration |  | ||||||
|  |  | ||||||
| from webex_bot.webex_bot import WebexBot | from webex_bot.webex_bot import WebexBot | ||||||
|  |  | ||||||
| @@ -10,23 +9,14 @@ from app.commands.submit_task import SubmitTaskCommand | |||||||
| from app.utils.config import config | from app.utils.config import config | ||||||
|  |  | ||||||
|  |  | ||||||
| if config.sentry_enabled: |  | ||||||
|     apm = sentry_sdk.init( |  | ||||||
|         dsn=config.sentry_dsn, |  | ||||||
|         enable_tracing=True, |  | ||||||
|         environment=config.environment, |  | ||||||
|         release=config.version, |  | ||||||
|         integrations=[StdlibIntegration()], |  | ||||||
|         spotlight=True |  | ||||||
|     ) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def create_bot() -> WebexBot: | def create_bot() -> WebexBot: | ||||||
|     """Create and return a Webex Bot object.""" |     """Create and return a Webex Bot object.""" | ||||||
|     webex_bot: WebexBot = WebexBot( |     webex_bot: WebexBot = WebexBot( | ||||||
|         bot_name=config.bot_name, |         bot_name=config.bot_name, | ||||||
|         teams_bot_token=config.webex_token, |         teams_bot_token=config.webex_token, | ||||||
|         approved_domains=["cisco.com"], |         approved_domains=config.approved_domains, | ||||||
|  |         approved_rooms=config.approved_rooms, | ||||||
|  |         approved_users=config.approved_users, | ||||||
|     ) |     ) | ||||||
|     webex_bot.commands.clear() |     webex_bot.commands.clear() | ||||||
|     webex_bot.add_command(SubmitTaskCommand()) |     webex_bot.add_command(SubmitTaskCommand()) | ||||||
| @@ -43,4 +33,4 @@ if __name__ == "__main__": | |||||||
|         bot.run() |         bot.run() | ||||||
|     except KeyboardInterrupt: |     except KeyboardInterrupt: | ||||||
|         print("Shutting down bot...") |         print("Shutting down bot...") | ||||||
|         exit() |         sys.exit(0) | ||||||
|   | |||||||
| @@ -2,71 +2,73 @@ | |||||||
|  |  | ||||||
| import os | import os | ||||||
|  |  | ||||||
|  | from app.utils.helpers import validate_email_syntax | ||||||
|  |  | ||||||
|  |  | ||||||
| class Config: | class Config: | ||||||
|     """Configuration module.""" |     """Configuration module.""" | ||||||
|  |  | ||||||
|     def __init__(self) -> None: |     def __init__(self) -> None: | ||||||
|         """Configuration module.""" |         """Configuration module.""" | ||||||
|         self.__environment: str = os.environ.get("APP_LIFECYCLE", "DEV").upper() |  | ||||||
|         self.__version: str = os.environ["APP_VERSION"] |  | ||||||
|         self.__bot_name: str = os.environ["BOT_NAME"] |  | ||||||
|         self.__webex_token: str = os.environ["WEBEX_API_KEY"] |  | ||||||
|         self.__admin_first_name: str = os.environ["ADMIN_FIRST_NAME"] |  | ||||||
|         self.__admin_emails: list = os.environ["ADMIN_EMAIL"].split(",") |  | ||||||
|         self.__n8n_webhook_url: str = os.environ["N8N_WEBHOOK_URL"] |  | ||||||
|         self.__sentry_dsn: str = os.environ.get("SENTRY_DSN", "") |  | ||||||
|         self.__sentry_enabled: bool = bool( |  | ||||||
|             os.environ.get("SENTRY_ENABLED", "False").upper() == "TRUE" |  | ||||||
|             and self.__sentry_dsn != "" |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def environment(self) -> str: |     def environment(self) -> str: | ||||||
|         """Returns the current app lifecycle.""" |         """Returns the current app lifecycle.""" | ||||||
|         return self.__environment |         return os.environ.get("APP_LIFECYCLE", "DEV").upper() | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def version(self) -> str: |     def version(self) -> str: | ||||||
|         """Returns the current app version.""" |         """Returns the current app version.""" | ||||||
|         return self.__version |         return os.environ["APP_VERSION"] | ||||||
|  |  | ||||||
|     @property |  | ||||||
|     def sentry_enabled(self) -> bool: |  | ||||||
|         """Returns True if Sentry SDK is enabled, else False.""" |  | ||||||
|         return self.__sentry_enabled |  | ||||||
|  |  | ||||||
|     @property |  | ||||||
|     def sentry_dsn(self) -> str: |  | ||||||
|         """Returns the Sentry DSN value if Sentry SDK is enabled AND |  | ||||||
|         Sentry DSN is set, else blank string.""" |  | ||||||
|         if not self.__sentry_enabled: |  | ||||||
|             return "" |  | ||||||
|         return self.__sentry_dsn |  | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def bot_name(self) -> str: |     def bot_name(self) -> str: | ||||||
|         """Returns the bot name.""" |         """Returns the bot name.""" | ||||||
|         return self.__bot_name |         return os.environ["BOT_NAME"] | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def webex_token(self) -> str: |     def webex_token(self) -> str: | ||||||
|         """Returns the Webex API key.""" |         """Returns the Webex API key.""" | ||||||
|         return self.__webex_token |         return os.environ["WEBEX_API_KEY"] | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def admin_first_name(self) -> str: |     def admin_first_name(self) -> str: | ||||||
|         """Returns the first name of the bot admin.""" |         """Returns the first name of the bot admin.""" | ||||||
|         return self.__admin_first_name |         return os.environ["ADMIN_FIRST_NAME"] | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def admin_emails(self) -> list: |     def admin_emails(self) -> list: | ||||||
|         """Returns a list of admin email addresses.""" |         """Returns a list of admin email addresses.""" | ||||||
|         return self.__admin_emails |         return os.environ["ADMIN_EMAIL"].split(",") | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def n8n_webhook_url(self) -> str: |     def n8n_webhook_url(self) -> str: | ||||||
|         """Returns the n8n webhook URL.""" |         """Returns the n8n webhook URL.""" | ||||||
|         return self.__n8n_webhook_url |         return os.environ["N8N_WEBHOOK_URL"] | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def approved_users(self) -> list: | ||||||
|  |         """Returns a list of approved users.""" | ||||||
|  |         _emails: list[str] = os.environ.get("APPROVED_USERS", "").split(",") | ||||||
|  |         _emails: list[str] = [i.strip() for i in _emails if i] | ||||||
|  |         if not _emails: | ||||||
|  |             return [] | ||||||
|  |         emails = [i for i in _emails if validate_email_syntax(i)] | ||||||
|  |         return emails | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def approved_rooms(self) -> list: | ||||||
|  |         """Returns a list of approved rooms.""" | ||||||
|  |         _rooms: list[str] = os.environ.get("APPROVED_ROOMS", "").split(",") | ||||||
|  |         rooms: list[str] = [i.strip() for i in _rooms if i] | ||||||
|  |         return rooms | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def approved_domains(self) -> list: | ||||||
|  |         """Returns a list of approved domains.""" | ||||||
|  |         _domains: list[str] = os.environ.get("APPROVED_DOMAINS", "").split(",") | ||||||
|  |         domains: list[str] = [i.strip() for i in _domains if i] | ||||||
|  |         return domains | ||||||
|  |  | ||||||
|  |  | ||||||
| config: Config = Config() | config: Config = Config() | ||||||
|   | |||||||
| @@ -1,18 +1,18 @@ | |||||||
| #!/usr/bin/env python3 | """Provides functions for converting timestamps to dates.""" | ||||||
|  |  | ||||||
| from zoneinfo import ZoneInfo |  | ||||||
|  |  | ||||||
| from datetime import datetime | from datetime import datetime | ||||||
|  | from zoneinfo import ZoneInfo | ||||||
|  |  | ||||||
|  |  | ||||||
| def timestamp_to_date(timestamp: int) -> str: | def timestamp_to_date(timestamp: int) -> str: | ||||||
|     """Convert timestamp to date. |     """Convert timestamp to date. | ||||||
|      |  | ||||||
|     Args: |     Args: | ||||||
|         timestamp (int): Timestamp to convert. |         timestamp (int): Timestamp to convert. | ||||||
|      |  | ||||||
|     Returns: |     Returns: | ||||||
|         str: Date in the format YYYY-MM-DD. |         str: Date in the format YYYY-MM-DD. | ||||||
|     """ |     """ | ||||||
|     return datetime.fromtimestamp(timestamp=timestamp, tz=ZoneInfo("UTC")).strftime("%Y-%m-%d") |     return datetime.fromtimestamp(timestamp=timestamp, tz=ZoneInfo("UTC")).strftime( | ||||||
|  |         "%Y-%m-%d" | ||||||
|  |     ) | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								app/utils/helpers.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								app/utils/helpers.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | """Standalone helper functions.""" | ||||||
|  |  | ||||||
|  | import re | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def validate_email_syntax(email: str) -> bool: | ||||||
|  |     """Validate email syntax. | ||||||
|  |  | ||||||
|  |     Args: | ||||||
|  |         email (str): Email address. | ||||||
|  |  | ||||||
|  |     Returns: | ||||||
|  |         bool: True if valid, else False. | ||||||
|  |     """ | ||||||
|  |     pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$" | ||||||
|  |     return re.match(pattern, email) is not None | ||||||
| @@ -1,15 +1,16 @@ | |||||||
|  | """N8N utils module.""" | ||||||
|  |  | ||||||
| import requests | import requests | ||||||
| import sentry_sdk |  | ||||||
|  |  | ||||||
| from app.utils.config import config | from app.utils.config import config | ||||||
|  |  | ||||||
|  |  | ||||||
| def __n8n_post(data: dict) -> bool: | def __n8n_post(data: dict) -> bool: | ||||||
|     """Post data to N8N webhook URL. |     """Post data to N8N webhook URL. | ||||||
|      |  | ||||||
|     Args: |     Args: | ||||||
|         data (dict): Data to post to webhook URL. |         data (dict): Data to post to webhook URL. | ||||||
|      |  | ||||||
|     Returns: |     Returns: | ||||||
|         bool: True if successful, else False. |         bool: True if successful, else False. | ||||||
|     """ |     """ | ||||||
| @@ -19,51 +20,49 @@ def __n8n_post(data: dict) -> bool: | |||||||
|         headers=headers, |         headers=headers, | ||||||
|         json=data, |         json=data, | ||||||
|         timeout=10, |         timeout=10, | ||||||
|         verify=False, |         verify=True, | ||||||
|     ) |     ) | ||||||
|     return bool(resp.status_code == 200) |     return bool(resp.status_code == 200) | ||||||
|  |  | ||||||
|  |  | ||||||
| def submit_task(summary, description, completion_date, requestor) -> bool: | def submit_task(summary, description, completion_date, requestor) -> bool: | ||||||
|     """Submit task to N8N webhook URL. |     """Submit task to N8N webhook URL. | ||||||
|      |  | ||||||
|     Args: |     Args: | ||||||
|         summary (str): Summary of task. |         summary (str): Summary of task. | ||||||
|         description (str): Description of task. |         description (str): Description of task. | ||||||
|         completion_date (str): Completion date of task. |         completion_date (str): Completion date of task. | ||||||
|         requestor (str): Requestor of task. |         requestor (str): Requestor of task. | ||||||
|      |  | ||||||
|     Returns: |     Returns: | ||||||
|         bool: True if successful, else False. |         bool: True if successful, else False. | ||||||
|     """ |     """ | ||||||
|     with sentry_sdk.start_transaction(name="submit_task"): |     data: dict = { | ||||||
|         data: dict = { |         "requestor": requestor, | ||||||
|             "requestor": requestor, |         "title": summary, | ||||||
|             "title": summary, |         "description": description, | ||||||
|             "description": description, |         "completiondate": completion_date, | ||||||
|             "completiondate": completion_date, |     } | ||||||
|         } |     _data = __n8n_post(data=data) | ||||||
|         _data = __n8n_post(data=data) |  | ||||||
|     return _data |     return _data | ||||||
|  |  | ||||||
|  |  | ||||||
| def get_tasks(requestor) -> bool: | def get_tasks(requestor) -> bool: | ||||||
|     """Get tasks from N8N webhook URL. |     """Get tasks from N8N webhook URL. | ||||||
|      |  | ||||||
|     Args: |     Args: | ||||||
|         requestor (str): Requestor of tasks. |         requestor (str): Requestor of tasks. | ||||||
|      |  | ||||||
|     Returns: |     Returns: | ||||||
|         bool: True if successful, else False. |         bool: True if successful, else False. | ||||||
|     """ |     """ | ||||||
|     with sentry_sdk.start_transaction(name="get_tasks"): |     headers: dict = {"Content-Type": "application/json"} | ||||||
|         headers: dict = {"Content-Type": "application/json"} |     resp: requests.Response = requests.get( | ||||||
|         resp: requests.Response = requests.get( |         url=config.n8n_webhook_url, | ||||||
|             url=config.n8n_webhook_url, |         headers=headers, | ||||||
|             headers=headers, |         timeout=10, | ||||||
|             timeout=10, |         verify=True, | ||||||
|             verify=False, |         params={"requestor": requestor}, | ||||||
|             params={"requestor": requestor}, |     ) | ||||||
|         ) |     _data = bool(resp.status_code == 200) | ||||||
|         _data = bool(resp.status_code == 200) |  | ||||||
|     return _data |     return _data | ||||||
|   | |||||||
| @@ -7,4 +7,4 @@ services: | |||||||
|       dockerfile: Dockerfile |       dockerfile: Dockerfile | ||||||
|     restart: unless-stopped |     restart: unless-stopped | ||||||
|     env_file: .env |     env_file: .env | ||||||
| ... | ... | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								pyproject.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								pyproject.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | [project] | ||||||
|  | name = "roboluke-tasks" | ||||||
|  | version = "0.0.0" | ||||||
|  | description = "Add tasks to a Wekan to do list via Webex and n8n." | ||||||
|  | readme = "README.md" | ||||||
|  | authors = [ | ||||||
|  |     {name = "Luke Tainton", email = "luke@tainton.uk"}, | ||||||
|  | ] | ||||||
|  | requires-python = "<4.0,>=3.11" | ||||||
|  | dependencies = [ | ||||||
|  |     "webex-bot<1.1.0,>=1.0.3", | ||||||
|  |     "datetime<6.0,>=5.5", | ||||||
|  |     "requests<3.0.0,>=2.32.3", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [tool.uv] | ||||||
|  | dev-dependencies = [ | ||||||
|  |     "black<25.2.0,>=25.1.0", | ||||||
|  |     "coverage<8.0.0,>=7.6.10", | ||||||
|  |     "isort<6.1.0,>=6.0.0", | ||||||
|  |     "pylint<4.0.0,>=3.3.3", | ||||||
|  |     "pylint-exit<2.0.0,>=1.2.0", | ||||||
|  |     "pytest<9.0.0,>=8.3.4", | ||||||
|  |     "zipp<4.0.0,>=3.21.0", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [tool.pdm.build] | ||||||
|  | includes = [] | ||||||
|  | [build-system] | ||||||
|  | requires = ["pdm-backend"] | ||||||
|  | build-backend = "pdm.backend" | ||||||
							
								
								
									
										20
									
								
								renovate.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								renovate.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | { | ||||||
|  |   "assignAutomerge": false, | ||||||
|  |   "assigneesFromCodeOwners": false, | ||||||
|  |   "dependencyDashboardAutoclose": true, | ||||||
|  |   "extends": ["config:recommended"], | ||||||
|  |   "ignorePaths": ["**/.archive/**"], | ||||||
|  |   "labels": ["type/dependencies"], | ||||||
|  |   "platformCommit": "enabled", | ||||||
|  |   "rebaseWhen": "behind-base-branch", | ||||||
|  |   "rollbackPrs": true, | ||||||
|  |   "vulnerabilityAlerts": { | ||||||
|  |     "commitMessagePrefix": "[SECURITY] ", | ||||||
|  |     "enabled": true, | ||||||
|  |     "labels": ["security"], | ||||||
|  |     "prCreation": "immediate" | ||||||
|  |   }, | ||||||
|  |   "lockFileMaintenance": { | ||||||
|  |     "enabled": true | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -1,8 +1,6 @@ | |||||||
| sonar.organization=luketainton | sonar.projectKey=roboluke | ||||||
| sonar.projectKey=luketainton_roboluke-tasks | sonar.projectName=roboluke | ||||||
| sonar.projectName=roboluke-tasks | sonar.python.version=3.13 | ||||||
| sonar.projectVersion=1.0 |  | ||||||
| sonar.python.version=3.11 |  | ||||||
| sonar.python.coverage.reportPaths=coverage.xml | sonar.python.coverage.reportPaths=coverage.xml | ||||||
| sonar.python.pylint.reportPaths=lintreport.txt | sonar.python.pylint.reportPaths=lintreport.txt | ||||||
| sonar.python.xunit.reportPath=testresults.xml | sonar.python.xunit.reportPath=testresults.xml | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								test.sh
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								test.sh
									
									
									
									
									
								
							| @@ -1,3 +1,3 @@ | |||||||
| export $(cat .env | xargs) | export $(cat .env.test | xargs) | ||||||
| python -B -m app.main | python -B -m app.main | ||||||
| unset APP_LIFECYCLE SENTRY_ENABLED SENTRY_DSN BOT_NAME WEBEX_API_KEY ADMIN_FIRST_NAME ADMIN_EMAIL N8N_WEBHOOK_URL | unset ADMIN_EMAIL ADMIN_FIRST_NAME APP_LIFECYCLE APP_VERSION APPROVED_DOMAINS APPROVED_ROOMS APPROVED_USERS BOT_NAME N8N_WEBHOOK_URL WEBEX_API_KEY | ||||||
|   | |||||||
| @@ -1,32 +0,0 @@ | |||||||
| #!/usr/bin/env python3 |  | ||||||
|  |  | ||||||
| """Provides test cases for app/utils/config.py.""" |  | ||||||
|  |  | ||||||
| import os |  | ||||||
|  |  | ||||||
|  |  | ||||||
| vars: dict = { |  | ||||||
|     "APP_VERSION": "dev", |  | ||||||
|     "BOT_NAME": "TestBot", |  | ||||||
|     "WEBEX_API_KEY": "testing", |  | ||||||
|     "ADMIN_FIRST_NAME": "Test", |  | ||||||
|     "ADMIN_EMAIL": "test@test.com", |  | ||||||
|     "N8N_WEBHOOK_URL": "https://n8n.test.com/webhook/abcdefg", |  | ||||||
|     "SENTRY_ENABLED": "false", |  | ||||||
|     "SENTRY_DSN": "http://localhost" |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| for var, value in vars.items(): |  | ||||||
|     os.environ[var] = value |  | ||||||
|  |  | ||||||
| # needs to be imported AFTER environment variables are set |  | ||||||
| from app.utils.config import config  # pragma: no cover |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_config() -> None: |  | ||||||
|     assert config.bot_name == vars["BOT_NAME"] |  | ||||||
|     assert config.webex_token == vars["WEBEX_API_KEY"] |  | ||||||
|     assert config.admin_first_name == vars["ADMIN_FIRST_NAME"] |  | ||||||
|     assert config.admin_emails == vars["ADMIN_EMAIL"].split(",") |  | ||||||
|     assert config.n8n_webhook_url == vars["N8N_WEBHOOK_URL"] |  | ||||||
							
								
								
									
										42
									
								
								tests/test_config_1.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								tests/test_config_1.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  |  | ||||||
|  | # ruff: noqa: E402 pylint: disable=wrong-import-position | ||||||
|  |  | ||||||
|  | """Provides test cases for app/utils/config.py.""" | ||||||
|  |  | ||||||
|  | import os | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_config() -> None: | ||||||
|  |     """Test config module.""" | ||||||
|  |  | ||||||
|  |     config_vars: dict = { | ||||||
|  |         "APP_VERSION": "dev", | ||||||
|  |         "BOT_NAME": "TestBot", | ||||||
|  |         "WEBEX_API_KEY": "testing", | ||||||
|  |         "ADMIN_FIRST_NAME": "Test", | ||||||
|  |         "ADMIN_EMAIL": "test@test.com", | ||||||
|  |         "N8N_WEBHOOK_URL": "https://n8n.test.com/webhook/abcdefg", | ||||||
|  |         "APPROVED_USERS": "test@test.com", | ||||||
|  |         "APPROVED_DOMAINS": "test.com", | ||||||
|  |         "APPROVED_ROOMS": "test", | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for config_var, value in config_vars.items(): | ||||||
|  |         os.environ[config_var] = value | ||||||
|  |  | ||||||
|  |     # needs to be imported AFTER environment variables are set | ||||||
|  |     from app.utils.config import config  # pragma: no cover | ||||||
|  |  | ||||||
|  |     assert config.admin_emails == config_vars["ADMIN_EMAIL"].split(",") | ||||||
|  |     assert config.admin_first_name == config_vars["ADMIN_FIRST_NAME"] | ||||||
|  |     assert config.approved_domains == config_vars["APPROVED_DOMAINS"].split(",") | ||||||
|  |     assert config.approved_rooms == config_vars["APPROVED_ROOMS"].split(",") | ||||||
|  |     assert config.approved_users == config_vars["APPROVED_USERS"].split(",") | ||||||
|  |     assert config.bot_name == config_vars["BOT_NAME"] | ||||||
|  |     assert config.n8n_webhook_url == config_vars["N8N_WEBHOOK_URL"] | ||||||
|  |     assert config.version == config_vars["APP_VERSION"] | ||||||
|  |     assert config.webex_token == config_vars["WEBEX_API_KEY"] | ||||||
|  |  | ||||||
|  |     for config_var in config_vars: | ||||||
|  |         os.environ.pop(config_var, None) | ||||||
							
								
								
									
										39
									
								
								tests/test_config_2.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								tests/test_config_2.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  |  | ||||||
|  | # ruff: noqa: E402 pylint: disable=wrong-import-position | ||||||
|  |  | ||||||
|  | """Provides test cases for app/utils/config.py.""" | ||||||
|  |  | ||||||
|  | import os | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_config_no_admin_vars() -> None: | ||||||
|  |     """Test config module.""" | ||||||
|  |  | ||||||
|  |     config_vars: dict = { | ||||||
|  |         "APP_VERSION": "dev", | ||||||
|  |         "BOT_NAME": "TestBot", | ||||||
|  |         "WEBEX_API_KEY": "testing", | ||||||
|  |         "ADMIN_FIRST_NAME": "Test", | ||||||
|  |         "ADMIN_EMAIL": "test@test.com", | ||||||
|  |         "N8N_WEBHOOK_URL": "https://n8n.test.com/webhook/abcdefg", | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for config_var, value in config_vars.items(): | ||||||
|  |         os.environ[config_var] = value | ||||||
|  |  | ||||||
|  |     # needs to be imported AFTER environment variables are set | ||||||
|  |     from app.utils.config import config  # pragma: no cover | ||||||
|  |  | ||||||
|  |     assert config.approved_domains == [] | ||||||
|  |     assert config.approved_rooms == [] | ||||||
|  |     assert config.approved_users == [] | ||||||
|  |     assert config.admin_emails == config_vars["ADMIN_EMAIL"].split(",") | ||||||
|  |     assert config.admin_first_name == config_vars["ADMIN_FIRST_NAME"] | ||||||
|  |     assert config.bot_name == config_vars["BOT_NAME"] | ||||||
|  |     assert config.n8n_webhook_url == config_vars["N8N_WEBHOOK_URL"] | ||||||
|  |     assert config.version == config_vars["APP_VERSION"] | ||||||
|  |     assert config.webex_token == config_vars["WEBEX_API_KEY"] | ||||||
|  |  | ||||||
|  |     for config_var in config_vars: | ||||||
|  |         os.environ.pop(config_var, None) | ||||||
| @@ -8,12 +8,14 @@ from app.utils.datetime import timestamp_to_date  # pragma: no cover | |||||||
|  |  | ||||||
|  |  | ||||||
| def test_correct() -> None: | def test_correct() -> None: | ||||||
|  |     """Test timestamp_to_date() with a correct timestamp.""" | ||||||
|     timestamp: int = 1680722218 |     timestamp: int = 1680722218 | ||||||
|     result: str = timestamp_to_date(timestamp) |     result: str = timestamp_to_date(timestamp) | ||||||
|     assert result == "2023-04-05" |     assert result == "2023-04-05" | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_invalid() -> None: | def test_invalid() -> None: | ||||||
|  |     """Test timestamp_to_date() with an invalid timestamp.""" | ||||||
|     timestamp: str = "hello" |     timestamp: str = "hello" | ||||||
|     with pytest.raises(TypeError) as excinfo: |     with pytest.raises(TypeError) as excinfo: | ||||||
|         timestamp_to_date(timestamp) |         timestamp_to_date(timestamp) | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								tests/test_helpers.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								tests/test_helpers.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  |  | ||||||
|  | """Provides test cases for app/utils/helpers.py.""" | ||||||
|  |  | ||||||
|  | from app.utils.helpers import validate_email_syntax  # pragma: no cover | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_validate_email_syntax_true() -> None: | ||||||
|  |     """Test validate_email_syntax() with a real email address.""" | ||||||
|  |     email: str = "test@test.com" | ||||||
|  |     assert validate_email_syntax(email) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_validate_email_syntax_false1() -> None: | ||||||
|  |     """Test validate_email_syntax() with an invalid email address.""" | ||||||
|  |     email: str = "test@test" | ||||||
|  |     assert not validate_email_syntax(email) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_validate_email_syntax_false2() -> None: | ||||||
|  |     """Test validate_email_syntax() with an invalid email address.""" | ||||||
|  |     email: str = "test" | ||||||
|  |     assert not validate_email_syntax(email) | ||||||
							
								
								
									
										561
									
								
								uv.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										561
									
								
								uv.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,561 @@ | |||||||
|  | version = 1 | ||||||
|  | revision = 2 | ||||||
|  | requires-python = ">=3.11, <4.0" | ||||||
|  | resolution-markers = [ | ||||||
|  |     "python_full_version >= '3.12'", | ||||||
|  |     "python_full_version < '3.12'", | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "astroid" | ||||||
|  | version = "3.3.10" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/00/c2/9b2de9ed027f9fe5734a6c0c0a601289d796b3caaf1e372e23fa88a73047/astroid-3.3.10.tar.gz", hash = "sha256:c332157953060c6deb9caa57303ae0d20b0fbdb2e59b4a4f2a6ba49d0a7961ce", size = 398941, upload-time = "2025-05-10T13:33:10.405Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/15/58/5260205b9968c20b6457ed82f48f9e3d6edf2f1f95103161798b73aeccf0/astroid-3.3.10-py3-none-any.whl", hash = "sha256:104fb9cb9b27ea95e847a94c003be03a9e039334a8ebca5ee27dafaf5c5711eb", size = 275388, upload-time = "2025-05-10T13:33:08.391Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "backoff" | ||||||
|  | version = "2.2.1" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001, upload-time = "2022-10-05T19:19:32.061Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148, upload-time = "2022-10-05T19:19:30.546Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "black" | ||||||
|  | version = "25.1.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "click" }, | ||||||
|  |     { name = "mypy-extensions" }, | ||||||
|  |     { name = "packaging" }, | ||||||
|  |     { name = "pathspec" }, | ||||||
|  |     { name = "platformdirs" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449, upload-time = "2025-01-29T04:15:40.373Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/7e/4f/87f596aca05c3ce5b94b8663dbfe242a12843caaa82dd3f85f1ffdc3f177/black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", size = 1614372, upload-time = "2025-01-29T05:37:11.71Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/e7/d0/2c34c36190b741c59c901e56ab7f6e54dad8df05a6272a9747ecef7c6036/black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", size = 1442865, upload-time = "2025-01-29T05:37:14.309Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/21/d4/7518c72262468430ead45cf22bd86c883a6448b9eb43672765d69a8f1248/black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", size = 1749699, upload-time = "2025-01-29T04:18:17.688Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/58/db/4f5beb989b547f79096e035c4981ceb36ac2b552d0ac5f2620e941501c99/black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", size = 1428028, upload-time = "2025-01-29T04:18:51.711Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988, upload-time = "2025-01-29T05:37:16.707Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985, upload-time = "2025-01-29T05:37:18.273Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816, upload-time = "2025-01-29T04:18:33.823Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860, upload-time = "2025-01-29T04:19:12.944Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673, upload-time = "2025-01-29T05:37:20.574Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190, upload-time = "2025-01-29T05:37:22.106Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926, upload-time = "2025-01-29T04:18:58.564Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613, upload-time = "2025-01-29T04:19:27.63Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646, upload-time = "2025-01-29T04:15:38.082Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "certifi" | ||||||
|  | version = "2025.4.26" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload-time = "2025-04-26T02:12:29.51Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload-time = "2025-04-26T02:12:27.662Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "charset-normalizer" | ||||||
|  | version = "3.4.2" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload-time = "2025-05-02T08:32:11.945Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload-time = "2025-05-02T08:32:13.946Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload-time = "2025-05-02T08:32:15.873Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload-time = "2025-05-02T08:32:17.283Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload-time = "2025-05-02T08:32:18.807Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload-time = "2025-05-02T08:32:20.333Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload-time = "2025-05-02T08:32:21.86Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload-time = "2025-05-02T08:32:23.434Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload-time = "2025-05-02T08:32:24.993Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload-time = "2025-05-02T08:32:26.435Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "click" | ||||||
|  | version = "8.2.1" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "colorama", marker = "sys_platform == 'win32'" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "colorama" | ||||||
|  | version = "0.4.6" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "coloredlogs" | ||||||
|  | version = "15.0.1" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "humanfriendly" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520, upload-time = "2021-06-11T10:22:45.202Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934", size = 46018, upload-time = "2021-06-11T10:22:42.561Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "coverage" | ||||||
|  | version = "7.8.2" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/ba/07/998afa4a0ecdf9b1981ae05415dad2d4e7716e1b1f00abbd91691ac09ac9/coverage-7.8.2.tar.gz", hash = "sha256:a886d531373a1f6ff9fad2a2ba4a045b68467b779ae729ee0b3b10ac20033b27", size = 812759, upload-time = "2025-05-23T11:39:57.856Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/6a/4d/1ff618ee9f134d0de5cc1661582c21a65e06823f41caf801aadf18811a8e/coverage-7.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b99058eef42e6a8dcd135afb068b3d53aff3921ce699e127602efff9956457a9", size = 211692, upload-time = "2025-05-23T11:38:08.485Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/96/fa/c3c1b476de96f2bc7a8ca01a9f1fcb51c01c6b60a9d2c3e66194b2bdb4af/coverage-7.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5feb7f2c3e6ea94d3b877def0270dff0947b8d8c04cfa34a17be0a4dc1836879", size = 212115, upload-time = "2025-05-23T11:38:09.989Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/f7/c2/5414c5a1b286c0f3881ae5adb49be1854ac5b7e99011501f81c8c1453065/coverage-7.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:670a13249b957bb9050fab12d86acef7bf8f6a879b9d1a883799276e0d4c674a", size = 244740, upload-time = "2025-05-23T11:38:11.947Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/cd/46/1ae01912dfb06a642ef3dd9cf38ed4996fda8fe884dab8952da616f81a2b/coverage-7.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bdc8bf760459a4a4187b452213e04d039990211f98644c7292adf1e471162b5", size = 242429, upload-time = "2025-05-23T11:38:13.955Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/06/58/38c676aec594bfe2a87c7683942e5a30224791d8df99bcc8439fde140377/coverage-7.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07a989c867986c2a75f158f03fdb413128aad29aca9d4dbce5fc755672d96f11", size = 244218, upload-time = "2025-05-23T11:38:15.631Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/80/0c/95b1023e881ce45006d9abc250f76c6cdab7134a1c182d9713878dfefcb2/coverage-7.8.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2db10dedeb619a771ef0e2949ccba7b75e33905de959c2643a4607bef2f3fb3a", size = 243865, upload-time = "2025-05-23T11:38:17.622Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/57/37/0ae95989285a39e0839c959fe854a3ae46c06610439350d1ab860bf020ac/coverage-7.8.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e6ea7dba4e92926b7b5f0990634b78ea02f208d04af520c73a7c876d5a8d36cb", size = 242038, upload-time = "2025-05-23T11:38:19.966Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/4d/82/40e55f7c0eb5e97cc62cbd9d0746fd24e8caf57be5a408b87529416e0c70/coverage-7.8.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ef2f22795a7aca99fc3c84393a55a53dd18ab8c93fb431004e4d8f0774150f54", size = 242567, upload-time = "2025-05-23T11:38:21.912Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/f9/35/66a51adc273433a253989f0d9cc7aa6bcdb4855382cf0858200afe578861/coverage-7.8.2-cp311-cp311-win32.whl", hash = "sha256:641988828bc18a6368fe72355df5f1703e44411adbe49bba5644b941ce6f2e3a", size = 214194, upload-time = "2025-05-23T11:38:23.571Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/f6/8f/a543121f9f5f150eae092b08428cb4e6b6d2d134152c3357b77659d2a605/coverage-7.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8ab4a51cb39dc1933ba627e0875046d150e88478dbe22ce145a68393e9652975", size = 215109, upload-time = "2025-05-23T11:38:25.137Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/77/65/6cc84b68d4f35186463cd7ab1da1169e9abb59870c0f6a57ea6aba95f861/coverage-7.8.2-cp311-cp311-win_arm64.whl", hash = "sha256:8966a821e2083c74d88cca5b7dcccc0a3a888a596a04c0b9668a891de3a0cc53", size = 213521, upload-time = "2025-05-23T11:38:27.123Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/8d/2a/1da1ada2e3044fcd4a3254fb3576e160b8fe5b36d705c8a31f793423f763/coverage-7.8.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2f6fe3654468d061942591aef56686131335b7a8325684eda85dacdf311356c", size = 211876, upload-time = "2025-05-23T11:38:29.01Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/70/e9/3d715ffd5b6b17a8be80cd14a8917a002530a99943cc1939ad5bb2aa74b9/coverage-7.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76090fab50610798cc05241bf83b603477c40ee87acd358b66196ab0ca44ffa1", size = 212130, upload-time = "2025-05-23T11:38:30.675Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a0/02/fdce62bb3c21649abfd91fbdcf041fb99be0d728ff00f3f9d54d97ed683e/coverage-7.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd0a0a5054be160777a7920b731a0570284db5142abaaf81bcbb282b8d99279", size = 246176, upload-time = "2025-05-23T11:38:32.395Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a7/52/decbbed61e03b6ffe85cd0fea360a5e04a5a98a7423f292aae62423b8557/coverage-7.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da23ce9a3d356d0affe9c7036030b5c8f14556bd970c9b224f9c8205505e3b99", size = 243068, upload-time = "2025-05-23T11:38:33.989Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/38/6c/d0e9c0cce18faef79a52778219a3c6ee8e336437da8eddd4ab3dbd8fadff/coverage-7.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9392773cffeb8d7e042a7b15b82a414011e9d2b5fdbbd3f7e6a6b17d5e21b20", size = 245328, upload-time = "2025-05-23T11:38:35.568Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/f0/70/f703b553a2f6b6c70568c7e398ed0789d47f953d67fbba36a327714a7bca/coverage-7.8.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:876cbfd0b09ce09d81585d266c07a32657beb3eaec896f39484b631555be0fe2", size = 245099, upload-time = "2025-05-23T11:38:37.627Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/ec/fb/4cbb370dedae78460c3aacbdad9d249e853f3bc4ce5ff0e02b1983d03044/coverage-7.8.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3da9b771c98977a13fbc3830f6caa85cae6c9c83911d24cb2d218e9394259c57", size = 243314, upload-time = "2025-05-23T11:38:39.238Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/39/9f/1afbb2cb9c8699b8bc38afdce00a3b4644904e6a38c7bf9005386c9305ec/coverage-7.8.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a990f6510b3292686713bfef26d0049cd63b9c7bb17e0864f133cbfd2e6167f", size = 244489, upload-time = "2025-05-23T11:38:40.845Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/79/fa/f3e7ec7d220bff14aba7a4786ae47043770cbdceeea1803083059c878837/coverage-7.8.2-cp312-cp312-win32.whl", hash = "sha256:bf8111cddd0f2b54d34e96613e7fbdd59a673f0cf5574b61134ae75b6f5a33b8", size = 214366, upload-time = "2025-05-23T11:38:43.551Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/54/aa/9cbeade19b7e8e853e7ffc261df885d66bf3a782c71cba06c17df271f9e6/coverage-7.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:86a323a275e9e44cdf228af9b71c5030861d4d2610886ab920d9945672a81223", size = 215165, upload-time = "2025-05-23T11:38:45.148Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/c4/73/e2528bf1237d2448f882bbebaec5c3500ef07301816c5c63464b9da4d88a/coverage-7.8.2-cp312-cp312-win_arm64.whl", hash = "sha256:820157de3a589e992689ffcda8639fbabb313b323d26388d02e154164c57b07f", size = 213548, upload-time = "2025-05-23T11:38:46.74Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/1a/93/eb6400a745ad3b265bac36e8077fdffcf0268bdbbb6c02b7220b624c9b31/coverage-7.8.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ea561010914ec1c26ab4188aef8b1567272ef6de096312716f90e5baa79ef8ca", size = 211898, upload-time = "2025-05-23T11:38:49.066Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/1b/7c/bdbf113f92683024406a1cd226a199e4200a2001fc85d6a6e7e299e60253/coverage-7.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cb86337a4fcdd0e598ff2caeb513ac604d2f3da6d53df2c8e368e07ee38e277d", size = 212171, upload-time = "2025-05-23T11:38:51.207Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/91/22/594513f9541a6b88eb0dba4d5da7d71596dadef6b17a12dc2c0e859818a9/coverage-7.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a4636ddb666971345541b59899e969f3b301143dd86b0ddbb570bd591f1e85", size = 245564, upload-time = "2025-05-23T11:38:52.857Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/1f/f4/2860fd6abeebd9f2efcfe0fd376226938f22afc80c1943f363cd3c28421f/coverage-7.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5040536cf9b13fb033f76bcb5e1e5cb3b57c4807fef37db9e0ed129c6a094257", size = 242719, upload-time = "2025-05-23T11:38:54.529Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/89/60/f5f50f61b6332451520e6cdc2401700c48310c64bc2dd34027a47d6ab4ca/coverage-7.8.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc67994df9bcd7e0150a47ef41278b9e0a0ea187caba72414b71dc590b99a108", size = 244634, upload-time = "2025-05-23T11:38:57.326Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/3b/70/7f4e919039ab7d944276c446b603eea84da29ebcf20984fb1fdf6e602028/coverage-7.8.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e6c86888fd076d9e0fe848af0a2142bf606044dc5ceee0aa9eddb56e26895a0", size = 244824, upload-time = "2025-05-23T11:38:59.421Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/26/45/36297a4c0cea4de2b2c442fe32f60c3991056c59cdc3cdd5346fbb995c97/coverage-7.8.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:684ca9f58119b8e26bef860db33524ae0365601492e86ba0b71d513f525e7050", size = 242872, upload-time = "2025-05-23T11:39:01.049Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a4/71/e041f1b9420f7b786b1367fa2a375703889ef376e0d48de9f5723fb35f11/coverage-7.8.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8165584ddedb49204c4e18da083913bdf6a982bfb558632a79bdaadcdafd0d48", size = 244179, upload-time = "2025-05-23T11:39:02.709Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/bd/db/3c2bf49bdc9de76acf2491fc03130c4ffc51469ce2f6889d2640eb563d77/coverage-7.8.2-cp313-cp313-win32.whl", hash = "sha256:34759ee2c65362163699cc917bdb2a54114dd06d19bab860725f94ef45a3d9b7", size = 214393, upload-time = "2025-05-23T11:39:05.457Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/c6/dc/947e75d47ebbb4b02d8babb1fad4ad381410d5bc9da7cfca80b7565ef401/coverage-7.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:2f9bc608fbafaee40eb60a9a53dbfb90f53cc66d3d32c2849dc27cf5638a21e3", size = 215194, upload-time = "2025-05-23T11:39:07.171Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/90/31/a980f7df8a37eaf0dc60f932507fda9656b3a03f0abf188474a0ea188d6d/coverage-7.8.2-cp313-cp313-win_arm64.whl", hash = "sha256:9fe449ee461a3b0c7105690419d0b0aba1232f4ff6d120a9e241e58a556733f7", size = 213580, upload-time = "2025-05-23T11:39:08.862Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/8a/6a/25a37dd90f6c95f59355629417ebcb74e1c34e38bb1eddf6ca9b38b0fc53/coverage-7.8.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8369a7c8ef66bded2b6484053749ff220dbf83cba84f3398c84c51a6f748a008", size = 212734, upload-time = "2025-05-23T11:39:11.109Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/36/8b/3a728b3118988725f40950931abb09cd7f43b3c740f4640a59f1db60e372/coverage-7.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:159b81df53a5fcbc7d45dae3adad554fdbde9829a994e15227b3f9d816d00b36", size = 212959, upload-time = "2025-05-23T11:39:12.751Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/53/3c/212d94e6add3a3c3f412d664aee452045ca17a066def8b9421673e9482c4/coverage-7.8.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6fcbbd35a96192d042c691c9e0c49ef54bd7ed865846a3c9d624c30bb67ce46", size = 257024, upload-time = "2025-05-23T11:39:15.569Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a4/40/afc03f0883b1e51bbe804707aae62e29c4e8c8bbc365c75e3e4ddeee9ead/coverage-7.8.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05364b9cc82f138cc86128dc4e2e1251c2981a2218bfcd556fe6b0fbaa3501be", size = 252867, upload-time = "2025-05-23T11:39:17.64Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/18/a2/3699190e927b9439c6ded4998941a3c1d6fa99e14cb28d8536729537e307/coverage-7.8.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46d532db4e5ff3979ce47d18e2fe8ecad283eeb7367726da0e5ef88e4fe64740", size = 255096, upload-time = "2025-05-23T11:39:19.328Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/b4/06/16e3598b9466456b718eb3e789457d1a5b8bfb22e23b6e8bbc307df5daf0/coverage-7.8.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4000a31c34932e7e4fa0381a3d6deb43dc0c8f458e3e7ea6502e6238e10be625", size = 256276, upload-time = "2025-05-23T11:39:21.077Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a7/d5/4b5a120d5d0223050a53d2783c049c311eea1709fa9de12d1c358e18b707/coverage-7.8.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:43ff5033d657cd51f83015c3b7a443287250dc14e69910577c3e03bd2e06f27b", size = 254478, upload-time = "2025-05-23T11:39:22.838Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/ba/85/f9ecdb910ecdb282b121bfcaa32fa8ee8cbd7699f83330ee13ff9bbf1a85/coverage-7.8.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94316e13f0981cbbba132c1f9f365cac1d26716aaac130866ca812006f662199", size = 255255, upload-time = "2025-05-23T11:39:24.644Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/50/63/2d624ac7d7ccd4ebbd3c6a9eba9d7fc4491a1226071360d59dd84928ccb2/coverage-7.8.2-cp313-cp313t-win32.whl", hash = "sha256:3f5673888d3676d0a745c3d0e16da338c5eea300cb1f4ada9c872981265e76d8", size = 215109, upload-time = "2025-05-23T11:39:26.722Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/22/5e/7053b71462e970e869111c1853afd642212568a350eba796deefdfbd0770/coverage-7.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:2c08b05ee8d7861e45dc5a2cc4195c8c66dca5ac613144eb6ebeaff2d502e73d", size = 216268, upload-time = "2025-05-23T11:39:28.429Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/07/69/afa41aa34147655543dbe96994f8a246daf94b361ccf5edfd5df62ce066a/coverage-7.8.2-cp313-cp313t-win_arm64.whl", hash = "sha256:1e1448bb72b387755e1ff3ef1268a06617afd94188164960dba8d0245a46004b", size = 214071, upload-time = "2025-05-23T11:39:30.55Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/69/2f/572b29496d8234e4a7773200dd835a0d32d9e171f2d974f3fe04a9dbc271/coverage-7.8.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:ec455eedf3ba0bbdf8f5a570012617eb305c63cb9f03428d39bf544cb2b94837", size = 203636, upload-time = "2025-05-23T11:39:52.002Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a0/1a/0b9c32220ad694d66062f571cc5cedfa9997b64a591e8a500bb63de1bd40/coverage-7.8.2-py3-none-any.whl", hash = "sha256:726f32ee3713f7359696331a18daf0c3b3a70bb0ae71141b9d3c52be7c595e32", size = 203623, upload-time = "2025-05-23T11:39:53.846Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "datetime" | ||||||
|  | version = "5.5" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "pytz" }, | ||||||
|  |     { name = "zope-interface" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/2f/66/e284b9978fede35185e5d18fb3ae855b8f573d8c90a56de5f6d03e8ef99e/DateTime-5.5.tar.gz", hash = "sha256:21ec6331f87a7fcb57bd7c59e8a68bfffe6fcbf5acdbbc7b356d6a9a020191d3", size = 63671, upload-time = "2024-03-21T07:26:50.211Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/f3/78/8e382b8cb4346119e2e04270b6eb4a01c5ee70b47a8a0244ecdb157204f7/DateTime-5.5-py3-none-any.whl", hash = "sha256:0abf6c51cb4ba7cee775ca46ccc727f3afdde463be28dbbe8803631fefd4a120", size = 52649, upload-time = "2024-03-21T07:26:47.849Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "dill" | ||||||
|  | version = "0.4.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976, upload-time = "2025-04-16T00:41:48.867Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668, upload-time = "2025-04-16T00:41:47.671Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "humanfriendly" | ||||||
|  | version = "10.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "pyreadline3", marker = "sys_platform == 'win32'" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702, upload-time = "2021-09-17T21:40:43.31Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", size = 86794, upload-time = "2021-09-17T21:40:39.897Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "idna" | ||||||
|  | version = "3.10" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "iniconfig" | ||||||
|  | version = "2.1.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "isort" | ||||||
|  | version = "6.0.1" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/b8/21/1e2a441f74a653a144224d7d21afe8f4169e6c7c20bb13aec3a2dc3815e0/isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", size = 821955, upload-time = "2025-02-26T21:13:16.955Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/c1/11/114d0a5f4dabbdcedc1125dee0888514c3c3b16d3e9facad87ed96fad97c/isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615", size = 94186, upload-time = "2025-02-26T21:13:14.911Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "mccabe" | ||||||
|  | version = "0.7.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658, upload-time = "2022-01-24T01:14:51.113Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "mypy-extensions" | ||||||
|  | version = "1.1.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "packaging" | ||||||
|  | version = "25.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pathspec" | ||||||
|  | version = "0.12.1" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "platformdirs" | ||||||
|  | version = "4.3.8" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pluggy" | ||||||
|  | version = "1.6.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pyjwt" | ||||||
|  | version = "2.10.1" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pylint" | ||||||
|  | version = "3.3.7" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "astroid" }, | ||||||
|  |     { name = "colorama", marker = "sys_platform == 'win32'" }, | ||||||
|  |     { name = "dill" }, | ||||||
|  |     { name = "isort" }, | ||||||
|  |     { name = "mccabe" }, | ||||||
|  |     { name = "platformdirs" }, | ||||||
|  |     { name = "tomlkit" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/1c/e4/83e487d3ddd64ab27749b66137b26dc0c5b5c161be680e6beffdc99070b3/pylint-3.3.7.tar.gz", hash = "sha256:2b11de8bde49f9c5059452e0c310c079c746a0a8eeaa789e5aa966ecc23e4559", size = 1520709, upload-time = "2025-05-04T17:07:51.089Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/e8/83/bff755d09e31b5d25cc7fdc4bf3915d1a404e181f1abf0359af376845c24/pylint-3.3.7-py3-none-any.whl", hash = "sha256:43860aafefce92fca4cf6b61fe199cdc5ae54ea28f9bf4cd49de267b5195803d", size = 522565, upload-time = "2025-05-04T17:07:48.714Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pylint-exit" | ||||||
|  | version = "1.2.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/26/fb/4365157ab89cd442cca4714595466394d5ee328709ca1804a5c85be7ae32/pylint-exit-1.2.0.zip", hash = "sha256:b6ad02884c01c5560a5275079fe5a6c792afff90ecccf0c02513e1547ee280b0", size = 11093, upload-time = "2020-07-15T22:18:01.006Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/94/ed/5d45bbd42d5407250dd46ce1b9c098d612c3a9bb538858d09da2df77c961/pylint_exit-1.2.0-py2.py3-none-any.whl", hash = "sha256:65c9e7856e9058705a92d7c45628d604b2a4b8ee2b3c18a7303be77f9ed87cbe", size = 6340, upload-time = "2020-07-15T22:18:00.11Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pyreadline3" | ||||||
|  | version = "3.5.4" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/0f/49/4cea918a08f02817aabae639e3d0ac046fef9f9180518a3ad394e22da148/pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7", size = 99839, upload-time = "2024-09-19T02:40:10.062Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178, upload-time = "2024-09-19T02:40:08.598Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pytest" | ||||||
|  | version = "8.3.5" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "colorama", marker = "sys_platform == 'win32'" }, | ||||||
|  |     { name = "iniconfig" }, | ||||||
|  |     { name = "packaging" }, | ||||||
|  |     { name = "pluggy" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "pytz" | ||||||
|  | version = "2025.2" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "requests" | ||||||
|  | version = "2.32.3" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "certifi" }, | ||||||
|  |     { name = "charset-normalizer" }, | ||||||
|  |     { name = "idna" }, | ||||||
|  |     { name = "urllib3" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "requests-toolbelt" | ||||||
|  | version = "1.0.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "requests" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "roboluke-tasks" | ||||||
|  | version = "0.0.0" | ||||||
|  | source = { editable = "." } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "datetime" }, | ||||||
|  |     { name = "requests" }, | ||||||
|  |     { name = "webex-bot" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.dev-dependencies] | ||||||
|  | dev = [ | ||||||
|  |     { name = "black" }, | ||||||
|  |     { name = "coverage" }, | ||||||
|  |     { name = "isort" }, | ||||||
|  |     { name = "pylint" }, | ||||||
|  |     { name = "pylint-exit" }, | ||||||
|  |     { name = "pytest" }, | ||||||
|  |     { name = "zipp" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.metadata] | ||||||
|  | requires-dist = [ | ||||||
|  |     { name = "datetime", specifier = ">=5.5,<6.0" }, | ||||||
|  |     { name = "requests", specifier = ">=2.32.3,<3.0.0" }, | ||||||
|  |     { name = "webex-bot", specifier = ">=0.5.2,<1.0.0" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [package.metadata.requires-dev] | ||||||
|  | dev = [ | ||||||
|  |     { name = "black", specifier = ">=25.1.0,<25.2.0" }, | ||||||
|  |     { name = "coverage", specifier = ">=7.6.10,<8.0.0" }, | ||||||
|  |     { name = "isort", specifier = ">=6.0.0,<6.1.0" }, | ||||||
|  |     { name = "pylint", specifier = ">=3.3.3,<4.0.0" }, | ||||||
|  |     { name = "pylint-exit", specifier = ">=1.2.0,<2.0.0" }, | ||||||
|  |     { name = "pytest", specifier = ">=8.3.4,<9.0.0" }, | ||||||
|  |     { name = "zipp", specifier = ">=3.21.0,<4.0.0" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "setuptools" | ||||||
|  | version = "80.9.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "tomlkit" | ||||||
|  | version = "0.13.2" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885, upload-time = "2024-08-14T08:19:41.488Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955, upload-time = "2024-08-14T08:19:40.05Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "urllib3" | ||||||
|  | version = "2.4.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672, upload-time = "2025-04-10T15:23:39.232Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680, upload-time = "2025-04-10T15:23:37.377Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "webex-bot" | ||||||
|  | version = "0.6.2" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "backoff" }, | ||||||
|  |     { name = "coloredlogs" }, | ||||||
|  |     { name = "webexpythonsdk" }, | ||||||
|  |     { name = "websockets" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/8c/44/9c19b6cdabc1fff00a6f01a0b5d9e04c178dc4ab6a2d8a24491918c336ee/webex_bot-0.6.2.tar.gz", hash = "sha256:93146eacfad0678322062e39f101a1ed9d6e3a1b0d69afee341d429d775e6542", size = 29677, upload-time = "2025-05-23T10:25:37.379Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/60/16/9cdd96229121cac4bd359db90f15ba34902f5557d0903d555335d517aa30/webex_bot-0.6.2-py2.py3-none-any.whl", hash = "sha256:b2813b3a349513876116c17362b75f609a69907cf137c6839cbb36b43a76474e", size = 22081, upload-time = "2025-05-23T10:25:35.582Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "webexpythonsdk" | ||||||
|  | version = "2.0.4" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "pyjwt" }, | ||||||
|  |     { name = "requests" }, | ||||||
|  |     { name = "requests-toolbelt" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/84/11/1e4e50b36228c6f40d943adc3a46b94f20864a91784e51624ad12880abba/webexpythonsdk-2.0.4.tar.gz", hash = "sha256:8103193460bb9da51b7873654f4591fc265a336751b49f372fb3b584c440c538", size = 66886, upload-time = "2025-01-22T17:12:48.576Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/0f/a2/56c2848eb73965b70472e156650031f84ad8bc7a442b3c0c7a4846c04514/webexpythonsdk-2.0.4-py3-none-any.whl", hash = "sha256:ee8845dc79fc9b296a9e0080d1dffd9565a0116ca82b97796225057a7d22e285", size = 149107, upload-time = "2025-01-22T17:12:45.279Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "websockets" | ||||||
|  | version = "11.0.3" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/d8/3b/2ed38e52eed4cf277f9df5f0463a99199a04d9e29c9e227cfafa57bd3993/websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016", size = 104235, upload-time = "2023-05-07T14:25:20.083Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/16/49/ae616bd221efba84a3d78737b417f704af1ffa36f40dcaba5eb954dd4753/websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb", size = 123748, upload-time = "2023-05-07T14:23:37.977Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/0a/84/68b848a373493b58615d6c10e9e8ccbaadfd540f84905421739a807704f8/websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288", size = 120975, upload-time = "2023-05-07T14:23:40.339Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/8c/a8/e81533499f84ef6cdd95d11d5b05fa827c0f097925afd86f16e6a2631d8e/websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d", size = 121017, upload-time = "2023-05-07T14:23:41.874Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/6b/ca/65d6986665888494eca4d5435a9741c822022996f0f4200c57ce4b9242f7/websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3", size = 131200, upload-time = "2023-05-07T14:23:43.309Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/c0/a8/a8a582ebeeecc8b5f332997d44c57e241748f8a9856e06a38a5a13b30796/websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b", size = 130195, upload-time = "2023-05-07T14:23:45.337Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a9/5e/b25c60067d700e811dccb4e3c318eeadd3a19d8b3620de9f97434af777a7/websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6", size = 130569, upload-time = "2023-05-07T14:23:46.926Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/14/fc/5cbbf439c925e1e184a0392ec477a30cee2fabc0e63807c1d4b6d570fb52/websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97", size = 136015, upload-time = "2023-05-07T14:23:48.43Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/0f/d8/a997d3546aef9cc995a1126f7d7ade96c0e16c1a0efb9d2d430aee57c925/websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf", size = 135292, upload-time = "2023-05-07T14:23:50.744Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/89/8f/707a05d5725f956c78d252a5fd73b89fa3ac57dd3959381c2d1acb41cb13/websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd", size = 135890, upload-time = "2023-05-07T14:23:52.707Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/b5/94/ac47552208583d5dbcce468430c1eb2ae18962f6b3a694a2b7727cc60d4a/websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c", size = 124149, upload-time = "2023-05-07T14:23:53.848Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/e1/7c/0ad6e7ef0a054d73092f616d20d3d9bd3e1b837554cb20a52d8dd9f5b049/websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8", size = 124670, upload-time = "2023-05-07T14:23:55.812Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/47/96/9d5749106ff57629b54360664ae7eb9afd8302fad1680ead385383e33746/websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6", size = 118056, upload-time = "2023-05-07T14:25:18.508Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "zipp" | ||||||
|  | version = "3.22.0" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/12/b6/7b3d16792fdf94f146bed92be90b4eb4563569eca91513c8609aebf0c167/zipp-3.22.0.tar.gz", hash = "sha256:dd2f28c3ce4bc67507bfd3781d21b7bb2be31103b51a4553ad7d90b84e57ace5", size = 25257, upload-time = "2025-05-26T14:46:32.217Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/ad/da/f64669af4cae46f17b90798a827519ce3737d31dbafad65d391e49643dc4/zipp-3.22.0-py3-none-any.whl", hash = "sha256:fe208f65f2aca48b81f9e6fd8cf7b8b32c26375266b009b413d45306b6148343", size = 9796, upload-time = "2025-05-26T14:46:30.775Z" }, | ||||||
|  | ] | ||||||
|  |  | ||||||
|  | [[package]] | ||||||
|  | name = "zope-interface" | ||||||
|  | version = "7.2" | ||||||
|  | source = { registry = "https://pypi.org/simple" } | ||||||
|  | dependencies = [ | ||||||
|  |     { name = "setuptools" }, | ||||||
|  | ] | ||||||
|  | sdist = { url = "https://files.pythonhosted.org/packages/30/93/9210e7606be57a2dfc6277ac97dcc864fd8d39f142ca194fdc186d596fda/zope.interface-7.2.tar.gz", hash = "sha256:8b49f1a3d1ee4cdaf5b32d2e738362c7f5e40ac8b46dd7d1a65e82a4872728fe", size = 252960, upload-time = "2024-11-28T08:45:39.224Z" } | ||||||
|  | wheels = [ | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/98/7d/2e8daf0abea7798d16a58f2f3a2bf7588872eee54ac119f99393fdd47b65/zope.interface-7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1909f52a00c8c3dcab6c4fad5d13de2285a4b3c7be063b239b8dc15ddfb73bd2", size = 208776, upload-time = "2024-11-28T08:47:53.009Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a0/2a/0c03c7170fe61d0d371e4c7ea5b62b8cb79b095b3d630ca16719bf8b7b18/zope.interface-7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:80ecf2451596f19fd607bb09953f426588fc1e79e93f5968ecf3367550396b22", size = 209296, upload-time = "2024-11-28T08:47:57.993Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/49/b4/451f19448772b4a1159519033a5f72672221e623b0a1bd2b896b653943d8/zope.interface-7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:033b3923b63474800b04cba480b70f6e6243a62208071fc148354f3f89cc01b7", size = 260997, upload-time = "2024-11-28T09:18:13.935Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/65/94/5aa4461c10718062c8f8711161faf3249d6d3679c24a0b81dd6fc8ba1dd3/zope.interface-7.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a102424e28c6b47c67923a1f337ede4a4c2bba3965b01cf707978a801fc7442c", size = 255038, upload-time = "2024-11-28T08:48:26.381Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/9f/aa/1a28c02815fe1ca282b54f6705b9ddba20328fabdc37b8cf73fc06b172f0/zope.interface-7.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25e6a61dcb184453bb00eafa733169ab6d903e46f5c2ace4ad275386f9ab327a", size = 259806, upload-time = "2024-11-28T08:48:30.78Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a7/2c/82028f121d27c7e68632347fe04f4a6e0466e77bb36e104c8b074f3d7d7b/zope.interface-7.2-cp311-cp311-win_amd64.whl", hash = "sha256:3f6771d1647b1fc543d37640b45c06b34832a943c80d1db214a37c31161a93f1", size = 212305, upload-time = "2024-11-28T08:49:14.525Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/68/0b/c7516bc3bad144c2496f355e35bd699443b82e9437aa02d9867653203b4a/zope.interface-7.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:086ee2f51eaef1e4a52bd7d3111a0404081dadae87f84c0ad4ce2649d4f708b7", size = 208959, upload-time = "2024-11-28T08:47:47.788Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/a2/e9/1463036df1f78ff8c45a02642a7bf6931ae4a38a4acd6a8e07c128e387a7/zope.interface-7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:21328fcc9d5b80768bf051faa35ab98fb979080c18e6f84ab3f27ce703bce465", size = 209357, upload-time = "2024-11-28T08:47:50.897Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/07/a8/106ca4c2add440728e382f1b16c7d886563602487bdd90004788d45eb310/zope.interface-7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6dd02ec01f4468da0f234da9d9c8545c5412fef80bc590cc51d8dd084138a89", size = 264235, upload-time = "2024-11-28T09:18:15.56Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/fc/ca/57286866285f4b8a4634c12ca1957c24bdac06eae28fd4a3a578e30cf906/zope.interface-7.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e7da17f53e25d1a3bde5da4601e026adc9e8071f9f6f936d0fe3fe84ace6d54", size = 259253, upload-time = "2024-11-28T08:48:29.025Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/96/08/2103587ebc989b455cf05e858e7fbdfeedfc3373358320e9c513428290b1/zope.interface-7.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cab15ff4832580aa440dc9790b8a6128abd0b88b7ee4dd56abacbc52f212209d", size = 264702, upload-time = "2024-11-28T08:48:37.363Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/5f/c7/3c67562e03b3752ba4ab6b23355f15a58ac2d023a6ef763caaca430f91f2/zope.interface-7.2-cp312-cp312-win_amd64.whl", hash = "sha256:29caad142a2355ce7cfea48725aa8bcf0067e2b5cc63fcf5cd9f97ad12d6afb5", size = 212466, upload-time = "2024-11-28T08:49:14.397Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/c6/3b/e309d731712c1a1866d61b5356a069dd44e5b01e394b6cb49848fa2efbff/zope.interface-7.2-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:3e0350b51e88658d5ad126c6a57502b19d5f559f6cb0a628e3dc90442b53dd98", size = 208961, upload-time = "2024-11-28T08:48:29.865Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/49/65/78e7cebca6be07c8fc4032bfbb123e500d60efdf7b86727bb8a071992108/zope.interface-7.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15398c000c094b8855d7d74f4fdc9e73aa02d4d0d5c775acdef98cdb1119768d", size = 209356, upload-time = "2024-11-28T08:48:33.297Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/11/b1/627384b745310d082d29e3695db5f5a9188186676912c14b61a78bbc6afe/zope.interface-7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:802176a9f99bd8cc276dcd3b8512808716492f6f557c11196d42e26c01a69a4c", size = 264196, upload-time = "2024-11-28T09:18:17.584Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/b8/f6/54548df6dc73e30ac6c8a7ff1da73ac9007ba38f866397091d5a82237bd3/zope.interface-7.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb23f58a446a7f09db85eda09521a498e109f137b85fb278edb2e34841055398", size = 259237, upload-time = "2024-11-28T08:48:31.71Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/b6/66/ac05b741c2129fdf668b85631d2268421c5cd1a9ff99be1674371139d665/zope.interface-7.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a71a5b541078d0ebe373a81a3b7e71432c61d12e660f1d67896ca62d9628045b", size = 264696, upload-time = "2024-11-28T08:48:41.161Z" }, | ||||||
|  |     { url = "https://files.pythonhosted.org/packages/0a/2f/1bccc6f4cc882662162a1158cda1a7f616add2ffe322b28c99cb031b4ffc/zope.interface-7.2-cp313-cp313-win_amd64.whl", hash = "sha256:4893395d5dd2ba655c38ceb13014fd65667740f09fa5bb01caa1e6284e48c0cd", size = 212472, upload-time = "2024-11-28T08:49:56.587Z" }, | ||||||
|  | ] | ||||||
		Reference in New Issue
	
	Block a user