From ea79c6d103ee0a64edb3aee51172d4f0cb7de04c Mon Sep 17 00:00:00 2001 From: Javier Ferrer Date: Fri, 10 Jan 2025 10:39:16 +0000 Subject: [PATCH] Revamped config --- pyproject.toml | 6 ++- src/ontoform/steps/disease.py | 2 +- src/ontoform/steps/expression.py | 8 +-- src/ontoform/steps/homologue.py | 17 ------ src/ontoform/steps/openfda.py | 4 +- src/ontoform/steps/target.py | 35 ++++++++----- src/ontoform/transformers/homologue.py | 42 --------------- src/ontoform/transformers/target.py | 67 ++++++++++++++++++------ uv.lock | 72 +++++++++++++------------- 9 files changed, 121 insertions(+), 132 deletions(-) delete mode 100644 src/ontoform/steps/homologue.py delete mode 100644 src/ontoform/transformers/homologue.py diff --git a/pyproject.toml b/pyproject.toml index 1bd3905..7314983 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ontoform" -version = "25.0.0-rc.3" +version = "25.0.0-rc.4" description = "Open Targets pipeline converter tool" readme = "README.md" requires-python = ">=3.12" @@ -21,6 +21,10 @@ ontoform = "ontoform.main:main" requires = ["hatchling"] build-backend = "hatchling.build" +[tool.coverage.report] +omit = ["tests/**"] +exclude_lines = ["pragma: no cover", "if TYPE_CHECKING:"] + [tool.pytest.ini_options] testpaths = ["tests/pis"] diff --git a/src/ontoform/steps/disease.py b/src/ontoform/steps/disease.py index f88b9ac..4e13bbf 100644 --- a/src/ontoform/steps/disease.py +++ b/src/ontoform/steps/disease.py @@ -6,7 +6,7 @@ name='disease', transformations=[ FileTransformation( - src_path='input/ontology-inputs/efo_otar_slim.json', + src_path='input/disease/efo_otar_slim.json', dst_path=lambda _, f: f'output/disease/disease.{stem(f)}', transformer=DiseaseTransformer, ), diff --git a/src/ontoform/steps/expression.py b/src/ontoform/steps/expression.py index 36025f8..959e115 100644 --- a/src/ontoform/steps/expression.py +++ b/src/ontoform/steps/expression.py @@ -6,13 +6,13 @@ name='expression', transformations=[ FileTransformation( - src_path='input/expression-inputs/normal_tissue.tsv.zip', - dst_path='input/expression-inputs/normal_tissue.tsv.gz', + src_path='input/expression/normal_tissue.tsv.zip', + dst_path='intermediate/expression/normal_tissue.tsv.gz', transformer=NormalTissueTransformer, ), FileTransformation( - src_path='input/expression-inputs/map_with_efos.json', - dst_path=lambda _, f: f'input/expression-inputs/tissue-translation-map.{stem(f)}', + src_path='input/expression/map_with_efos.json', + dst_path=lambda _, f: f'intermediate/expression/tissue-translation-map.{stem(f)}', transformer=TissueTransformer, ), ], diff --git a/src/ontoform/steps/homologue.py b/src/ontoform/steps/homologue.py deleted file mode 100644 index c9e3845..0000000 --- a/src/ontoform/steps/homologue.py +++ /dev/null @@ -1,17 +0,0 @@ -from ontoform.file_format import stem -from ontoform.model import GlobTransformation, Step -from ontoform.transformers.homologue import HomologueTransformer - -homologue = Step( - name='homologue', - transformations=[ - GlobTransformation( - src_prefix='input/target-inputs/homologue/gene_dictionary', - dst_path=lambda p, f: f'input/target-inputs/homologue/gene_dictionary/{p.rsplit("/")[-1]}'.replace( - '.json', f'.{stem(f)}' - ), - glob='**/*.json', - transformer=HomologueTransformer, - ), - ], -) diff --git a/src/ontoform/steps/openfda.py b/src/ontoform/steps/openfda.py index cc96b26..f8fa148 100644 --- a/src/ontoform/steps/openfda.py +++ b/src/ontoform/steps/openfda.py @@ -8,8 +8,8 @@ name='openfda', transformations=[ GlobTransformation( - src_prefix='input/fda-inputs', - dst_path=lambda _, f: f'input/fda-inputs/{uuid4()}.{stem(f)}', + src_prefix='input/openfda', + dst_path=lambda _, f: f'intermediate/openfda/{uuid4()}.{stem(f)}', glob='**/*.zip', transformer=OpenFdaTransformer, ), diff --git a/src/ontoform/steps/target.py b/src/ontoform/steps/target.py index ca30fd4..ac30d60 100644 --- a/src/ontoform/steps/target.py +++ b/src/ontoform/steps/target.py @@ -1,10 +1,11 @@ from ontoform.file_format import stem -from ontoform.model import FileTransformation, Step +from ontoform.model import FileTransformation, GlobTransformation, Step from ontoform.transformers.target import ( EnsemblTransformer, EssentialityMatricesTransformer, GeneIdentifiersTransformer, GnomadTransformer, + HomologueTransformer, SubcellularLocationSSLTransformer, SubcellularLocationTransformer, ) @@ -12,34 +13,42 @@ target = Step( name='expression', transformations=[ + GlobTransformation( + src_prefix='input/target/homologue/gene_dictionary', + dst_path=lambda p, f: f'intermediate/target/homologue/gene_dictionary/{p.rsplit("/")[-1]}'.replace( + '.json', f'.{stem(f)}' + ), + glob='**/*.json', + transformer=HomologueTransformer, + ), FileTransformation( - src_path='input/target-inputs/hpa/subcellular_location.tsv.zip', - dst_path='input/target-inputs/hpa/subcellular_location.tsv.gz', + src_path='input/target/hpa/subcellular_location.tsv.zip', + dst_path='intermediate/target/hpa/subcellular_location.tsv.gz', transformer=SubcellularLocationTransformer, ), FileTransformation( - src_path='input/target-inputs/hpa/subcellular_locations_ssl.tsv', - dst_path=lambda _, f: f'input/target-inputs/hpa/subcellular_locations_ssl.{stem(f)}', + src_path='input/target/hpa/subcellular_locations_ssl.tsv', + dst_path=lambda _, f: f'intermediate/target/hpa/subcellular_locations_ssl.{stem(f)}', transformer=SubcellularLocationSSLTransformer, ), FileTransformation( - src_path='input/target-inputs/project-scores/essentiality_matrices.zip', - dst_path=lambda _, f: f'input/target-inputs/project-scores/04_binaryDepScores.{stem(f)}', + src_path='input/target/project-scores/essentiality_matrices.zip', + dst_path=lambda _, f: f'intermediate/target/project-scores/04_binaryDepScores.{stem(f)}', transformer=EssentialityMatricesTransformer, ), FileTransformation( - src_path='input/target-inputs/project-scores/gene_identifiers_latest.csv.gz', - dst_path=lambda _, f: f'input/target-inputs/project-scores/gene_identifiers_latest.{stem(f)}', + src_path='input/target/project-scores/gene_identifiers_latest.csv.gz', + dst_path=lambda _, f: f'intermediate/target/project-scores/gene_identifiers_latest.{stem(f)}', transformer=GeneIdentifiersTransformer, ), FileTransformation( - src_path='input/target-inputs/ensembl/homo_sapiens.json', - dst_path=lambda _, f: f'input/target-inputs/ensembl/homo_sapiens.{stem(f)}', + src_path='input/target/ensembl/homo_sapiens.json', + dst_path=lambda _, f: f'intermediate/target/ensembl/homo_sapiens.{stem(f)}', transformer=EnsemblTransformer, ), FileTransformation( - src_path='input/target-inputs/gnomad/gnomad.v2.1.1.lof_metrics.by_gene.txt.bgz', - dst_path='input/target-inputs/gnomad/gnomad_lof_by_gene.txt.gz', + src_path='input/target/gnomad/gnomad.v2.1.1.lof_metrics.by_gene.txt.bgz', + dst_path='intermediate/target/gnomad/gnomad_lof_by_gene.txt.gz', transformer=GnomadTransformer, ), ], diff --git a/src/ontoform/transformers/homologue.py b/src/ontoform/transformers/homologue.py deleted file mode 100644 index 678ee94..0000000 --- a/src/ontoform/transformers/homologue.py +++ /dev/null @@ -1,42 +0,0 @@ -import gc -import json -from typing import BinaryIO - -import polars as pl - -from ontoform.file_format import FileFormat, write_format - - -class FilteredJSONDecoder(json.JSONDecoder): - """JSON Decoder that filter keys in the JSON object. - - This decoder calls a hook on each JSON object that filters out keys not in - allowed_keys set. It also processes the root_key, so we can get to the data. - - This saves us a lot of memory and time, and serves as a workaround for the - bug in polars that causes it to crash when loading large JSON objects: - - https://github.com/pola-rs/polars/issues/17677 - """ - - def __init__(self, root_key='genes', allowed_keys=None, *args, **kwargs): - self.root_key = root_key - self.allowed_keys = allowed_keys or {'id', 'name'} - super().__init__(*args, **kwargs, object_hook=self.filter_keys) - - def filter_keys(self, obj: dict) -> dict: - if self.root_key in obj: - return {self.root_key: obj[self.root_key]} - return {k: v for k, v in obj.items() if k in self.allowed_keys} - - -class HomologueTransformer: - def transform(self, src: BinaryIO, dst: BinaryIO, output_format: FileFormat) -> None: - # load the homologues, parse the json with our decoder, then delete from memory - data = json.loads(src.read(), cls=FilteredJSONDecoder) - df = pl.from_dicts(data['genes']) - del data - gc.collect() - - # write the result - write_format(df, dst, output_format) diff --git a/src/ontoform/transformers/target.py b/src/ontoform/transformers/target.py index 353d16c..8f59179 100644 --- a/src/ontoform/transformers/target.py +++ b/src/ontoform/transformers/target.py @@ -1,4 +1,6 @@ +import gc import gzip +import json import zipfile from typing import BinaryIO @@ -9,6 +11,29 @@ from ontoform.schemas.ensembl import schema +class FilteredJSONDecoder(json.JSONDecoder): + """JSON Decoder that filter keys in the JSON object. + + This decoder calls a hook on each JSON object that filters out keys not in + allowed_keys set. It also processes the root_key, so we can get to the data. + + This saves us a lot of memory and time, and serves as a workaround for the + bug in polars that causes it to crash when loading large JSON objects: + + https://github.com/pola-rs/polars/issues/17677 + """ + + def __init__(self, root_key='genes', allowed_keys=None, *args, **kwargs): + self.root_key = root_key + self.allowed_keys = allowed_keys or {'id', 'name'} + super().__init__(*args, **kwargs, object_hook=self.filter_keys) + + def filter_keys(self, obj: dict) -> dict: + if self.root_key in obj: + return {self.root_key: obj[self.root_key]} + return {k: v for k, v in obj.items() if k in self.allowed_keys} + + class SubcellularLocationTransformer: def transform(self, src: BinaryIO, dst: BinaryIO, output_format: FileFormat) -> None: logger.info(f'transforming to gzip, ignoring format argument {output_format.name}') @@ -46,22 +71,20 @@ def transform(self, src: BinaryIO, dst: BinaryIO, output_format: FileFormat) -> .drop('id') .explode('genes') .unnest('genes') - .select( - [ - 'id', - 'biotype', - 'description', - 'end', - 'start', - 'strand', - pl.col('seq_region_name').alias('chromosome'), - pl.col('name').alias('approvedSymbol'), - 'transcripts', - 'SignalP', - pl.col('Uniprot/SPTREMBL').alias('uniprot_trembl'), - pl.col('Uniprot/SWISSPROT').alias('uniprot_swissprot'), - ] - ) + .select([ + 'id', + 'biotype', + 'description', + 'end', + 'start', + 'strand', + pl.col('seq_region_name').alias('chromosome'), + pl.col('name').alias('approvedSymbol'), + 'transcripts', + 'SignalP', + pl.col('Uniprot/SPTREMBL').alias('uniprot_trembl'), + pl.col('Uniprot/SWISSPROT').alias('uniprot_swissprot'), + ]) ) logger.debug(f'transformation complete, writing file to {dst.name}') @@ -74,3 +97,15 @@ def transform(self, src: BinaryIO, dst: BinaryIO, output_format: FileFormat) -> with gzip.open(src) as file: with gzip.open(dst, 'wb') as gzip_file: gzip_file.write(file.read()) + + +class HomologueTransformer: + def transform(self, src: BinaryIO, dst: BinaryIO, output_format: FileFormat) -> None: + # load the homologues, parse the json with our decoder, then delete from memory + data = json.loads(src.read(), cls=FilteredJSONDecoder) + df = pl.from_dicts(data['genes']) + del data + gc.collect() + + # write the result + write_format(df, dst, output_format) diff --git a/uv.lock b/uv.lock index 059091a..b8b996b 100644 --- a/uv.lock +++ b/uv.lock @@ -290,7 +290,7 @@ wheels = [ [[package]] name = "ontoform" -version = "25.0.0rc3" +version = "25.0.0rc4" source = { editable = "." } dependencies = [ { name = "google-cloud-storage" }, @@ -369,16 +369,16 @@ wheels = [ [[package]] name = "protobuf" -version = "5.29.2" +version = "5.29.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/73/4e6295c1420a9d20c9c351db3a36109b4c9aa601916cb7c6871e3196a1ca/protobuf-5.29.2.tar.gz", hash = "sha256:b2cc8e8bb7c9326996f0e160137b0861f1a82162502658df2951209d0cb0309e", size = 424901 } +sdist = { url = "https://files.pythonhosted.org/packages/f7/d1/e0a911544ca9993e0f17ce6d3cc0932752356c1b0a834397f28e63479344/protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620", size = 424945 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/42/6db5387124708d619ffb990a846fb123bee546f52868039f8fa964c5bc54/protobuf-5.29.2-cp310-abi3-win32.whl", hash = "sha256:c12ba8249f5624300cf51c3d0bfe5be71a60c63e4dcf51ffe9a68771d958c851", size = 422697 }, - { url = "https://files.pythonhosted.org/packages/6c/38/2fcc968b377b531882d6ab2ac99b10ca6d00108394f6ff57c2395fb7baff/protobuf-5.29.2-cp310-abi3-win_amd64.whl", hash = "sha256:842de6d9241134a973aab719ab42b008a18a90f9f07f06ba480df268f86432f9", size = 434495 }, - { url = "https://files.pythonhosted.org/packages/cb/26/41debe0f6615fcb7e97672057524687ed86fcd85e3da3f031c30af8f0c51/protobuf-5.29.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a0c53d78383c851bfa97eb42e3703aefdc96d2036a41482ffd55dc5f529466eb", size = 417812 }, - { url = "https://files.pythonhosted.org/packages/e4/20/38fc33b60dcfb380507b99494aebe8c34b68b8ac7d32808c4cebda3f6f6b/protobuf-5.29.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:494229ecd8c9009dd71eda5fd57528395d1eacdf307dbece6c12ad0dd09e912e", size = 319562 }, - { url = "https://files.pythonhosted.org/packages/90/4d/c3d61e698e0e41d926dbff6aa4e57428ab1a6fc3b5e1deaa6c9ec0fd45cf/protobuf-5.29.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:b6b0d416bbbb9d4fbf9d0561dbfc4e324fd522f61f7af0fe0f282ab67b22477e", size = 319662 }, - { url = "https://files.pythonhosted.org/packages/f3/fd/c7924b4c2a1c61b8f4b64edd7a31ffacf63432135a2606f03a2f0d75a750/protobuf-5.29.2-py3-none-any.whl", hash = "sha256:fde4554c0e578a5a0bcc9a276339594848d1e89f9ea47b4427c80e5d72f90181", size = 172539 }, + { url = "https://files.pythonhosted.org/packages/dc/7a/1e38f3cafa022f477ca0f57a1f49962f21ad25850c3ca0acd3b9d0091518/protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888", size = 422708 }, + { url = "https://files.pythonhosted.org/packages/61/fa/aae8e10512b83de633f2646506a6d835b151edf4b30d18d73afd01447253/protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a", size = 434508 }, + { url = "https://files.pythonhosted.org/packages/dd/04/3eaedc2ba17a088961d0e3bd396eac764450f431621b58a04ce898acd126/protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e", size = 417825 }, + { url = "https://files.pythonhosted.org/packages/4f/06/7c467744d23c3979ce250397e26d8ad8eeb2bea7b18ca12ad58313c1b8d5/protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84", size = 319573 }, + { url = "https://files.pythonhosted.org/packages/a8/45/2ebbde52ad2be18d3675b6bee50e68cd73c9e0654de77d595540b5129df8/protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f", size = 319672 }, + { url = "https://files.pythonhosted.org/packages/fd/b2/ab07b09e0f6d143dfb839693aa05765257bceaa13d03bf1a696b78323e7a/protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f", size = 172550 }, ] [[package]] @@ -404,11 +404,11 @@ wheels = [ [[package]] name = "pygments" -version = "2.18.0" +version = "2.19.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905 } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 }, + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, ] [[package]] @@ -481,27 +481,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.8.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/5d/4b5403f3e89837decfd54c51bea7f94b7d3fae77e08858603d0e04d7ad17/ruff-0.8.5.tar.gz", hash = "sha256:1098d36f69831f7ff2a1da3e6407d5fbd6dfa2559e4f74ff2d260c5588900317", size = 3454835 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/73/f8/03391745a703ce11678eb37c48ae89ec60396ea821e9d0bcea7c8e88fd91/ruff-0.8.5-py3-none-linux_armv6l.whl", hash = "sha256:5ad11a5e3868a73ca1fa4727fe7e33735ea78b416313f4368c504dbeb69c0f88", size = 10626889 }, - { url = "https://files.pythonhosted.org/packages/55/74/83bb74a44183b904216f3edfb9995b89830c83aaa6ce84627f74da0e0cf8/ruff-0.8.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f69ab37771ea7e0715fead8624ec42996d101269a96e31f4d31be6fc33aa19b7", size = 10398233 }, - { url = "https://files.pythonhosted.org/packages/e8/7a/a162a4feb3ef85d594527165e366dde09d7a1e534186ff4ba5d127eda850/ruff-0.8.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b5462d7804558ccff9c08fe8cbf6c14b7efe67404316696a2dde48297b1925bb", size = 10001843 }, - { url = "https://files.pythonhosted.org/packages/e7/9f/5ee5dcd135411402e35b6ec6a8dfdadbd31c5cd1c36a624d356a38d76090/ruff-0.8.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d56de7220a35607f9fe59f8a6d018e14504f7b71d784d980835e20fc0611cd50", size = 10872507 }, - { url = "https://files.pythonhosted.org/packages/b6/67/db2df2dd4a34b602d7f6ebb1b3744c8157f0d3579973ffc58309c9c272e8/ruff-0.8.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9d99cf80b0429cbebf31cbbf6f24f05a29706f0437c40413d950e67e2d4faca4", size = 10377200 }, - { url = "https://files.pythonhosted.org/packages/fe/ff/fe3a6a73006bced73e60d171d154a82430f61d97e787f511a24bd6302611/ruff-0.8.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b75ac29715ac60d554a049dbb0ef3b55259076181c3369d79466cb130eb5afd", size = 11433155 }, - { url = "https://files.pythonhosted.org/packages/e3/95/c1d1a1fe36658c1f3e1b47e1cd5f688b72d5786695b9e621c2c38399a95e/ruff-0.8.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c9d526a62c9eda211b38463528768fd0ada25dad524cb33c0e99fcff1c67b5dc", size = 12139227 }, - { url = "https://files.pythonhosted.org/packages/1b/fe/644b70d473a27b5112ac7a3428edcc1ce0db775c301ff11aa146f71886e0/ruff-0.8.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:587c5e95007612c26509f30acc506c874dab4c4abbacd0357400bd1aa799931b", size = 11697941 }, - { url = "https://files.pythonhosted.org/packages/00/39/4f83e517ec173e16a47c6d102cd22a1aaebe80e1208a1f2e83ab9a0e4134/ruff-0.8.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:622b82bf3429ff0e346835ec213aec0a04d9730480cbffbb6ad9372014e31bbd", size = 12967686 }, - { url = "https://files.pythonhosted.org/packages/1a/f6/52a2973ff108d74b5da706a573379eea160bece098f7cfa3f35dc4622710/ruff-0.8.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f99be814d77a5dac8a8957104bdd8c359e85c86b0ee0e38dca447cb1095f70fb", size = 11253788 }, - { url = "https://files.pythonhosted.org/packages/ce/1f/3b30f3c65b1303cb8e268ec3b046b77ab21ed8e26921cfc7e8232aa57f2c/ruff-0.8.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c01c048f9c3385e0fd7822ad0fd519afb282af9cf1778f3580e540629df89725", size = 10860360 }, - { url = "https://files.pythonhosted.org/packages/a5/a8/2a3ea6bacead963f7aeeba0c61815d9b27b0d638e6a74984aa5cc5d27733/ruff-0.8.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7512e8cb038db7f5db6aae0e24735ff9ea03bb0ed6ae2ce534e9baa23c1dc9ea", size = 10457922 }, - { url = "https://files.pythonhosted.org/packages/17/47/8f9514b670969aab57c5fc826fb500a16aee8feac1bcf8a91358f153a5ba/ruff-0.8.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:762f113232acd5b768d6b875d16aad6b00082add40ec91c927f0673a8ec4ede8", size = 10958347 }, - { url = "https://files.pythonhosted.org/packages/0d/d6/78a9af8209ad99541816d74f01ce678fc01ebb3f37dd7ab8966646dcd92b/ruff-0.8.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:03a90200c5dfff49e4c967b405f27fdfa81594cbb7c5ff5609e42d7fe9680da5", size = 11328882 }, - { url = "https://files.pythonhosted.org/packages/54/77/5c8072ec7afdfdf42c7a4019044486a2b6c85ee73617f8875ec94b977fed/ruff-0.8.5-py3-none-win32.whl", hash = "sha256:8710ffd57bdaa6690cbf6ecff19884b8629ec2a2a2a2f783aa94b1cc795139ed", size = 8802515 }, - { url = "https://files.pythonhosted.org/packages/bc/b6/47d2b06784de8ae992c45cceb2a30f3f205b3236a629d7ca4c0c134839a2/ruff-0.8.5-py3-none-win_amd64.whl", hash = "sha256:4020d8bf8d3a32325c77af452a9976a9ad6455773bcb94991cf15bd66b347e47", size = 9684231 }, - { url = "https://files.pythonhosted.org/packages/bf/5e/ffee22bf9f9e4b2669d1f0179ae8804584939fb6502b51f2401e26b1e028/ruff-0.8.5-py3-none-win_arm64.whl", hash = "sha256:134ae019ef13e1b060ab7136e7828a6d83ea727ba123381307eb37c6bd5e01cb", size = 9124741 }, +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/75/48/385f276f41e89623a5ea8e4eb9c619a44fdfc2a64849916b3584eca6cb9f/ruff-0.9.0.tar.gz", hash = "sha256:143f68fa5560ecf10fc49878b73cee3eab98b777fcf43b0e62d43d42f5ef9d8b", size = 3489167 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/01/e0885e5519212efc7ab9d868bc39cb9781931c4c6f9b17becafa81193ec4/ruff-0.9.0-py3-none-linux_armv6l.whl", hash = "sha256:949b3513f931741e006cf267bf89611edff04e1f012013424022add3ce78f319", size = 10647069 }, + { url = "https://files.pythonhosted.org/packages/dd/69/510a9a5781dcf84c2ad513c2003936fefc802f39c745d5f2355d77fa45fd/ruff-0.9.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:99fbcb8c7fe94ae1e462ab2a1ef17cb20b25fb6438b9f198b1bcf5207a0a7916", size = 10401936 }, + { url = "https://files.pythonhosted.org/packages/07/9f/37fb86bfdf28c4cbfe94cbcc01fb9ab0cb8128548f243f34d5298b212562/ruff-0.9.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:0b022afd8eb0fcfce1e0adec84322abf4d6ce3cd285b3b99c4f17aae7decf749", size = 10010347 }, + { url = "https://files.pythonhosted.org/packages/30/0d/b95121f53c7f7bfb7ba427a35d25f983ed3b476620c5cd69f45caa5b294e/ruff-0.9.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:336567ce92c9ca8ec62780d07b5fa11fbc881dc7bb40958f93a7d621e7ab4589", size = 10882152 }, + { url = "https://files.pythonhosted.org/packages/d4/0b/a955cb6b19eb900c4c594707ab72132ce2d5cd8b5565137fb8fed21b8f08/ruff-0.9.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d338336c44bda602dc8e8766836ac0441e5b0dfeac3af1bd311a97ebaf087a75", size = 10405502 }, + { url = "https://files.pythonhosted.org/packages/1e/fa/9a6c70af74f20edd2519b89eb3322f4bfa399315cf306383443700f2d6b6/ruff-0.9.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9b3ececf523d733e90b540e7afcc0494189e8999847f8855747acd5a9a8c45f", size = 11465069 }, + { url = "https://files.pythonhosted.org/packages/ee/8b/7effac8915470da496be009fe861060baff2692f92801976b2c01cdc8c54/ruff-0.9.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a11c0872a31232e473e2e0e2107f3d294dbadd2f83fb281c3eb1c22a24866924", size = 12176850 }, + { url = "https://files.pythonhosted.org/packages/bd/ed/626179786889eca47b1e821c1582622ac0c1c8f01d60ac974f8b96867a57/ruff-0.9.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5fd06220c17a9cc0dc7fc6552f2ac4db74e8e8bff9c401d160ac59d00566f54", size = 11700963 }, + { url = "https://files.pythonhosted.org/packages/75/79/094c34ddec47fd3c61a0bc5e83ca164344c592949cff91f05961fd40922e/ruff-0.9.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0457e775c74bf3976243f910805242b7dcd389e1d440deccbd1194ca17a5728c", size = 13096560 }, + { url = "https://files.pythonhosted.org/packages/e7/23/ec85dca0dcb329835197401734501bfa1d39e72343df64628c67b72bcbf5/ruff-0.9.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05415599bbcb318f730ea1b46a39e4fbf71f6a63fdbfa1dda92efb55f19d7ecf", size = 11278658 }, + { url = "https://files.pythonhosted.org/packages/6c/17/1b3ea5f06578ea1daa08ac35f9de099d1827eea6e116a8cabbf11235c925/ruff-0.9.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fbf9864b009e43cfc1c8bed1a6a4c529156913105780af4141ca4342148517f5", size = 10879847 }, + { url = "https://files.pythonhosted.org/packages/a6/e5/00bc97d6f419da03c0d898e95cca77311494e7274dc7cc17d94976e32e52/ruff-0.9.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:37b3da222b12e2bb2ce628e02586ab4846b1ed7f31f42a5a0683b213453b2d49", size = 10494220 }, + { url = "https://files.pythonhosted.org/packages/cc/70/d0a23d94f3e40b7ffac0e5506f33bb504672569173781a6c7cab0db6a4ba/ruff-0.9.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:733c0fcf2eb0c90055100b4ed1af9c9d87305b901a8feb6a0451fa53ed88199d", size = 11004182 }, + { url = "https://files.pythonhosted.org/packages/20/8e/367cf8e401890f823d0e4eb33635d0113719d5660b6522b7295376dd95fd/ruff-0.9.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8221a454bfe5ccdf8017512fd6bb60e6ec30f9ea252b8a80e5b73619f6c3cefd", size = 11345761 }, + { url = "https://files.pythonhosted.org/packages/fe/08/4b54e02da73060ebc29368ab15868613f7d2496bde3b01d284d5423646bc/ruff-0.9.0-py3-none-win32.whl", hash = "sha256:d345f2178afd192c7991ddee59155c58145e12ad81310b509bd2e25c5b0247b3", size = 8807005 }, + { url = "https://files.pythonhosted.org/packages/a1/a7/0b422971e897c51bf805f998d75bcfe5d4d858f5002203832875fc91b733/ruff-0.9.0-py3-none-win_amd64.whl", hash = "sha256:0cbc0905d94d21305872f7f8224e30f4bbcd532bc21b2225b2446d8fc7220d19", size = 9689974 }, + { url = "https://files.pythonhosted.org/packages/73/0e/c00f66731e514be3299801b1d9d54efae0abfe8f00a5c14155f2ab9e2920/ruff-0.9.0-py3-none-win_arm64.whl", hash = "sha256:7b1148771c6ca88f820d761350a053a5794bc58e0867739ea93eb5e41ad978cd", size = 9147729 }, ] [[package]] @@ -530,11 +530,11 @@ wheels = [ [[package]] name = "types-setuptools" -version = "75.6.0.20241223" +version = "75.8.0.20250110" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/48/a89068ef20e3bbb559457faf0fd3c18df6df5df73b4b48ebf466974e1f54/types_setuptools-75.6.0.20241223.tar.gz", hash = "sha256:d9478a985057ed48a994c707f548e55aababa85fe1c9b212f43ab5a1fffd3211", size = 48063 } +sdist = { url = "https://files.pythonhosted.org/packages/f7/42/5713e90d4f9683f2301d900f33e4fc2405ad8ac224dda30f6cb7f4cd215b/types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271", size = 48185 } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/2f/051d5d23711209d4077d95c62fa8ef6119df7298635e3a929e50376219d1/types_setuptools-75.6.0.20241223-py3-none-any.whl", hash = "sha256:7cbfd3bf2944f88bbcdd321b86ddd878232a277be95d44c78a53585d78ebc2f6", size = 71377 }, + { url = "https://files.pythonhosted.org/packages/cf/a3/dbfd106751b11c728cec21cc62cbfe7ff7391b935c4b6e8f0bdc2e6fd541/types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480", size = 71521 }, ] [[package]]