diff --git a/Dockerfile b/Dockerfile index 7ce742d6..8d2a7c4b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,12 +16,14 @@ COPY pyproject.toml uv.lock /code/ # Sync the project into a new environment (no dev dependencies) WORKDIR /code -RUN uv sync --frozen --no-cache --no-dev # Copy code and static folders COPY ./app /code/app COPY ./static /code/static +# Install the project +RUN uv sync --frozen --no-cache --no-dev + # Copy crontabs file and make it executable COPY ./build/overfast-crontab /etc/crontabs/root RUN chmod +x /etc/crontabs/root diff --git a/pyproject.toml b/pyproject.toml index 52b48d53..b3fff3c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "overfast-api" -version = "2.34.0" +version = "2.34.1" description = "Overwatch API giving data about heroes, maps, and players statistics." license = {file = "LICENSE"} authors = [ @@ -9,14 +9,14 @@ authors = [ readme = "README.md" requires-python = ">=3.12" dependencies = [ - "beautifulsoup4 >=4.12.3,<4.13", - "fastapi[standard] >=0.112.1,<0.113", - "httpx[http2] >=0.27.0,<0.28", - "loguru >=0.7.2,<0.8", - "lxml >=5.3.0,<5.4", - "redis >=5.0.8,<5.1", - "pydantic >=2.8.2,<2.9", - "pydantic-settings >=2.4.0,<2.5" + "beautifulsoup4==4.12.*", + "fastapi[standard]==0.112.*", + "httpx[http2]==0.27.*", + "loguru==0.7.*", + "lxml==5.3.*", + "redis==5.0.*", + "pydantic==2.8.*", + "pydantic-settings==2.4.*", ] [project.urls] @@ -31,15 +31,15 @@ packages = ["app"] [tool.uv] compile-bytecode = true dev-dependencies = [ - "fakeredis >=2.23.5,<2.24", - "ipdb >=0.13.13,<0.14", - "pytest >=8.3.2,<8.4", - "pytest-asyncio >=0.23.8,<0.24", - "pytest-cov >=5.0.0,<5.1", - "pytest-randomly >=3.15.0,<3.16", - "pytest-xdist >=3.6.1,<3.7", - "ruff >=0.5.7,<0.6", - "pre-commit >=3.8.0,<3.9" + "fakeredis==2.24.*", + "ipdb==0.13.*", + "pytest==8.3.*", + "pytest-asyncio==0.24.*", + "pytest-cov==5.0.*", + "pytest-randomly==3.15.*", + "pytest-xdist==3.6.*", + "ruff==0.6.*", + "pre-commit==3.8.*", ] [tool.ruff] diff --git a/tests/commands/test_check_and_delete_parser_cache.py b/tests/commands/test_check_and_delete_parser_cache.py index 7add8055..97643a44 100644 --- a/tests/commands/test_check_and_delete_parser_cache.py +++ b/tests/commands/test_check_and_delete_parser_cache.py @@ -11,12 +11,12 @@ from app.config import settings -@pytest.fixture() +@pytest.fixture def cache_manager(): return CacheManager() -@pytest.fixture() +@pytest.fixture def locale(): return Locale.ENGLISH_US diff --git a/tests/commands/test_check_and_update_cache.py b/tests/commands/test_check_and_update_cache.py index d891c372..05645287 100644 --- a/tests/commands/test_check_and_update_cache.py +++ b/tests/commands/test_check_and_update_cache.py @@ -14,12 +14,12 @@ from app.config import settings -@pytest.fixture() +@pytest.fixture def cache_manager(): return CacheManager() -@pytest.fixture() +@pytest.fixture def locale(): return Locale.ENGLISH_US diff --git a/tests/commands/test_update_search_data_cache.py b/tests/commands/test_update_search_data_cache.py index 8537a462..a54464a5 100644 --- a/tests/commands/test_update_search_data_cache.py +++ b/tests/commands/test_update_search_data_cache.py @@ -9,7 +9,7 @@ from app.common.enums import SearchDataType -@pytest.fixture() +@pytest.fixture def cache_manager(): return CacheManager() diff --git a/tests/common/test_cache_manager.py b/tests/common/test_cache_manager.py index f577a7ae..0c7e11f7 100644 --- a/tests/common/test_cache_manager.py +++ b/tests/common/test_cache_manager.py @@ -10,12 +10,12 @@ from app.config import settings -@pytest.fixture() +@pytest.fixture def cache_manager(): return CacheManager() -@pytest.fixture() +@pytest.fixture def locale(): return Locale.ENGLISH_US diff --git a/tests/parsers/test_gamemodes_parser.py b/tests/parsers/test_gamemodes_parser.py index f3655599..7b3b0c2e 100644 --- a/tests/parsers/test_gamemodes_parser.py +++ b/tests/parsers/test_gamemodes_parser.py @@ -7,7 +7,7 @@ from app.parsers.gamemodes_parser import GamemodesParser -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_gamemodes_page_parsing(home_html_data: str): parser = GamemodesParser() diff --git a/tests/parsers/test_hero_parser.py b/tests/parsers/test_hero_parser.py index f55c1eb9..73eacac9 100644 --- a/tests/parsers/test_hero_parser.py +++ b/tests/parsers/test_hero_parser.py @@ -13,7 +13,7 @@ [(h.value, h.value) for h in HeroKey], indirect=["hero_html_data"], ) -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_hero_page_parsing(hero_key: str, hero_html_data: str): if not hero_html_data: pytest.skip("Hero HTML file not saved yet, skipping") @@ -32,7 +32,7 @@ async def test_hero_page_parsing(hero_key: str, hero_html_data: str): @pytest.mark.parametrize("hero_html_data", ["unknown-hero"], indirect=True) -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_not_released_hero_parser_blizzard_error(hero_html_data: str): parser = HeroParser() diff --git a/tests/parsers/test_heroes_parser.py b/tests/parsers/test_heroes_parser.py index 504909df..3c5c2a62 100644 --- a/tests/parsers/test_heroes_parser.py +++ b/tests/parsers/test_heroes_parser.py @@ -8,7 +8,7 @@ from app.parsers.heroes_parser import HeroesParser -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_heroes_page_parsing(heroes_html_data: str): parser = HeroesParser() diff --git a/tests/parsers/test_maps_parser.py b/tests/parsers/test_maps_parser.py index c5ad4832..d2973205 100644 --- a/tests/parsers/test_maps_parser.py +++ b/tests/parsers/test_maps_parser.py @@ -4,7 +4,7 @@ from app.parsers.maps_parser import MapsParser -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_maps_page_parsing(): parser = MapsParser() diff --git a/tests/parsers/test_namecard_parser.py b/tests/parsers/test_namecard_parser.py index 3c5e5b1e..050b6384 100644 --- a/tests/parsers/test_namecard_parser.py +++ b/tests/parsers/test_namecard_parser.py @@ -11,7 +11,7 @@ from app.parsers.search_data_parser import NamecardParser -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_namecard_parser_no_cache( search_players_blizzard_json_data: dict, search_html_data: str, @@ -48,7 +48,7 @@ async def test_namecard_parser_no_cache( update_parser_cache_last_update_mock.assert_called_once() -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_namecard_parser_blizzard_error(): parser = NamecardParser(player_id="Dekk-2677") @@ -72,7 +72,7 @@ async def test_namecard_parser_blizzard_error(): ) -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_namecard_parser_error_key_error(search_tekrop_blizzard_json_data: dict): # Search data without battletag search_data = [search_tekrop_blizzard_json_data[0].copy()] @@ -97,7 +97,7 @@ async def test_namecard_parser_error_key_error(search_tekrop_blizzard_json_data: assert error.value.message == "KeyError('battleTag')" -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_namecard_parser_player_not_found(): parser = NamecardParser(player_id="Unknown-1234") @@ -121,7 +121,7 @@ async def test_namecard_parser_player_not_found(): assert parser.data == {"namecard": None} -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_namecard_parser_player_without_namecard(): search_data = [ { @@ -158,7 +158,7 @@ async def test_namecard_parser_player_without_namecard(): assert parser.data == {"namecard": None} -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_namecard_parser_no_cache_no_namecard( search_players_blizzard_json_data: dict, ): @@ -200,7 +200,7 @@ async def test_namecard_parser_no_cache_no_namecard( assert parser.data == {"namecard": None} -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_namecard_parser_with_cache( search_players_blizzard_json_data: dict, search_data_json_data: dict, diff --git a/tests/parsers/test_player_career_parser.py b/tests/parsers/test_player_career_parser.py index 3973d001..a682cc51 100644 --- a/tests/parsers/test_player_career_parser.py +++ b/tests/parsers/test_player_career_parser.py @@ -16,7 +16,7 @@ ], indirect=["player_html_data", "player_career_json_data"], ) -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_player_page_parsing_with_filters( player_id: str, player_html_data: str, @@ -47,7 +47,7 @@ async def test_player_page_parsing_with_filters( @pytest.mark.parametrize("player_html_data", ["Unknown-1234"], indirect=True) -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_unknown_player_parser_blizzard_error(player_html_data: str): parser = PlayerCareerParser(player_id="Unknown-1234") with ( diff --git a/tests/parsers/test_player_parser.py b/tests/parsers/test_player_parser.py index 239ec9f7..bbab99ca 100644 --- a/tests/parsers/test_player_parser.py +++ b/tests/parsers/test_player_parser.py @@ -18,7 +18,7 @@ ], indirect=["player_html_data", "player_json_data"], ) -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_player_page_parsing_with_filters( player_id: str, player_html_data: str, @@ -54,7 +54,7 @@ async def test_player_page_parsing_with_filters( @pytest.mark.parametrize("player_html_data", ["Unknown-1234"], indirect=True) -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_unknown_player_parser_blizzard_error(player_html_data: str): parser = PlayerParser(player_id="Unknown-1234") with ( @@ -69,7 +69,7 @@ async def test_unknown_player_parser_blizzard_error(player_html_data: str): @pytest.mark.parametrize("player_html_data", ["TeKrop-2217"], indirect=True) -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_player_parser_parsing_error_attribute_error(player_html_data: str): player_attr_error = player_html_data.replace( 'class="Profile-player--summaryWrapper"', @@ -94,7 +94,7 @@ async def test_player_parser_parsing_error_attribute_error(player_html_data: str @pytest.mark.parametrize("player_html_data", ["TeKrop-2217"], indirect=True) -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_player_parser_parsing_error_key_error(player_html_data: str): player_key_error = re.sub( 'class="Profile-playerSummary--endorsement" src="[^"]*"', @@ -117,7 +117,7 @@ async def test_player_parser_parsing_error_key_error(player_html_data: str): @pytest.mark.parametrize("player_html_data", ["TeKrop-2217"], indirect=True) -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_player_parser_parsing_error_type_error(player_html_data: str): player_type_error = player_html_data.replace( 'class="Profile-playerSummary--endorsement"', diff --git a/tests/parsers/test_player_stats_summary_parser.py b/tests/parsers/test_player_stats_summary_parser.py index 5dea8ffd..61e11969 100644 --- a/tests/parsers/test_player_stats_summary_parser.py +++ b/tests/parsers/test_player_stats_summary_parser.py @@ -16,7 +16,7 @@ ], indirect=["player_html_data", "player_stats_json_data"], ) -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_player_page_parsing( player_id: str, player_html_data: str, @@ -44,7 +44,7 @@ async def test_player_page_parsing( @pytest.mark.parametrize("player_html_data", ["Unknown-1234"], indirect=True) -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_unknown_player_parser_blizzard_error(player_html_data: str): parser = PlayerStatsSummaryParser(player_id="Unknown-1234") with ( diff --git a/tests/parsers/test_roles_parser.py b/tests/parsers/test_roles_parser.py index 59f1190a..6f2559f2 100644 --- a/tests/parsers/test_roles_parser.py +++ b/tests/parsers/test_roles_parser.py @@ -8,7 +8,7 @@ from app.parsers.roles_parser import RolesParser -@pytest.mark.asyncio() +@pytest.mark.asyncio async def test_roles_page_parsing(home_html_data: str): parser = RolesParser() diff --git a/uv.lock b/uv.lock index ed2ed3bd..e1f23b79 100644 --- a/uv.lock +++ b/uv.lock @@ -188,15 +188,15 @@ wheels = [ [[package]] name = "fakeredis" -version = "2.23.5" +version = "2.24.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "redis" }, { name = "sortedcontainers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/31/3a/bcd9741b46a8c8076aebd7a7f88db545e028f08345eeb57a6910dcd9c217/fakeredis-2.23.5.tar.gz", hash = "sha256:edffc79fdce0f1d83cbb20b52694a9cba4a5fe5beb627c11722a42aa0fa44f52", size = 132797 } +sdist = { url = "https://files.pythonhosted.org/packages/f3/3d/743a60e3c90c12776e4a19667029fb822beae6d09b058c7dbc72767dc813/fakeredis-2.24.0.tar.gz", hash = "sha256:bd798c2e53600c009f60e6cc8efb77751c9df713ecb47aa88fa1001c6ab8452a", size = 143594 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/19/920bc0f4c17d68b659b6ab36e4a60ee969d736de3c8613a1959887647db6/fakeredis-2.23.5-py3-none-any.whl", hash = "sha256:4d85b1b6b3a80cbbb3a8967f8686f7bf6ddf5bd7cd5ac7ac90b3561d8c3a7ddb", size = 88190 }, + { url = "https://files.pythonhosted.org/packages/73/13/eafd2f15fa3330e77f6c80edba7a8b8895683f1eee913c8f36480abae0f0/fakeredis-2.24.0-py3-none-any.whl", hash = "sha256:2f538be80ef5884ac9acbb5f96d8b010697cb9c02380a3a6f29795f106970f52", size = 97024 }, ] [[package]] @@ -216,12 +216,10 @@ wheels = [ [package.optional-dependencies] standard = [ { name = "email-validator" }, - { name = "fastapi-cli" }, { name = "fastapi-cli", extra = ["standard"] }, { name = "httpx" }, { name = "jinja2" }, { name = "python-multipart" }, - { name = "uvicorn" }, { name = "uvicorn", extra = ["standard"] }, ] @@ -240,7 +238,6 @@ wheels = [ [package.optional-dependencies] standard = [ - { name = "uvicorn" }, { name = "uvicorn", extra = ["standard"] }, ] @@ -353,11 +350,11 @@ wheels = [ [[package]] name = "idna" -version = "3.7" +version = "3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/ed/f86a79a07470cb07819390452f178b3bef1d375f2ec021ecfc709fc7cf07/idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", size = 189575 } +sdist = { url = "https://files.pythonhosted.org/packages/e8/ac/e349c5e6d4543326c6883ee9491e3921e0d07b55fdf3cce184b40d63e72a/idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603", size = 189467 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0", size = 66836 }, + { url = "https://files.pythonhosted.org/packages/22/7e/d71db821f177828df9dea8c42ac46473366f191be53080e552e628aad991/idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", size = 66894 }, ] [[package]] @@ -543,7 +540,7 @@ wheels = [ [[package]] name = "overfast-api" -version = "2.33.1" +version = "2.34.0" source = { editable = "." } dependencies = [ { name = "beautifulsoup4" }, @@ -571,27 +568,27 @@ dev = [ [package.metadata] requires-dist = [ - { name = "beautifulsoup4", specifier = ">=4.12.3,<4.13" }, - { name = "fastapi", extras = ["standard"], specifier = ">=0.112.1,<0.113" }, - { name = "httpx", extras = ["http2"], specifier = ">=0.27.0,<0.28" }, - { name = "loguru", specifier = ">=0.7.2,<0.8" }, - { name = "lxml", specifier = ">=5.3.0,<5.4" }, - { name = "pydantic", specifier = ">=2.8.2,<2.9" }, - { name = "pydantic-settings", specifier = ">=2.4.0,<2.5" }, - { name = "redis", specifier = ">=5.0.8,<5.1" }, + { name = "beautifulsoup4", specifier = "==4.12.*" }, + { name = "fastapi", extras = ["standard"], specifier = "==0.112.*" }, + { name = "httpx", extras = ["http2"], specifier = "==0.27.*" }, + { name = "loguru", specifier = "==0.7.*" }, + { name = "lxml", specifier = "==5.3.*" }, + { name = "pydantic", specifier = "==2.8.*" }, + { name = "pydantic-settings", specifier = "==2.4.*" }, + { name = "redis", specifier = "==5.0.*" }, ] [package.metadata.requires-dev] dev = [ - { name = "fakeredis", specifier = ">=2.23.5,<2.24" }, - { name = "ipdb", specifier = ">=0.13.13,<0.14" }, - { name = "pre-commit", specifier = ">=3.8.0,<3.9" }, - { name = "pytest", specifier = ">=8.3.2,<8.4" }, - { name = "pytest-asyncio", specifier = ">=0.23.8,<0.24" }, - { name = "pytest-cov", specifier = ">=5.0.0,<5.1" }, - { name = "pytest-randomly", specifier = ">=3.15.0,<3.16" }, - { name = "pytest-xdist", specifier = ">=3.6.1,<3.7" }, - { name = "ruff", specifier = ">=0.5.7,<0.6" }, + { name = "fakeredis", specifier = "==2.24.*" }, + { name = "ipdb", specifier = "==0.13.*" }, + { name = "pre-commit", specifier = "==3.8.*" }, + { name = "pytest", specifier = "==8.3.*" }, + { name = "pytest-asyncio", specifier = "==0.24.*" }, + { name = "pytest-cov", specifier = "==5.0.*" }, + { name = "pytest-randomly", specifier = "==3.15.*" }, + { name = "pytest-xdist", specifier = "==3.6.*" }, + { name = "ruff", specifier = "==0.6.*" }, ] [[package]] @@ -776,14 +773,14 @@ wheels = [ [[package]] name = "pytest-asyncio" -version = "0.23.8" +version = "0.24.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/de/b4/0b378b7bf26a8ae161c3890c0b48a91a04106c5713ce81b4b080ea2f4f18/pytest_asyncio-0.23.8.tar.gz", hash = "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3", size = 46920 } +sdist = { url = "https://files.pythonhosted.org/packages/52/6d/c6cf50ce320cf8611df7a1254d86233b3df7cc07f9b5f5cbcb82e08aa534/pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276", size = 49855 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/82/62e2d63639ecb0fbe8a7ee59ef0bc69a4669ec50f6d3459f74ad4e4189a2/pytest_asyncio-0.23.8-py3-none-any.whl", hash = "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2", size = 17663 }, + { url = "https://files.pythonhosted.org/packages/96/31/6607dab48616902f76885dfcf62c08d929796fc3b2d2318faf9fd54dbed9/pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b", size = 18024 }, ] [[package]] @@ -892,27 +889,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.5.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bf/2b/69e5e412f9d390adbdbcbf4f64d6914fa61b44b08839a6584655014fc524/ruff-0.5.7.tar.gz", hash = "sha256:8dfc0a458797f5d9fb622dd0efc52d796f23f0a1493a9527f4e49a550ae9a7e5", size = 2449817 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/eb/06e06aaf96af30a68e83b357b037008c54a2ddcbad4f989535007c700394/ruff-0.5.7-py3-none-linux_armv6l.whl", hash = "sha256:548992d342fc404ee2e15a242cdbea4f8e39a52f2e7752d0e4cbe88d2d2f416a", size = 9570571 }, - { url = "https://files.pythonhosted.org/packages/a4/10/1be32aeaab8728f78f673e7a47dd813222364479b2d6573dbcf0085e83ea/ruff-0.5.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:00cc8872331055ee017c4f1071a8a31ca0809ccc0657da1d154a1d2abac5c0be", size = 8685138 }, - { url = "https://files.pythonhosted.org/packages/3d/1d/c218ce83beb4394ba04d05e9aa2ae6ce9fba8405688fe878b0fdb40ce855/ruff-0.5.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eaf3d86a1fdac1aec8a3417a63587d93f906c678bb9ed0b796da7b59c1114a1e", size = 8266785 }, - { url = "https://files.pythonhosted.org/packages/26/79/7f49509bd844476235b40425756def366b227a9714191c91f02fb2178635/ruff-0.5.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a01c34400097b06cf8a6e61b35d6d456d5bd1ae6961542de18ec81eaf33b4cb8", size = 9983964 }, - { url = "https://files.pythonhosted.org/packages/bf/b1/939836b70bf9fcd5e5cd3ea67fdb8abb9eac7631351d32f26544034a35e4/ruff-0.5.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcc8054f1a717e2213500edaddcf1dbb0abad40d98e1bd9d0ad364f75c763eea", size = 9359490 }, - { url = "https://files.pythonhosted.org/packages/32/7d/b3db19207de105daad0c8b704b2c6f2a011f9c07017bd58d8d6e7b8eba19/ruff-0.5.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f70284e73f36558ef51602254451e50dd6cc479f8b6f8413a95fcb5db4a55fc", size = 10170833 }, - { url = "https://files.pythonhosted.org/packages/a2/45/eae9da55f3357a1ac04220230b8b07800bf516e6dd7e1ad20a2ff3b03b1b/ruff-0.5.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a78ad870ae3c460394fc95437d43deb5c04b5c29297815a2a1de028903f19692", size = 10896360 }, - { url = "https://files.pythonhosted.org/packages/99/67/4388b36d145675f4c51ebec561fcd4298a0e2550c81e629116f83ce45a39/ruff-0.5.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ccd078c66a8e419475174bfe60a69adb36ce04f8d4e91b006f1329d5cd44bcf", size = 10477094 }, - { url = "https://files.pythonhosted.org/packages/e1/9c/f5e6ed1751dc187a4ecf19a4970dd30a521c0ee66b7941c16e292a4043fb/ruff-0.5.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e31c9bad4ebf8fdb77b59cae75814440731060a09a0e0077d559a556453acbb", size = 11480896 }, - { url = "https://files.pythonhosted.org/packages/c8/3b/2b683be597bbd02046678fc3fc1c199c641512b20212073b58f173822bb3/ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d796327eed8e168164346b769dd9a27a70e0298d667b4ecee6877ce8095ec8e", size = 10179702 }, - { url = "https://files.pythonhosted.org/packages/f1/38/c2d94054dc4b3d1ea4c2ba3439b2a7095f08d1c8184bc41e6abe2a688be7/ruff-0.5.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a09ea2c3f7778cc635e7f6edf57d566a8ee8f485f3c4454db7771efb692c499", size = 9982855 }, - { url = "https://files.pythonhosted.org/packages/7d/e7/1433db2da505ffa8912dcf5b28a8743012ee780cbc20ad0bf114787385d9/ruff-0.5.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a36d8dcf55b3a3bc353270d544fb170d75d2dff41eba5df57b4e0b67a95bb64e", size = 9433156 }, - { url = "https://files.pythonhosted.org/packages/e0/36/4fa43250e67741edeea3d366f59a1dc993d4d89ad493a36cbaa9889895f2/ruff-0.5.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9369c218f789eefbd1b8d82a8cf25017b523ac47d96b2f531eba73770971c9e5", size = 9782971 }, - { url = "https://files.pythonhosted.org/packages/80/0e/8c276103d518e5cf9202f70630aaa494abf6fc71c04d87c08b6d3cd07a4b/ruff-0.5.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b88ca3db7eb377eb24fb7c82840546fb7acef75af4a74bd36e9ceb37a890257e", size = 10247775 }, - { url = "https://files.pythonhosted.org/packages/cb/b9/673096d61276f39291b729dddde23c831a5833d98048349835782688a0ec/ruff-0.5.7-py3-none-win32.whl", hash = "sha256:33d61fc0e902198a3e55719f4be6b375b28f860b09c281e4bdbf783c0566576a", size = 7841772 }, - { url = "https://files.pythonhosted.org/packages/67/1c/4520c98bfc06b9c73cd1457686d4d3935d40046b1ddea08403e5a6deff51/ruff-0.5.7-py3-none-win_amd64.whl", hash = "sha256:083bbcbe6fadb93cd86709037acc510f86eed5a314203079df174c40bbbca6b3", size = 8699779 }, - { url = "https://files.pythonhosted.org/packages/38/23/b3763a237d2523d40a31fe2d1a301191fe392dd48d3014977d079cf8c0bd/ruff-0.5.7-py3-none-win_arm64.whl", hash = "sha256:2dca26154ff9571995107221d0aeaad0e75a77b5a682d6236cf89a58c70b76f4", size = 8091891 }, +version = "0.6.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/f4/279d044f66b79261fd37df76bf72b64471afab5d3b7906a01499c4451910/ruff-0.6.2.tar.gz", hash = "sha256:239ee6beb9e91feb8e0ec384204a763f36cb53fb895a1a364618c6abb076b3be", size = 2460281 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/4b/47dd7a69287afb4069fa42c198e899463605460a58120196711bfcf0446b/ruff-0.6.2-py3-none-linux_armv6l.whl", hash = "sha256:5c8cbc6252deb3ea840ad6a20b0f8583caab0c5ef4f9cca21adc5a92b8f79f3c", size = 9695871 }, + { url = "https://files.pythonhosted.org/packages/ae/c3/8aac62ac4638c14a740ee76a755a925f2d0d04580ab790a9887accb729f6/ruff-0.6.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:17002fe241e76544448a8e1e6118abecbe8cd10cf68fde635dad480dba594570", size = 9459354 }, + { url = "https://files.pythonhosted.org/packages/2f/cf/77fbd8d4617b9b9c503f9bffb8552c4e3ea1a58dc36975e7a9104ffb0f85/ruff-0.6.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3dbeac76ed13456f8158b8f4fe087bf87882e645c8e8b606dd17b0b66c2c1158", size = 9163871 }, + { url = "https://files.pythonhosted.org/packages/05/1c/765192bab32b79efbb498b06f0b9dcb3629112b53b8777ae1d19b8209e09/ruff-0.6.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:094600ee88cda325988d3f54e3588c46de5c18dae09d683ace278b11f9d4d534", size = 10096250 }, + { url = "https://files.pythonhosted.org/packages/08/d0/86f3cb0f6934c99f759c232984a5204d67a26745cad2d9edff6248adf7d2/ruff-0.6.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:316d418fe258c036ba05fbf7dfc1f7d3d4096db63431546163b472285668132b", size = 9475376 }, + { url = "https://files.pythonhosted.org/packages/cd/cc/4c8d0e225b559a3fae6092ec310d7150d3b02b4669e9223f783ef64d82c0/ruff-0.6.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d72b8b3abf8a2d51b7b9944a41307d2f442558ccb3859bbd87e6ae9be1694a5d", size = 10295634 }, + { url = "https://files.pythonhosted.org/packages/db/96/d2699cfb1bb5a01c68122af43454c76c31331e1c8a9bd97d653d7c82524b/ruff-0.6.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2aed7e243be68487aa8982e91c6e260982d00da3f38955873aecd5a9204b1d66", size = 11024941 }, + { url = "https://files.pythonhosted.org/packages/8b/a9/6ecd66af8929e0f2a1ed308a4137f3521789f28f0eb97d32c2ca3aa7000c/ruff-0.6.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d371f7fc9cec83497fe7cf5eaf5b76e22a8efce463de5f775a1826197feb9df8", size = 10606894 }, + { url = "https://files.pythonhosted.org/packages/e4/73/2ee4cd19f44992fedac1cc6db9e3d825966072f6dcbd4032f21cbd063170/ruff-0.6.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8f310d63af08f583363dfb844ba8f9417b558199c58a5999215082036d795a1", size = 11552886 }, + { url = "https://files.pythonhosted.org/packages/60/4c/c0f1cd35ce4a93c54a6bb1ee6934a3a205fa02198dd076678193853ceea1/ruff-0.6.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7db6880c53c56addb8638fe444818183385ec85eeada1d48fc5abe045301b2f1", size = 10264945 }, + { url = "https://files.pythonhosted.org/packages/c4/89/e45c9359b9cdd4245512ea2b9f2bb128a997feaa5f726fc9e8c7a66afadf/ruff-0.6.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1175d39faadd9a50718f478d23bfc1d4da5743f1ab56af81a2b6caf0a2394f23", size = 10100007 }, + { url = "https://files.pythonhosted.org/packages/06/74/0bd4e0a7ed5f6908df87892f9bf60a2356c0fd74102d8097298bd9b4f346/ruff-0.6.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b939f9c86d51635fe486585389f54582f0d65b8238e08c327c1534844b3bb9a", size = 9559267 }, + { url = "https://files.pythonhosted.org/packages/54/03/3dc6dc9419f276f05805bf888c279e3e0b631284abd548d9e87cebb93aec/ruff-0.6.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d0d62ca91219f906caf9b187dea50d17353f15ec9bb15aae4a606cd697b49b4c", size = 9905304 }, + { url = "https://files.pythonhosted.org/packages/5c/5b/d6a72a6a6bbf097c09de468326ef5fa1c9e7aa5e6e45979bc0d984b0dbe7/ruff-0.6.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7438a7288f9d67ed3c8ce4d059e67f7ed65e9fe3aa2ab6f5b4b3610e57e3cb56", size = 10341480 }, + { url = "https://files.pythonhosted.org/packages/79/a9/0f2f21fe15ba537c46598f96aa9ae4a3d4b9ec64926664617ca6a8c772f4/ruff-0.6.2-py3-none-win32.whl", hash = "sha256:279d5f7d86696df5f9549b56b9b6a7f6c72961b619022b5b7999b15db392a4da", size = 7961901 }, + { url = "https://files.pythonhosted.org/packages/b0/80/fff12ffe11853d9f4ea3e5221e6dd2e93640a161c05c9579833e09ad40a7/ruff-0.6.2-py3-none-win_amd64.whl", hash = "sha256:d9f3469c7dd43cd22eb1c3fc16926fb8258d50cb1b216658a07be95dd117b0f2", size = 8783320 }, + { url = "https://files.pythonhosted.org/packages/56/91/577cdd64cce5e74d3f8b5ecb93f29566def569c741eb008aed4f331ef821/ruff-0.6.2-py3-none-win_arm64.whl", hash = "sha256:f28fcd2cd0e02bdf739297516d5643a945cc7caf09bd9bcb4d932540a5ea4fa9", size = 8225886 }, ] [[package]]