diff --git a/changelog.md b/changelog.md index 1fac5576d..a6e2e70de 100644 --- a/changelog.md +++ b/changelog.md @@ -8,6 +8,7 @@ - Switch from Poetry to `uv`. - Drop support for Python 3.8. - Mark Python 3.13-dev tests as stable. +- Remove dependency on `regex`. ## [4.8.3 (2024-05-25)](https://github.com/kdeldycke/click-extra/compare/v4.8.2...v4.8.3) diff --git a/click_extra/colorize.py b/click_extra/colorize.py index a52610d66..f132e1915 100644 --- a/click_extra/colorize.py +++ b/click_extra/colorize.py @@ -29,7 +29,6 @@ import click import cloup -import regex as re3 from boltons.strutils import complement_int_list, int_ranges_from_int_list from cloup._util import identity from cloup.styling import Color, IStyle @@ -805,7 +804,7 @@ def getvalue(self) -> str: def highlight( - string: str, + content: str, substrings: Iterable[str], styling_method: Callable, ignore_case: bool = False, @@ -813,29 +812,47 @@ def highlight( """Highlights parts of the ``string`` that matches ``substrings``. Takes care of overlapping parts within the ``string``. + + ..todo: + Same as the ``ignore_case`` parameter, should we support case-folding? + As in "Straße" => "Strasse"? Beware, it messes with string length and + characters index... """ # Ranges of character indices flagged for highlighting. ranges = set() + # Search for occurrences of query parts in original string. for part in set(substrings): - # Search for occurrences of query parts in original string. - flags = re3.IGNORECASE if ignore_case else 0 + # Reduce the matching space to the lower-case realm. + searched_content = content + if ignore_case: + lower_part = part.lower() + assert len(part) == len( + lower_part + ), "Lowering case is messing with string length" + part = lower_part + searched_content = content.lower() + assert len(content) == len( + searched_content + ), "Lowering case is messing with string length" + # Lookahead assertion which is going to give the starting position of each overlapping match. + pattern = rf"(?={re.escape(part)})" ranges |= { - f"{match.start()}-{match.end() - 1}" - for match in re3.finditer(part, string, flags=flags, overlapped=True) + f"{match.start()}-{match.start() + len(part) - 1}" + for match in re.finditer(pattern, searched_content) } # Reduce ranges, compute complement ranges, transform them to list of integers. range_arg = ",".join(ranges) highlight_ranges = int_ranges_from_int_list(range_arg) untouched_ranges = int_ranges_from_int_list( - complement_int_list(range_arg, range_end=len(string)), + complement_int_list(range_arg, range_end=len(content)), ) # Apply style to range of characters flagged as matching. styled_str = "" for i, j in sorted(highlight_ranges + untouched_ranges): - segment = getitem(string, slice(i, j + 1)) + segment = getitem(content, slice(i, j + 1)) if (i, j) in highlight_ranges: segment = styling_method(segment) styled_str += str(segment) diff --git a/pyproject.toml b/pyproject.toml index 917b98300..b86c506f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -76,9 +76,6 @@ dependencies = [ "commentjson ~= 0.9.0", "mergedeep ~= 1.3.4", "pyyaml ~= 6.0.0", - # regex is required for case-insensitive matches in Unicode. - # v2023.3.22 is the first to drop Python 3.7. - "regex ~= 2024.4.16", # requests 2.28.2 is the first version to support charset_normalizer 3.x. "requests ~= 2.32.3", # tabulate 0.9 is the first to add `*grid` and `*outline` formats. diff --git a/tests/test_colorize.py b/tests/test_colorize.py index 174f917d5..3b0c35e5e 100644 --- a/tests/test_colorize.py +++ b/tests/test_colorize.py @@ -696,67 +696,121 @@ def command1(ctx): @pytest.mark.parametrize( - ("substrings", "expected", "ignore_case"), + ("original", "substrings", "expected", "ignore_case"), ( # Function input types. - (["hey"], "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", False), - (("hey",), "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", False), - ({"hey"}, "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", False), ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", + ["hey"], + "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", + False, + ), + ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", + ("hey",), + "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", + False, + ), + ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", + {"hey"}, + "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", + False, + ), + ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", "hey", "H\x1b[32mey\x1b[0m-xx-xxx-\x1b[32mhe\x1b[0mY-xXxXxxxxx-\x1b[32mhey\x1b[0m", False, ), # Duplicate substrings. - (["hey", "hey"], "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", False), - (("hey", "hey"), "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", False), - ({"hey", "hey"}, "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", False), ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", + ["hey", "hey"], + "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", + False, + ), + ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", + ("hey", "hey"), + "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", + False, + ), + ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", + {"hey", "hey"}, + "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", + False, + ), + ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", "heyhey", "H\x1b[32mey\x1b[0m-xx-xxx-\x1b[32mhe\x1b[0mY-xXxXxxxxx-\x1b[32mhey\x1b[0m", False, ), # Case-sensitivity and multiple matches. - (["hey"], "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", False), ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", + ["hey"], + "Hey-xx-xxx-heY-xXxXxxxxx-\x1b[32mhey\x1b[0m", + False, + ), + ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", ["Hey"], "\x1b[32mHey\x1b[0m-xx-xxx-\x1b[32mheY\x1b[0m-xXxXxxxxx-\x1b[32mhey\x1b[0m", True, ), ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", "x", "Hey-\x1b[32mxx\x1b[0m-\x1b[32mxxx\x1b[0m-heY-\x1b[32mx\x1b[0mX\x1b[32mx\x1b[0mX\x1b[32mxxxxx\x1b[0m-hey", False, ), ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", "x", "Hey-\x1b[32mxx\x1b[0m-\x1b[32mxxx\x1b[0m-heY-\x1b[32mxXxXxxxxx\x1b[0m-hey", True, ), # Overlaps. ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", ["xx"], "Hey-\x1b[32mxx\x1b[0m-\x1b[32mxxx\x1b[0m-heY-\x1b[32mxXxXxxxxx\x1b[0m-hey", True, ), ( + "Hey-xx-xxx-heY-xXxXxxxxx-hey", ["xx"], "Hey-\x1b[32mxx\x1b[0m-\x1b[32mxxx\x1b[0m-heY-xXxX\x1b[32mxxxxx\x1b[0m-hey", False, ), # No match. - ("z", "Hey-xx-xxx-heY-xXxXxxxxx-hey", False), - (["XX"], "Hey-xx-xxx-heY-xXxXxxxxx-hey", False), + ("Hey-xx-xxx-heY-xXxXxxxxx-hey", "z", "Hey-xx-xxx-heY-xXxXxxxxx-hey", False), + ("Hey-xx-xxx-heY-xXxXxxxxx-hey", ["XX"], "Hey-xx-xxx-heY-xXxXxxxxx-hey", False), + # Special characters. + ( + "(?P[']).*?(?P=quote)", + "[", + "(?P\x1b[32m[\x1b[0m']).*?(?P=quote)", + False, + ), + # Unicode normalization. + ("Straße", "ß", "Stra\x1b[32mß\x1b[0me", False), + # ("Straße", ["SS"], "Stra\x1b[32mß\x1b[0me", True), ), ) -def test_substring_highlighting(substrings, expected, ignore_case): - result = highlight( - "Hey-xx-xxx-heY-xXxXxxxxx-hey", - substrings, - styling_method=theme.success, - ignore_case=ignore_case, +def test_substring_highlighting(original, substrings, expected, ignore_case): + assert ( + highlight( + original, + substrings, + styling_method=theme.success, + ignore_case=ignore_case, + ) + == expected ) - assert result == expected @parametrize( diff --git a/uv.lock b/uv.lock index c67aa5f0d..9a547bdd5 100644 --- a/uv.lock +++ b/uv.lock @@ -150,7 +150,6 @@ dependencies = [ { name = "commentjson" }, { name = "mergedeep" }, { name = "pyyaml" }, - { name = "regex" }, { name = "requests" }, { name = "tabulate", extra = ["widechars"] }, { name = "tomli", marker = "python_version < '3.11'" }, @@ -677,76 +676,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/84/4d/82704d1ab9290b03da94e6425f5e87396b999fd7eb8e08f3a92c158402bf/PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", size = 152751 }, ] -[[distribution]] -name = "regex" -version = "2024.4.28" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c0/d6/87709afa2a195ea902810dfaa796d21dd45d91b496dc98828073acbfe5af/regex-2024.4.28.tar.gz", hash = "sha256:83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4", size = 394810 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/f0/3df8e9729dd23843772d99646314bf7956cce5c8715dfb372c2c075c18e3/regex-2024.4.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61", size = 469697 }, - { url = "https://files.pythonhosted.org/packages/97/a1/241a5008b01c7816918d3179e37421c3f8c6b809de66c3ec509982bc32c1/regex-2024.4.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f", size = 281718 }, - { url = "https://files.pythonhosted.org/packages/3e/50/0bdc9ec73b669dd53bdc1c61ebcb35febad5ba009f1ced93e924d756478c/regex-2024.4.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6", size = 278337 }, - { url = "https://files.pythonhosted.org/packages/f0/28/4c475b926bf552802654b7735c2773152adcc2cdcd86211a5cccfe87a4d2/regex-2024.4.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f", size = 774221 }, - { url = "https://files.pythonhosted.org/packages/ea/93/7fb736913787529089481df2d96c3c5d77c71e90af1efdc2fccf77847a19/regex-2024.4.28-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7", size = 815036 }, - { url = "https://files.pythonhosted.org/packages/40/b9/8fa44fa81251862fd6eb6595247e2cfa83136f690f8a2b9da4224ef6dcc0/regex-2024.4.28-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a", size = 800650 }, - { url = "https://files.pythonhosted.org/packages/89/67/0176d9c866e74f803e0492f076aa3ccde13c6b4e37efa08d608e03f61b97/regex-2024.4.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31", size = 774078 }, - { url = "https://files.pythonhosted.org/packages/40/52/25d8d70e2737eca5fd16ea82849f596070395c65f28690db8474fe14be4e/regex-2024.4.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c", size = 763117 }, - { url = "https://files.pythonhosted.org/packages/d2/e9/62c146f8c27f4bd80458ef757bb8fdd03c4729e12b10fe670add8503b662/regex-2024.4.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10", size = 690485 }, - { url = "https://files.pythonhosted.org/packages/5c/65/e5303813c43385272db2aacc319fa2ec4a32eb4ed02c1ee0fb44f9f75546/regex-2024.4.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3", size = 744022 }, - { url = "https://files.pythonhosted.org/packages/63/1f/4ea65d163d8765a78cb594183152ead4251134dd01dc18766232ffebdcab/regex-2024.4.28-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db", size = 731498 }, - { url = "https://files.pythonhosted.org/packages/6e/67/2c2e5751e33af3f637d4b42e9e3e1d6529571adc0ce4ec9bfc0e39bd9f2b/regex-2024.4.28-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e", size = 764155 }, - { url = "https://files.pythonhosted.org/packages/0d/28/c77a47d5d9006dccba0603225fdcc7880aae74ed04eba5cdd3a7ab218363/regex-2024.4.28-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8", size = 768703 }, - { url = "https://files.pythonhosted.org/packages/ab/04/51f63d180ce3884c6f4e1a237004ccce6ed485ce80589a52566013923cc0/regex-2024.4.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea", size = 744829 }, - { url = "https://files.pythonhosted.org/packages/bc/70/6f1f43068b1318bc87f1d0e8d2fe4b12cfc90326837a64d7ff551c524039/regex-2024.4.28-cp310-cp310-win32.whl", hash = "sha256:a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d", size = 257108 }, - { url = "https://files.pythonhosted.org/packages/2a/53/a0ea6e7b8b9a574f7adb47b3a2c65fdc35d1aa1d4cd28dc9b40799a519d4/regex-2024.4.28-cp310-cp310-win_amd64.whl", hash = "sha256:1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1", size = 268962 }, - { url = "https://files.pythonhosted.org/packages/80/9d/a4f1478da769758d55edcbd820eeaf735855a01cabfd132af1676674a843/regex-2024.4.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796", size = 469705 }, - { url = "https://files.pythonhosted.org/packages/9e/4b/950828d604c44c17468a992940c68c40a92dd5dc85e4415dc30f82535b2c/regex-2024.4.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb", size = 281722 }, - { url = "https://files.pythonhosted.org/packages/ac/86/8a1f52664cc21effdd7a0d6a142ffce39f5533be418e5b26d75137f2921b/regex-2024.4.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3", size = 278338 }, - { url = "https://files.pythonhosted.org/packages/60/05/6bd4b4c5a7d1a9f474527f4990bbdb0d8ec7d2b052bddb95b2f52c768ab4/regex-2024.4.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6", size = 783990 }, - { url = "https://files.pythonhosted.org/packages/38/c6/a4045000fed17988b3bb667663ac71c79870272cd235ad7cb19ddb102520/regex-2024.4.28-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a", size = 823568 }, - { url = "https://files.pythonhosted.org/packages/71/fc/40e47a420c60d85625a6eacb05ca8a3dac82e031cf3c3cde1202d006a52d/regex-2024.4.28-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec", size = 810282 }, - { url = "https://files.pythonhosted.org/packages/52/21/22e993e8151c94e9adc9fc5f09848bad538d12c6390cec91f0fb1f6c8ba3/regex-2024.4.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb", size = 785222 }, - { url = "https://files.pythonhosted.org/packages/f3/e6/26cd39158e79ff6a72ceb8d4ac3423d76680936f60ab1818007a15177f8d/regex-2024.4.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636", size = 772943 }, - { url = "https://files.pythonhosted.org/packages/72/c7/fd8caf0c54d5e2d0d80b5b98cb8c7d6127f3ca73cc182b7f4828b7b97317/regex-2024.4.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b", size = 750072 }, - { url = "https://files.pythonhosted.org/packages/79/db/013a00cf9a98f4be0b292770e136c577ba4cee7b926801ea46db52647ca2/regex-2024.4.28-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a", size = 738550 }, - { url = "https://files.pythonhosted.org/packages/55/f4/83085e20d6bf69e05eb6c88ff40e8922fa75a0c1d205a1905f9250716600/regex-2024.4.28-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257", size = 770575 }, - { url = "https://files.pythonhosted.org/packages/ee/de/87df38f8a6a81845e977a25f91b84284d620641aa4de0f79915f14cd2e1f/regex-2024.4.28-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf", size = 776448 }, - { url = "https://files.pythonhosted.org/packages/1b/18/5a9eac44ca44711667094d720a5feb4a52a9f5d5bf571906b7d34751c133/regex-2024.4.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f", size = 753062 }, - { url = "https://files.pythonhosted.org/packages/f2/a5/982d0285de038aba9de7dd4e2696f8d9870c163f18fbe6ce8032c5473c88/regex-2024.4.28-cp311-cp311-win32.whl", hash = "sha256:c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630", size = 257112 }, - { url = "https://files.pythonhosted.org/packages/bd/ad/33a844d35d3be70e01743f27960cf3646da1dbdea050e67dbdae6b843582/regex-2024.4.28-cp311-cp311-win_amd64.whl", hash = "sha256:fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90", size = 268965 }, - { url = "https://files.pythonhosted.org/packages/67/97/74b5acb641c81ab69c32ec28c40c1918cb3e7f4b0fc2356a3c20a3751714/regex-2024.4.28-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5", size = 470731 }, - { url = "https://files.pythonhosted.org/packages/49/04/2499276107a6c585c544e91fc7d711b5c848a68c602bee88317a455715bf/regex-2024.4.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae", size = 282391 }, - { url = "https://files.pythonhosted.org/packages/2f/09/c01e03fae1cf33e4db0973e7ccb861fc529eb20168c7582e9fbe5a84426f/regex-2024.4.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0", size = 278539 }, - { url = "https://files.pythonhosted.org/packages/95/d0/37b1b2330211689b1ed87dfcc1c63d6452d0771c46df36ba207676e2928f/regex-2024.4.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013", size = 786069 }, - { url = "https://files.pythonhosted.org/packages/1b/52/c5f269dacd4e877e064e32cebd9f89e6f5604bc6979d095cef22e2c2750b/regex-2024.4.28-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662", size = 829552 }, - { url = "https://files.pythonhosted.org/packages/fc/47/667123075845bdb331e19bc76d1f51d1617e3e1daf19230810cbeaa491d1/regex-2024.4.28-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc", size = 815000 }, - { url = "https://files.pythonhosted.org/packages/42/b2/a707133b52fa8e77ea89feef5d22cba1828ed1d09f92afdb9e388a979815/regex-2024.4.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c", size = 789261 }, - { url = "https://files.pythonhosted.org/packages/7e/fe/eb28567569d57d63293152097dd16111a9b0bd052019521e3b7e73ba5d42/regex-2024.4.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833", size = 777096 }, - { url = "https://files.pythonhosted.org/packages/f3/5b/2f53618f30594ee21379eeccc66dbada4749ce95d1af23db937aa1fb38fe/regex-2024.4.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd", size = 751430 }, - { url = "https://files.pythonhosted.org/packages/81/9a/10a63196843cedf70147040d3a115605f57431dc0d160fb0b7ff1db5ef8c/regex-2024.4.28-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f", size = 742641 }, - { url = "https://files.pythonhosted.org/packages/f9/7d/a597fc4c9e831f87fd2dc0700e32796d362a1230cb4f8231c9410cdd42a9/regex-2024.4.28-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0", size = 775343 }, - { url = "https://files.pythonhosted.org/packages/9d/39/f705381224c9d05ecbcdcd69aa1f2b3cb216f255128a482ce7d1f95de3a9/regex-2024.4.28-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d", size = 779496 }, - { url = "https://files.pythonhosted.org/packages/1d/e9/9b550ba80c4f4d5692e160060e61329e55197f39028e0cb9f566727b9e62/regex-2024.4.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6", size = 759917 }, - { url = "https://files.pythonhosted.org/packages/e4/36/7ca645b72049ccf94bed27b0bb74643a6c16f1bfb012cec8cd443418fe83/regex-2024.4.28-cp312-cp312-win32.whl", hash = "sha256:7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17", size = 257558 }, - { url = "https://files.pythonhosted.org/packages/23/08/11cafae51a5f608fd134adebf5f7d19bf0af3b2b0cad6086b56116c1e9e3/regex-2024.4.28-cp312-cp312-win_amd64.whl", hash = "sha256:0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82", size = 268453 }, - { url = "https://files.pythonhosted.org/packages/a1/82/171b20582a7aa1292139c206def8204c62852ab1e800d12c79c79db13695/regex-2024.4.28-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b", size = 469702 }, - { url = "https://files.pythonhosted.org/packages/6b/3d/04e3b530f7ca370a7223fd62c53b0f59e3c2ed3a53723f8ed27cba3cb4b4/regex-2024.4.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae", size = 281714 }, - { url = "https://files.pythonhosted.org/packages/49/48/e3c26721f4f3565f41c62af73c0d65624ea18fe21847e4fe605bbe4aed4d/regex-2024.4.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1", size = 278337 }, - { url = "https://files.pythonhosted.org/packages/11/9a/14559385bf4167d32acd879b26cc53f3e665b3e44f78c051c9743651f2d4/regex-2024.4.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1", size = 773670 }, - { url = "https://files.pythonhosted.org/packages/26/3f/31fef80524ff77740dd076ca898c0a8d602591b99748479ecdcfa565cb79/regex-2024.4.28-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947", size = 814496 }, - { url = "https://files.pythonhosted.org/packages/aa/ff/67db7f7a6f8d8075c95b6699ec600067457bdef77c9f1207ac280bde7d7d/regex-2024.4.28-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e", size = 799597 }, - { url = "https://files.pythonhosted.org/packages/f7/ae/db5195107d04272b4e8808640fb4f88dc60f1419795aa846bf3ed9fce63d/regex-2024.4.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b", size = 773481 }, - { url = "https://files.pythonhosted.org/packages/12/13/5a5899729eaa16bdba11b663b5d78dfabbd29adae661ccb428aaf8e8c263/regex-2024.4.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2", size = 762678 }, - { url = "https://files.pythonhosted.org/packages/b4/12/32bf57276e5e7e05b0e11283a999a7ee5b77a69335f0313e21cbdafa2f52/regex-2024.4.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26", size = 689911 }, - { url = "https://files.pythonhosted.org/packages/c0/7e/d19708db4790b0f9c733fdf595a275549338f6a23dd8adea9fe212af0959/regex-2024.4.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d", size = 743764 }, - { url = "https://files.pythonhosted.org/packages/1c/6d/c6eedba1052d6ebbc63675da0e7d9d7c640d8f3242f7865ea151d136e120/regex-2024.4.28-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f", size = 730831 }, - { url = "https://files.pythonhosted.org/packages/c5/60/c55d4d6fefe733909233d13658fcab8ed306f696114df983cd68bdb858d2/regex-2024.4.28-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc", size = 763638 }, - { url = "https://files.pythonhosted.org/packages/b5/82/a3592064f497422020d05ec0fbd0a09fae08ee0ecf2976664258afc66f51/regex-2024.4.28-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a", size = 768243 }, - { url = "https://files.pythonhosted.org/packages/8e/72/264dc147acc5ce1eacc021ff9f2915f7b6b4d8b6c58adc8097a868fd62b6/regex-2024.4.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1", size = 744629 }, - { url = "https://files.pythonhosted.org/packages/ee/20/30bb46ab7ec280189daa08d28fbdce8163d7b9ba5d9c26432b9ddabb0020/regex-2024.4.28-cp39-cp39-win32.whl", hash = "sha256:05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc", size = 257165 }, - { url = "https://files.pythonhosted.org/packages/37/f3/01719ccda3282cb1d1d02d8dd6263454baccce8a313b810fa65cd18653f6/regex-2024.4.28-cp39-cp39-win_amd64.whl", hash = "sha256:3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962", size = 268988 }, -] - [[distribution]] name = "requests" version = "2.32.3"