From f7f349bec2c4285267ec1729d33bdd07e899042f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Sep 2026 13:30:14 +0000 Subject: [PATCH 1/3] Bump ruff from 0.15.20 to 0.16.5 in /stats-api Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.20 to 0.16.5. - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.15.20...0.16.5) --- updated-dependencies: - dependency-name: ruff dependency-version: 0.16.5 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- stats-api/pyproject.toml | 2 +- stats-api/uv.lock | 44 ++++++++++++++++++++-------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/stats-api/pyproject.toml b/stats-api/pyproject.toml index f081005c..fb9bf842 100644 --- a/stats-api/pyproject.toml +++ b/stats-api/pyproject.toml @@ -19,7 +19,7 @@ dependencies = [ [dependency-groups] dev = [ "pytest>=8.4.2,<9", - "ruff>=0.15.20,<0.16", + "ruff>=0.15.20,<0.17", "ty>=0.0.56", ] diff --git a/stats-api/uv.lock b/stats-api/uv.lock index 537955ae..ab6caa94 100644 --- a/stats-api/uv.lock +++ b/stats-api/uv.lock @@ -376,27 +376,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.20" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/dc/35b341fc554ba02f217fc10da57d1a75168cfbcf75b0ef2202176d4c4f2d/ruff-0.15.20.tar.gz", hash = "sha256:1416eb04349192646b54de98f146c4f59afe37d0decfc02c3cbbf396f3a28566", size = 4755489, upload-time = "2026-06-25T17:20:37.578Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/94/d9/2d5014f0253ba541d2061d9fa7193f48e941c8b21bb88a7ff9bbe0bd0596/ruff-0.15.20-py3-none-linux_armv6l.whl", hash = "sha256:00e188c53e499c3c1637f73c91dcf2fb56d576cab76ce1be50a27c4e80e37078", size = 10839665, upload-time = "2026-06-25T17:19:44.702Z" }, - { url = "https://files.pythonhosted.org/packages/c6/d3/ac1798ba64f670698867fcfc591d50e7e421bef137db564858f619a30fcf/ruff-0.15.20-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9ebd1fd9b9c95fc0bd7b2761aebec1f030013d2e193a2901b224af68fe47251b", size = 11208649, upload-time = "2026-06-25T17:19:48.787Z" }, - { url = "https://files.pythonhosted.org/packages/47/47/d3ac899991202095dfcf3d5176be4272642be3cf981a2f1a30f72a2afb95/ruff-0.15.20-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c5b16cdd67ca108185cd36dce98c576350c03b1660a751de725fb049193a0632", size = 10622638, upload-time = "2026-06-25T17:19:51.354Z" }, - { url = "https://files.pythonhosted.org/packages/33/13/4e043fe30aa94d4ff5213a9881fc296d12960f5971b234a5263fdc225312/ruff-0.15.20-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3413bb3c3d2ca6a8208f1f4809cd2dca3c6de6d0b491c0e70847672bde6e6efd", size = 10984227, upload-time = "2026-06-25T17:19:54.044Z" }, - { url = "https://files.pythonhosted.org/packages/76/e6/92e7bf40388bc5800073b96564f56264f7e48bfd1a498f5ced6ae6d5a769/ruff-0.15.20-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd7ec42b3bb3da066488db093308a69c4ac5ee6d2af333a86ba6e2eb2e7dd44b", size = 10622882, upload-time = "2026-06-25T17:19:57.037Z" }, - { url = "https://files.pythonhosted.org/packages/13/7a/43460be3f24495a3aa46d4b16873e2c4941b3b5f0b00cf88c03b7b94b339/ruff-0.15.20-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1a36ad0eb77fba9aabfb69ede54de6f376d04ac18ebea022847046d340a8267", size = 11474808, upload-time = "2026-06-25T17:20:00.357Z" }, - { url = "https://files.pythonhosted.org/packages/27/a0/f37077884873221c6b33b4ab49eb18f9f88e54a16a25a5bca59bef46dd66/ruff-0.15.20-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6df3b1e4610432f0386dba04d853b5f08cbbc903410c6fcc02f620f05aff53c", size = 12293094, upload-time = "2026-06-25T17:20:03.446Z" }, - { url = "https://files.pythonhosted.org/packages/a6/74/165545b60256a9704c21ac0ec4a0d07933b320812f9584836c9f4aca4292/ruff-0.15.20-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e89f198a1ea6ef0d727c1cf16088bc91a6cb0ab947dedc966715691647186eae", size = 11526176, upload-time = "2026-06-25T17:20:06.301Z" }, - { url = "https://files.pythonhosted.org/packages/86/b1/a976a136d40ade83ce743578399865f57001003a409acadc0ecbb3051082/ruff-0.15.20-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309809086c2acb67624950a3c8133e80f32d0d3e27106c0cd60ff26657c9f24b", size = 11520767, upload-time = "2026-06-25T17:20:09.191Z" }, - { url = "https://files.pythonhosted.org/packages/19/0f/f032696cb01c9b54c0263fa393474d7758f1cdc021a01b04e3cbc2500999/ruff-0.15.20-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2d2374caa2f2c2f9e2b7da0a50802cfb8b79f55a9b5e49379f564544fbf56487", size = 11500132, upload-time = "2026-06-25T17:20:13.602Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f4/51b1a14bc69e8c224b15dab9cce8e99b425e0455d462caa2b3c9be2b6a8e/ruff-0.15.20-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a1ed17b65293e0c2f22fc387bc13198a5de94bf4429589b0ff6946b0feaf21a3", size = 10943828, upload-time = "2026-06-25T17:20:16.635Z" }, - { url = "https://files.pythonhosted.org/packages/71/4b/fe267640783cd02bf6c5cc290b1df1051be2ec294c678b5c15fe19e52343/ruff-0.15.20-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f701305e66b38ea6c91882490eb73459796808e4c6362a1b765255e0cdcd4053", size = 10645418, upload-time = "2026-06-25T17:20:19.4Z" }, - { url = "https://files.pythonhosted.org/packages/b0/c0/a65aa4ec2f5e87a1df32dc3ec1fede434fe3dfd5cbcf3b503cafc676ab54/ruff-0.15.20-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b9c0c367ad8e5d0d5b5b8537864c469a0a0e55417aadfbeca41fa61333be9f4", size = 11211770, upload-time = "2026-06-25T17:20:22.033Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a4/0caa331d954ae2723d729d351c989cb4ca8b6077d5c6c2cb6de75e98c041/ruff-0.15.20-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:01cc00dd58f0df339d0e902219dd53990ea99996a0344e5d9cc8d45d5307e460", size = 11618698, upload-time = "2026-06-25T17:20:25.259Z" }, - { url = "https://files.pythonhosted.org/packages/10/9b/5f14927848d2fd4aa891fd88d883788c5a7baba561c7874732364045708c/ruff-0.15.20-py3-none-win32.whl", hash = "sha256:ed65ef510e43a137207e0f01cfcf998aeddb1aeeda5c9d35023e910284d7cf21", size = 10857322, upload-time = "2026-06-25T17:20:28.612Z" }, - { url = "https://files.pythonhosted.org/packages/fa/f0/fe47c501f9dea92a26d788ff98bb5d92ed4cb4c88792c5c88af6b697dc8e/ruff-0.15.20-py3-none-win_amd64.whl", hash = "sha256:a525c81c70fb0380344dd1d8745d8cc1c890b7fc94a58d5a07bd8eb9557b8415", size = 11993274, upload-time = "2026-06-25T17:20:31.871Z" }, - { url = "https://files.pythonhosted.org/packages/d7/2b/9555445e1201d92b3195f45cdb153a0b68f24e0a4273f6e3d5ab46e212bb/ruff-0.15.20-py3-none-win_arm64.whl", hash = "sha256:2f5b2a6d614e8700388806a14996c40fab2c47b819ef57d790a34878858ed9ca", size = 11343498, upload-time = "2026-06-25T17:20:35.03Z" }, +version = "0.16.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/85/c8e12473c93018f92d19dd988a294202e1c27426c47ec4de53ffb847b8d8/ruff-0.16.5.tar.gz", hash = "sha256:1b88500f9ffbcab3dedb0082c9f9492e91ec3d618aac1236a3e0189938f7040b", size = 4912003, upload-time = "2026-08-27T16:34:18.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/b6/77c90a970fe2dae17a723acbd011043ea97c98d7deacccefdc4ba74ec512/ruff-0.16.5-py3-none-linux_armv6l.whl", hash = "sha256:12e5f673e774c35fbb62f288809c7653b73445f8ecec6b6063fd6ea3521aa14b", size = 10011941, upload-time = "2026-08-27T16:33:41.287Z" }, + { url = "https://files.pythonhosted.org/packages/4b/46/6cf67cf6411885a1d6f7f6d801682f155536a85176d10b605e2ceffed8bd/ruff-0.16.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:eda58a5802de40e7ed5b32b64e0b32539338cc6fcd2c78f61e3ad6a0d79f51c3", size = 10204049, upload-time = "2026-08-27T16:33:44.056Z" }, + { url = "https://files.pythonhosted.org/packages/46/fd/c8720ca7a090abf0c2fef4abe8a5ef6e5127ed15196d8886ff75a2b370e2/ruff-0.16.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c5ae9a7b9a8875131f40f8fe967cc86abf899779efd663cb7ce3d572d01da7eb", size = 9809037, upload-time = "2026-08-27T16:33:46.257Z" }, + { url = "https://files.pythonhosted.org/packages/43/45/a684caacdedaca180f52bacccc40bf0789d2c5a7c75f25324853e9eaedb5/ruff-0.16.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b719b0a1f4d59710d283ab2965f621684a108a9e41da622e3b23f0326cd0025", size = 9964129, upload-time = "2026-08-27T16:33:48.352Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/5d2bcdaca6b5b93d1b4dfc166cd2aebf7680143a1b38a28759df13a94d31/ruff-0.16.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2298f2780ed1be0c5cb1361e32ab7b1467f3cce7dabe101d2210a314f2fe42e9", size = 9821518, upload-time = "2026-08-27T16:33:50.57Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ff/011cce29accf9257d5974145b733fc653a37985ed6825413a3987cefbfe0/ruff-0.16.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:258f29035a2dd021e7861e631b227a5b3f14e50c1184c9a6a122c5f4576154d7", size = 10534835, upload-time = "2026-08-27T16:33:52.522Z" }, + { url = "https://files.pythonhosted.org/packages/d7/5a/f0cf109bada9bba0e96c90c21c9f9251803f57225c32d293327a03c710d6/ruff-0.16.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9a4f0432966834019c74d1b7e5c51224305d7713f3d7faf3e7451f1a3be3cde", size = 11252550, upload-time = "2026-08-27T16:33:54.521Z" }, + { url = "https://files.pythonhosted.org/packages/63/4d/1d481aaea2046c6a7ed7c291f9004c669cce3c087b6b376ed5b08271e3fe/ruff-0.16.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5eb3a8c3d0ade9cea42b591fd530368e8798380e30e0a308b85a5cf718f09ea", size = 10777949, upload-time = "2026-08-27T16:33:56.88Z" }, + { url = "https://files.pythonhosted.org/packages/ee/34/ee245ca55f64443233034b3d02b03236b19242004281247c079390b7facd/ruff-0.16.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef0f69e191a13a3c9816f63163c88790cb12cd157bbbb384e9c44745702ab105", size = 10311656, upload-time = "2026-08-27T16:33:59.12Z" }, + { url = "https://files.pythonhosted.org/packages/a7/4d/c33a333e341c0a2b96c715b52d89a606f5a34cd4ac493cd9b8d0187186b8/ruff-0.16.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:0eeab41fbea2c42f98dfb9822cdccda9d24ba38d49f6dc945b5c236d48f0ef29", size = 10532125, upload-time = "2026-08-27T16:34:01.166Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/a64cef78b40192497bb98a27a8aa8f2c98ee9ee15bc97f7712d94ef32937/ruff-0.16.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f0768e9df4300713fff30733c87575f68b6f1d8de41184e505b7fdd9c0c95eaf", size = 10097648, upload-time = "2026-08-27T16:34:03.16Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4e/4cdc9ed3c3e109d2f71e62572a37457298d7bc7501ec3138babb7ed32bbd/ruff-0.16.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:95cc70cdc7aa80c338de356279d2adbeb2de0f520b9ecd8aba75b94e95e02f91", size = 9829344, upload-time = "2026-08-27T16:34:05.134Z" }, + { url = "https://files.pythonhosted.org/packages/39/4a/31ed35ce31729955fc583ee0d176d6e784c1290cb0b0a75cb2134c1ab72a/ruff-0.16.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d185c8398ded1bfd91c0c2cb258346307571eccc473a8490af8c3977399c384a", size = 10277117, upload-time = "2026-08-27T16:34:07.425Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a0/60356d86687b4b666d593df213f4dc3041750d024cb7bf2cfa81cfd65c2e/ruff-0.16.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:fb8e3a3c4c6a784150a7ced53b015f4b253fc2bf97a610886419ead64b4756ef", size = 10711653, upload-time = "2026-08-27T16:34:09.712Z" }, + { url = "https://files.pythonhosted.org/packages/ed/20/656d67f5b25ca9bda4e02b1de25867b2954e1d19e03648060f167ad0f4cc/ruff-0.16.5-py3-none-win32.whl", hash = "sha256:288b0a5f080492fe5635db849f9e2e84aa3cce7b7f0e955997d416c507c76a26", size = 10034250, upload-time = "2026-08-27T16:34:11.8Z" }, + { url = "https://files.pythonhosted.org/packages/5b/42/ee8e68a207b9127fcde6c3d7e197def432f346cb1af159e1fa14ca0d1cdc/ruff-0.16.5-py3-none-win_amd64.whl", hash = "sha256:ddc6385fb2137f616357ca03d6c74f4be987f80fed4008566b754f6032b8546f", size = 10516714, upload-time = "2026-08-27T16:34:13.963Z" }, + { url = "https://files.pythonhosted.org/packages/73/e3/7df5a396e445b9ba49ce9a9437439a4d80042c61c0ade199abf8d16de1ac/ruff-0.16.5-py3-none-win_arm64.whl", hash = "sha256:a64abe90968719b851bb7cedffaa8753fbdbdadab483089682db623f3edc587e", size = 10391564, upload-time = "2026-08-27T16:34:16.064Z" }, ] [[package]] @@ -475,7 +475,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ { name = "pytest", specifier = ">=8.4.2,<9" }, - { name = "ruff", specifier = ">=0.15.20,<0.16" }, + { name = "ruff", specifier = ">=0.15.20,<0.17" }, { name = "ty", specifier = ">=0.0.56" }, ] From 2b1098c89b4d4451ee6621f1f460fa17a772f368 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Sep 2026 13:57:06 +0000 Subject: [PATCH 2/3] Bump ruff from 0.15.20 to 0.16.8 in /stats-api Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.20 to 0.16.8. - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.15.20...0.16.8) --- updated-dependencies: - dependency-name: ruff dependency-version: 0.16.5 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- stats-api/pyproject.toml | 2 +- stats-api/uv.lock | 44 ++++++++++++++++++++-------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/stats-api/pyproject.toml b/stats-api/pyproject.toml index f081005c..fb9bf842 100644 --- a/stats-api/pyproject.toml +++ b/stats-api/pyproject.toml @@ -19,7 +19,7 @@ dependencies = [ [dependency-groups] dev = [ "pytest>=8.4.2,<9", - "ruff>=0.15.20,<0.16", + "ruff>=0.15.20,<0.17", "ty>=0.0.56", ] diff --git a/stats-api/uv.lock b/stats-api/uv.lock index d957a89a..eab74523 100644 --- a/stats-api/uv.lock +++ b/stats-api/uv.lock @@ -376,27 +376,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.20" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/dc/35b341fc554ba02f217fc10da57d1a75168cfbcf75b0ef2202176d4c4f2d/ruff-0.15.20.tar.gz", hash = "sha256:1416eb04349192646b54de98f146c4f59afe37d0decfc02c3cbbf396f3a28566", size = 4755489, upload-time = "2026-06-25T17:20:37.578Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/94/d9/2d5014f0253ba541d2061d9fa7193f48e941c8b21bb88a7ff9bbe0bd0596/ruff-0.15.20-py3-none-linux_armv6l.whl", hash = "sha256:00e188c53e499c3c1637f73c91dcf2fb56d576cab76ce1be50a27c4e80e37078", size = 10839665, upload-time = "2026-06-25T17:19:44.702Z" }, - { url = "https://files.pythonhosted.org/packages/c6/d3/ac1798ba64f670698867fcfc591d50e7e421bef137db564858f619a30fcf/ruff-0.15.20-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9ebd1fd9b9c95fc0bd7b2761aebec1f030013d2e193a2901b224af68fe47251b", size = 11208649, upload-time = "2026-06-25T17:19:48.787Z" }, - { url = "https://files.pythonhosted.org/packages/47/47/d3ac899991202095dfcf3d5176be4272642be3cf981a2f1a30f72a2afb95/ruff-0.15.20-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c5b16cdd67ca108185cd36dce98c576350c03b1660a751de725fb049193a0632", size = 10622638, upload-time = "2026-06-25T17:19:51.354Z" }, - { url = "https://files.pythonhosted.org/packages/33/13/4e043fe30aa94d4ff5213a9881fc296d12960f5971b234a5263fdc225312/ruff-0.15.20-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3413bb3c3d2ca6a8208f1f4809cd2dca3c6de6d0b491c0e70847672bde6e6efd", size = 10984227, upload-time = "2026-06-25T17:19:54.044Z" }, - { url = "https://files.pythonhosted.org/packages/76/e6/92e7bf40388bc5800073b96564f56264f7e48bfd1a498f5ced6ae6d5a769/ruff-0.15.20-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd7ec42b3bb3da066488db093308a69c4ac5ee6d2af333a86ba6e2eb2e7dd44b", size = 10622882, upload-time = "2026-06-25T17:19:57.037Z" }, - { url = "https://files.pythonhosted.org/packages/13/7a/43460be3f24495a3aa46d4b16873e2c4941b3b5f0b00cf88c03b7b94b339/ruff-0.15.20-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1a36ad0eb77fba9aabfb69ede54de6f376d04ac18ebea022847046d340a8267", size = 11474808, upload-time = "2026-06-25T17:20:00.357Z" }, - { url = "https://files.pythonhosted.org/packages/27/a0/f37077884873221c6b33b4ab49eb18f9f88e54a16a25a5bca59bef46dd66/ruff-0.15.20-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6df3b1e4610432f0386dba04d853b5f08cbbc903410c6fcc02f620f05aff53c", size = 12293094, upload-time = "2026-06-25T17:20:03.446Z" }, - { url = "https://files.pythonhosted.org/packages/a6/74/165545b60256a9704c21ac0ec4a0d07933b320812f9584836c9f4aca4292/ruff-0.15.20-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e89f198a1ea6ef0d727c1cf16088bc91a6cb0ab947dedc966715691647186eae", size = 11526176, upload-time = "2026-06-25T17:20:06.301Z" }, - { url = "https://files.pythonhosted.org/packages/86/b1/a976a136d40ade83ce743578399865f57001003a409acadc0ecbb3051082/ruff-0.15.20-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309809086c2acb67624950a3c8133e80f32d0d3e27106c0cd60ff26657c9f24b", size = 11520767, upload-time = "2026-06-25T17:20:09.191Z" }, - { url = "https://files.pythonhosted.org/packages/19/0f/f032696cb01c9b54c0263fa393474d7758f1cdc021a01b04e3cbc2500999/ruff-0.15.20-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2d2374caa2f2c2f9e2b7da0a50802cfb8b79f55a9b5e49379f564544fbf56487", size = 11500132, upload-time = "2026-06-25T17:20:13.602Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f4/51b1a14bc69e8c224b15dab9cce8e99b425e0455d462caa2b3c9be2b6a8e/ruff-0.15.20-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a1ed17b65293e0c2f22fc387bc13198a5de94bf4429589b0ff6946b0feaf21a3", size = 10943828, upload-time = "2026-06-25T17:20:16.635Z" }, - { url = "https://files.pythonhosted.org/packages/71/4b/fe267640783cd02bf6c5cc290b1df1051be2ec294c678b5c15fe19e52343/ruff-0.15.20-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f701305e66b38ea6c91882490eb73459796808e4c6362a1b765255e0cdcd4053", size = 10645418, upload-time = "2026-06-25T17:20:19.4Z" }, - { url = "https://files.pythonhosted.org/packages/b0/c0/a65aa4ec2f5e87a1df32dc3ec1fede434fe3dfd5cbcf3b503cafc676ab54/ruff-0.15.20-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b9c0c367ad8e5d0d5b5b8537864c469a0a0e55417aadfbeca41fa61333be9f4", size = 11211770, upload-time = "2026-06-25T17:20:22.033Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a4/0caa331d954ae2723d729d351c989cb4ca8b6077d5c6c2cb6de75e98c041/ruff-0.15.20-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:01cc00dd58f0df339d0e902219dd53990ea99996a0344e5d9cc8d45d5307e460", size = 11618698, upload-time = "2026-06-25T17:20:25.259Z" }, - { url = "https://files.pythonhosted.org/packages/10/9b/5f14927848d2fd4aa891fd88d883788c5a7baba561c7874732364045708c/ruff-0.15.20-py3-none-win32.whl", hash = "sha256:ed65ef510e43a137207e0f01cfcf998aeddb1aeeda5c9d35023e910284d7cf21", size = 10857322, upload-time = "2026-06-25T17:20:28.612Z" }, - { url = "https://files.pythonhosted.org/packages/fa/f0/fe47c501f9dea92a26d788ff98bb5d92ed4cb4c88792c5c88af6b697dc8e/ruff-0.15.20-py3-none-win_amd64.whl", hash = "sha256:a525c81c70fb0380344dd1d8745d8cc1c890b7fc94a58d5a07bd8eb9557b8415", size = 11993274, upload-time = "2026-06-25T17:20:31.871Z" }, - { url = "https://files.pythonhosted.org/packages/d7/2b/9555445e1201d92b3195f45cdb153a0b68f24e0a4273f6e3d5ab46e212bb/ruff-0.15.20-py3-none-win_arm64.whl", hash = "sha256:2f5b2a6d614e8700388806a14996c40fab2c47b819ef57d790a34878858ed9ca", size = 11343498, upload-time = "2026-06-25T17:20:35.03Z" }, +version = "0.16.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/78/449cb84790bd5cc3823b2652ee405a4558856e5c4195aee3a16bf7b3eb5d/ruff-0.16.8.tar.gz", hash = "sha256:9247bf92b5f04d825c8639a4fe423ec2e4222acd9222e58412b0dab7e442798b", size = 4938814, upload-time = "2026-09-16T15:54:46.688Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/25/6071aabc530e9be7e2c195e8fe3f7aea2735405b6cf447212832d7811831/ruff-0.16.8-py3-none-linux_armv6l.whl", hash = "sha256:6ffbd6d87383c1edf5f6fa890f10200950240d7c1a16052a19a09d3a2307dd38", size = 10048966, upload-time = "2026-09-16T15:53:57.605Z" }, + { url = "https://files.pythonhosted.org/packages/54/98/07f90ecbc74dd5fb5764f11f2bc774d6a7cffef92d2ff5f5b4e9e23c754e/ruff-0.16.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:42ed6b878ed61e3acca92f2730a17acff39286944ea82398544696366a6f925e", size = 10165498, upload-time = "2026-09-16T15:54:01.14Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1f/e6a712e3b47cad4a40600134105ed193cb773f618a42eb7ba323cb812cc0/ruff-0.16.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7ea781c7f2afba8c6a505ea0fb3f994020249e0c450635f5381286fea6b46170", size = 9830004, upload-time = "2026-09-16T15:54:03.998Z" }, + { url = "https://files.pythonhosted.org/packages/23/f2/311a08776d75d81c7676e20b6b020ae63cbe881fcdc7a8dd64e6e18bdd93/ruff-0.16.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8efeae3bbe414a5efefda11a792dfb51ef90ac48d50c4830de2f644caf3e8659", size = 9986558, upload-time = "2026-09-16T15:54:06.804Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ed/37b6cb3d3ba8c73e68ae3eb1d502383beb5aa05a582bb7bb3a922f929f54/ruff-0.16.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a79b795469fef7fc6e908b218eed2eb17332afd85031db6480dc864560e69b2", size = 9877332, upload-time = "2026-09-16T15:54:09.552Z" }, + { url = "https://files.pythonhosted.org/packages/22/cc/40873a8f36ad084cc540d55fcca7077264d5b13b24659e9180c176fb2b08/ruff-0.16.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fdc5563cdc50555e6fba39322850860e9267c1b3d12c26a74729d8604c3c812", size = 10507125, upload-time = "2026-09-16T15:54:12.152Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e4/fc91a642b78ccbab6b9477720f3644ae7a10a9bcce69a934679cd64f62bc/ruff-0.16.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34508983c70665578dab88f5223d8e6228307e1135398ca8bfc8b7e9501e282b", size = 11336694, upload-time = "2026-09-16T15:54:15.489Z" }, + { url = "https://files.pythonhosted.org/packages/c2/3d/bbd2a9a600a4e73dc3e7548a249c8d1671273464b55822c6fae50f602dff/ruff-0.16.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:644bb578569e0ffc575741232bd385dacdd6fbe123f1a729e7a225f54aa3957f", size = 10774448, upload-time = "2026-09-16T15:54:18.16Z" }, + { url = "https://files.pythonhosted.org/packages/1a/41/d83af9879a7b6e8bf5fe16b1da0b134049d2f5d3afac12defb0897cb84bd/ruff-0.16.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15e7d226246961db9235098333caa13063906d3851136b84c2900b82f5daa1df", size = 10323796, upload-time = "2026-09-16T15:54:20.743Z" }, + { url = "https://files.pythonhosted.org/packages/f5/2c/cefd07bfe914b84943ea769ade8d607bd22750b965d3228eefd7cebd15d0/ruff-0.16.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a2bf6bc3e9ebdd4449abc6f06cf64b98051a2c61cf94d2fe9596518c881f1a1e", size = 10514115, upload-time = "2026-09-16T15:54:23.497Z" }, + { url = "https://files.pythonhosted.org/packages/f3/9d/76a2e26c79a23be6e6e3664c57bec9e9fc8de155cfb9e4b67ea91b64f9d7/ruff-0.16.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6ca111ba0849539165e9e59d2b442542f3c1e8060ebbdea82494f1ffbccb1e1f", size = 10072582, upload-time = "2026-09-16T15:54:26.185Z" }, + { url = "https://files.pythonhosted.org/packages/2e/d4/f42edddb39668af1a559ceafa3823aedd65633a48dc9768e775485faa2c1/ruff-0.16.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:359a1e5b495448ee1e91018064382ebc86f90e8aac2fed222c7d0e4e8df85fd2", size = 9879644, upload-time = "2026-09-16T15:54:29.278Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d4/913e3195d95e0378786c6656945c865f534a3560e29139da4882aff630d1/ruff-0.16.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:59e8f5681349474110b24d62e93cfda6593f5fa3473446ca3705200cac1a08b9", size = 10231569, upload-time = "2026-09-16T15:54:32.036Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c4/8aa6ea0bdcedbd1bf87397e2fc4ed8406448ea5842f8660bc6e5f163039d/ruff-0.16.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:efa3e7a16d1baaa79957888dfdf8be9ef2e44db81cb032af06d76632ab59e773", size = 10663666, upload-time = "2026-09-16T15:54:34.838Z" }, + { url = "https://files.pythonhosted.org/packages/3d/02/7f10ef4700bc223c30a3fdd10631a29830c45524b810a3c7ed947af64591/ruff-0.16.8-py3-none-win32.whl", hash = "sha256:55793ba85c69921e89be061426d91a78652d6e50317c962240922747a4eb713f", size = 10093472, upload-time = "2026-09-16T15:54:37.47Z" }, + { url = "https://files.pythonhosted.org/packages/1e/5d/a509c07d714b6da88f2c518b4637cf6f1d46b074be8f0f1e5fb9ff5126fe/ruff-0.16.8-py3-none-win_amd64.whl", hash = "sha256:a6b85621fd3c81e31fc5f5add09c9c078b430db3595ca632efafdec9e64ebfaa", size = 10586899, upload-time = "2026-09-16T15:54:40.488Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a0/50787329e4f20bf9dc9f6230015d46ec69c51a97ace5bc202dae4755365d/ruff-0.16.8-py3-none-win_arm64.whl", hash = "sha256:d075e820af612102ce217f07cc93e69f9490b10ec13ea85fa87bd03d996cef8a", size = 10386316, upload-time = "2026-09-16T15:54:43.332Z" }, ] [[package]] @@ -475,7 +475,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ { name = "pytest", specifier = ">=8.4.2,<9" }, - { name = "ruff", specifier = ">=0.15.20,<0.16" }, + { name = "ruff", specifier = ">=0.15.20,<0.17" }, { name = "ty", specifier = ">=0.0.56" }, ] From 197b44c13618348aef2b0766ec33fe535e0a3144 Mon Sep 17 00:00:00 2001 From: Carly Jones Date: Mon, 21 Sep 2026 10:09:24 -0400 Subject: [PATCH 3/3] lint, autofix what can be autofixed, ignore the rest (timezone related) --- stats-api/pyproject.toml | 8 ++++++++ stats-api/stats_api/app.py | 5 +++-- stats-api/stats_api/config/app.py | 21 ++++++++++----------- stats-api/stats_api/config/database.py | 2 -- stats-api/stats_api/exception.py | 2 +- stats-api/stats_api/models.py | 3 ++- stats-api/stats_api/repository.py | 16 ++++++++-------- stats-api/stats_api/routes.py | 9 +++++---- stats-api/stats_api/service.py | 23 ++++++++++++----------- stats-api/stats_api/utils.py | 23 ++++++++++++----------- stats-api/tests/conftest.py | 5 +++-- stats-api/tests/data/site_usage.py | 5 +++-- stats-api/tests/test_repository.py | 10 +++++----- stats-api/tests/test_routes.py | 4 ++-- stats-api/tests/test_service.py | 4 ++-- stats-api/tests/test_utils.py | 21 +++++++++++---------- 16 files changed, 87 insertions(+), 74 deletions(-) diff --git a/stats-api/pyproject.toml b/stats-api/pyproject.toml index fb9bf842..bd706f1f 100644 --- a/stats-api/pyproject.toml +++ b/stats-api/pyproject.toml @@ -29,6 +29,14 @@ default-groups = ["dev"] [tool.uv.sources] stats-entities = { path = "../stats-entities", editable = true } +[tool.ruff.lint] +ignore = [ + "DTZ001", # datetime() without tzinfo + "DTZ005", # datetime.now() without tz + "DTZ007", # strptime() without %z + "B006", # mutable argument default +] + [build-system] requires = ["hatchling"] build-backend = "hatchling.build" diff --git a/stats-api/stats_api/app.py b/stats-api/stats_api/app.py index 2fdafaf6..039cd95f 100644 --- a/stats-api/stats_api/app.py +++ b/stats-api/stats_api/app.py @@ -1,4 +1,5 @@ import os + from flask import Flask from flask_cors import CORS from sqlalchemy import URL @@ -6,8 +7,8 @@ from stats_api.config.app import config_map from stats_api.config.database import db -from stats_api.routes import stats_ui, stats_api -from stats_api.exception import handle_non_http_exception, handle_http_exception +from stats_api.exception import handle_http_exception, handle_non_http_exception +from stats_api.routes import stats_api, stats_ui def create_app() -> Flask: diff --git a/stats-api/stats_api/config/app.py b/stats-api/stats_api/config/app.py index ebc469a2..5877766e 100644 --- a/stats-api/stats_api/config/app.py +++ b/stats-api/stats_api/config/app.py @@ -1,9 +1,8 @@ -from typing import Type from datetime import date -from typing import Optional -from pydantic_settings import BaseSettings, SettingsConfigDict -from pydantic import field_validator, Field + +from pydantic import Field, field_validator from pydantic_core.core_schema import ValidationInfo +from pydantic_settings import BaseSettings, SettingsConfigDict from stats_api.config.urls import _URLS @@ -29,12 +28,12 @@ class Query(BaseConfig): class Database(BaseConfig): drivername: str - username: Optional[str] = None - password: Optional[str] = None - host: Optional[str] = None - port: Optional[int] = None + username: str | None = None + password: str | None = None + host: str | None = None + port: int | None = None database: str - query: Optional[Query] = None + query: Query | None = None class Config(BaseConfig): @@ -57,7 +56,7 @@ class Config(BaseConfig): BASE_SERVER: str = SERVER_NAME HELP_SERVER: str = "info.arxiv.org" AUTH_SERVER: str = BASE_SERVER - URLS: Optional[dict[str, str]] = None + URLS: dict[str, str] | None = None @field_validator("URLS") def construct_urls(cls, v, info: ValidationInfo): @@ -96,7 +95,7 @@ class ProdConfig(Config): pass -config_map: dict[str, Type[Config]] = { +config_map: dict[str, type[Config]] = { "TEST": TestConfig, "DEV": DevConfig, "PROD": ProdConfig, diff --git a/stats-api/stats_api/config/database.py b/stats-api/stats_api/config/database.py index 85db45fd..e0b18fe1 100644 --- a/stats-api/stats_api/config/database.py +++ b/stats-api/stats_api/config/database.py @@ -1,6 +1,4 @@ from flask_sqlalchemy import SQLAlchemy - from stats_entities import site_usage - db = SQLAlchemy(model_class=site_usage.SiteUsageBase) diff --git a/stats-api/stats_api/exception.py b/stats-api/stats_api/exception.py index 80b93b85..c0aaebc5 100644 --- a/stats-api/stats_api/exception.py +++ b/stats-api/stats_api/exception.py @@ -1,5 +1,5 @@ -from werkzeug.exceptions import HTTPException, InternalServerError from flask import render_template +from werkzeug.exceptions import HTTPException, InternalServerError def handle_non_http_exception(e): diff --git a/stats-api/stats_api/models.py b/stats-api/stats_api/models.py index d814ad7a..d4e69c6f 100644 --- a/stats-api/stats_api/models.py +++ b/stats-api/stats_api/models.py @@ -1,6 +1,7 @@ -from pydantic import BaseModel, ConfigDict, Field from datetime import date, datetime +from pydantic import BaseModel, ConfigDict, Field + class OrmBase(BaseModel): model_config = ConfigDict( diff --git a/stats-api/stats_api/repository.py b/stats-api/stats_api/repository.py index a288efff..66a28ae4 100644 --- a/stats-api/stats_api/repository.py +++ b/stats-api/stats_api/repository.py @@ -1,16 +1,16 @@ from datetime import date, datetime -from typing import List -from sqlalchemy import func -from stats_api.config.database import db -from stats_api.models import MonthlyDownloads_, HourlyRequests_, MonthlySubmissions_ +from sqlalchemy import func from stats_entities.site_usage import ( HourlyDownloads, + HourlyRequests, MonthlyDownloads, MonthlySubmissions, - HourlyRequests, ) +from stats_api.config.database import db +from stats_api.models import HourlyRequests_, MonthlyDownloads_, MonthlySubmissions_ + class SiteUsageRepository: """accepts and returns timezone naive, but utc date/datetime objects""" @@ -26,7 +26,7 @@ def get_total_requests(start: datetime, end: datetime) -> int: ).scalar() @staticmethod - def get_hourly_requests(start: datetime, end: datetime) -> List[HourlyRequests_]: + def get_hourly_requests(start: datetime, end: datetime) -> list[HourlyRequests_]: results = ( db.session.execute( db.select(HourlyRequests).where( @@ -50,7 +50,7 @@ def get_total_submissions(date: date) -> int: ).scalar() @staticmethod - def get_monthly_submissions() -> List[MonthlySubmissions_]: + def get_monthly_submissions() -> list[MonthlySubmissions_]: results = db.session.execute(db.select(MonthlySubmissions)).scalars().all() return [MonthlySubmissions_.model_validate(row) for row in results] @@ -81,7 +81,7 @@ def get_total_downloads(month: date) -> int: ).scalar() @staticmethod - def get_monthly_downloads(month: date) -> List[MonthlyDownloads_]: + def get_monthly_downloads(month: date) -> list[MonthlyDownloads_]: """month object should represent the first day of that month""" results = db.session.execute( db.select(MonthlyDownloads.month, MonthlyDownloads.downloads) diff --git a/stats-api/stats_api/routes.py b/stats-api/stats_api/routes.py index 7cb4fd6f..3b24d09d 100644 --- a/stats-api/stats_api/routes.py +++ b/stats-api/stats_api/routes.py @@ -1,19 +1,20 @@ from http import HTTPStatus -from werkzeug.exceptions import BadRequest + from flask import ( Blueprint, - render_template, make_response, + render_template, request, ) from flask.typing import ResponseReturnValue +from werkzeug.exceptions import BadRequest from stats_api.service import StatsService from stats_api.utils import ( - set_fastly_headers, get_arxiv_current_time, - url_param_to_date, + set_fastly_headers, url_param_to_arxiv_datetime, + url_param_to_date, ) stats_ui = Blueprint("stats_ui", __name__, url_prefix="/") diff --git a/stats-api/stats_api/service.py b/stats-api/stats_api/service.py index 28c40219..b876ddf5 100644 --- a/stats-api/stats_api/service.py +++ b/stats-api/stats_api/service.py @@ -1,20 +1,21 @@ -from flask import current_app -from datetime import date, datetime, timezone +from datetime import UTC, date, datetime from zoneinfo import ZoneInfo + from dateutil.relativedelta import relativedelta +from flask import current_app -from stats_api.repository import SiteUsageRepository -from stats_api.utils import ( - get_utc_start_and_end_times, - format_as_csv, - utc_to_arxiv_local, -) from stats_api.models import ( - TodayPageData, DownloadsPageData, - SubmissionsPageData, HourlyRequests_, MonthlyDownloads_, + SubmissionsPageData, + TodayPageData, +) +from stats_api.repository import SiteUsageRepository +from stats_api.utils import ( + format_as_csv, + get_utc_start_and_end_times, + utc_to_arxiv_local, ) @@ -60,7 +61,7 @@ def get_submissions_page_data(date: date) -> SubmissionsPageData: @staticmethod def get_downloads_page_data() -> DownloadsPageData: latest_hour = SiteUsageRepository.get_latest_hour_for_downloads() - arxiv_latest_hour = latest_hour.replace(tzinfo=timezone.utc).astimezone( + arxiv_latest_hour = latest_hour.replace(tzinfo=UTC).astimezone( ZoneInfo(current_app.config["ARXIV_TIMEZONE"]) ) diff --git a/stats-api/stats_api/utils.py b/stats-api/stats_api/utils.py index abd476ac..2cb684ce 100644 --- a/stats-api/stats_api/utils.py +++ b/stats-api/stats_api/utils.py @@ -1,11 +1,12 @@ -from flask import current_app -import io import csv -from pydantic import BaseModel -from typing import List, Tuple, Callable, Sequence -from datetime import date, datetime, timezone -from zoneinfo import ZoneInfo +import io +from collections.abc import Callable, Sequence +from datetime import UTC, date, datetime from functools import wraps +from zoneinfo import ZoneInfo + +from flask import current_app +from pydantic import BaseModel def url_param_to_date(param: str) -> date: @@ -20,7 +21,7 @@ def url_param_to_arxiv_datetime(param: str) -> datetime: ) -def set_fastly_headers(keys: List[str] = ["stats"]): +def set_fastly_headers(keys: list[str] = ["stats"]): def decorator(function: Callable) -> Callable: @wraps(function) def decorated_function(*args, **kwargs): @@ -41,7 +42,7 @@ def get_arxiv_current_time() -> datetime: return datetime.now(tz=ZoneInfo(current_app.config["ARXIV_TIMEZONE"])) -def get_utc_start_and_end_times(date: date) -> Tuple[datetime, datetime]: +def get_utc_start_and_end_times(date: date) -> tuple[datetime, datetime]: """take a non-aware date object, assume arxiv local time, return start and end datetimes representing the beginning of the first and last hour of that day, utc @@ -52,14 +53,14 @@ def get_utc_start_and_end_times(date: date) -> Tuple[datetime, datetime]: date.day, 0, tzinfo=ZoneInfo(current_app.config["ARXIV_TIMEZONE"]), - ).astimezone(timezone.utc) + ).astimezone(UTC) end = datetime( date.year, date.month, date.day, 23, tzinfo=ZoneInfo(current_app.config["ARXIV_TIMEZONE"]), - ).astimezone(timezone.utc) + ).astimezone(UTC) return start, end @@ -74,6 +75,6 @@ def format_as_csv(models: Sequence[BaseModel]) -> str: def utc_to_arxiv_local(dt: datetime) -> datetime: - return dt.replace(tzinfo=timezone.utc).astimezone( + return dt.replace(tzinfo=UTC).astimezone( ZoneInfo(current_app.config["ARXIV_TIMEZONE"]) ) diff --git a/stats-api/tests/conftest.py b/stats-api/tests/conftest.py index f1051efd..f94f3ef1 100644 --- a/stats-api/tests/conftest.py +++ b/stats-api/tests/conftest.py @@ -1,10 +1,11 @@ import pytest + from stats_api.app import create_app from tests.data.site_usage import ( - mock_hourly_requests, - mock_monthly_submissions, mock_hourly_downloads, + mock_hourly_requests, mock_monthly_downloads, + mock_monthly_submissions, ) diff --git a/stats-api/tests/data/site_usage.py b/stats-api/tests/data/site_usage.py index 48105120..66e00037 100644 --- a/stats-api/tests/data/site_usage.py +++ b/stats-api/tests/data/site_usage.py @@ -1,9 +1,10 @@ from datetime import date, datetime + from stats_entities.site_usage import ( - HourlyRequests, - MonthlySubmissions, HourlyDownloads, + HourlyRequests, MonthlyDownloads, + MonthlySubmissions, ) """ diff --git a/stats-api/tests/test_repository.py b/stats-api/tests/test_repository.py index 0f084fc6..fd352e3f 100644 --- a/stats-api/tests/test_repository.py +++ b/stats-api/tests/test_repository.py @@ -1,12 +1,12 @@ -from datetime import date, datetime, timezone +from datetime import UTC, date, datetime from stats_api.repository import SiteUsageRepository def test_get_total_requests(app): with app.app_context(): - start = datetime(2025, 11, 10, 10, tzinfo=timezone.utc) - end = datetime(2025, 11, 12, 0, tzinfo=timezone.utc) + start = datetime(2025, 11, 10, 10, tzinfo=UTC) + end = datetime(2025, 11, 12, 0, tzinfo=UTC) result = SiteUsageRepository.get_total_requests(start, end) @@ -15,8 +15,8 @@ def test_get_total_requests(app): def test_get_hourly_requests(app): with app.app_context(): - start = datetime(2025, 11, 10, 10, tzinfo=timezone.utc) - end = datetime(2025, 11, 11, 4, tzinfo=timezone.utc) + start = datetime(2025, 11, 10, 10, tzinfo=UTC) + end = datetime(2025, 11, 11, 4, tzinfo=UTC) result = SiteUsageRepository.get_hourly_requests(start, end) diff --git a/stats-api/tests/test_routes.py b/stats-api/tests/test_routes.py index 7f52f460..0d99caf2 100644 --- a/stats-api/tests/test_routes.py +++ b/stats-api/tests/test_routes.py @@ -1,6 +1,6 @@ -from unittest.mock import patch +from datetime import date, datetime from http import HTTPStatus -from datetime import datetime, date +from unittest.mock import patch from stats_api.models import TodayPageData diff --git a/stats-api/tests/test_service.py b/stats-api/tests/test_service.py index dc26b01f..c497a8b3 100644 --- a/stats-api/tests/test_service.py +++ b/stats-api/tests/test_service.py @@ -1,8 +1,8 @@ -from unittest.mock import patch from datetime import date, datetime +from unittest.mock import patch -from stats_api.service import StatsService from stats_api.models import MonthlyDownloads_ +from stats_api.service import StatsService @patch("stats_api.service.SiteUsageRepository") diff --git a/stats-api/tests/test_utils.py b/stats-api/tests/test_utils.py index 31b3f8b2..fe4b3e32 100644 --- a/stats-api/tests/test_utils.py +++ b/stats-api/tests/test_utils.py @@ -1,16 +1,17 @@ -from datetime import date, datetime, timezone +from datetime import UTC, date, datetime from zoneinfo import ZoneInfo + from flask import Response +from stats_api.models import HourlyRequests_ from stats_api.utils import ( - url_param_to_date, - url_param_to_arxiv_datetime, - set_fastly_headers, - get_utc_start_and_end_times, format_as_csv, + get_utc_start_and_end_times, + set_fastly_headers, + url_param_to_arxiv_datetime, + url_param_to_date, utc_to_arxiv_local, ) -from stats_api.models import HourlyRequests_ def test_url_param_to_date(app): @@ -44,16 +45,16 @@ def test_get_utc_start_and_end_times_est(app): with app.app_context(): start, end = get_utc_start_and_end_times(date(2025, 11, 11)) - assert start == datetime(2025, 11, 11, 5, tzinfo=timezone.utc) - assert end == datetime(2025, 11, 12, 4, tzinfo=timezone.utc) + assert start == datetime(2025, 11, 11, 5, tzinfo=UTC) + assert end == datetime(2025, 11, 12, 4, tzinfo=UTC) def test_get_utc_start_and_end_times_edt(app): with app.app_context(): start, end = get_utc_start_and_end_times(date(2025, 4, 1)) - assert start == datetime(2025, 4, 1, 4, tzinfo=timezone.utc) - assert end == datetime(2025, 4, 2, 3, tzinfo=timezone.utc) + assert start == datetime(2025, 4, 1, 4, tzinfo=UTC) + assert end == datetime(2025, 4, 2, 3, tzinfo=UTC) def test_format_as_csv():