From 9ed02ae147960ead0250acb7f707d4fe1ba8e53a Mon Sep 17 00:00:00 2001 From: VladYoSlav Date: Tue, 22 Oct 2024 18:50:23 +0300 Subject: [PATCH] feat: stubs for desbordante 2.1.0 --- .github/workflows/lint.yaml | 21 ++ .pre-commit-config.yaml | 33 ++ Makefile | 30 ++ desbordante-stubs/__init__.pyi | 28 ++ desbordante-stubs/ac/algorithms.pyi | 1 + desbordante-stubs/aind/__init__.pyi | 4 + desbordante-stubs/aind/algorithms.pyi | 6 + desbordante-stubs/ar/__init__.pyi | 20 +- desbordante-stubs/ar/algorithms.pyi | 1 + desbordante-stubs/cfd/__init__.pyi | 21 ++ desbordante-stubs/cfd/algorithms.pyi | 21 ++ desbordante-stubs/data_types.pyi | 16 +- desbordante-stubs/dd/__init__.pyi | 8 + desbordante-stubs/dd/algorithms.pyi | 19 + .../dynamic_fd_verification/__init__.pyi | 4 + .../dynamic_fd_verification/algorithms.pyi | 24 ++ desbordante-stubs/fd/algorithms.pyi | 39 +- .../fd_verification/algorithms.pyi | 1 + .../gfd_verification/__init__.pyi | 11 + .../gfd_verification/algorithms.pyi | 34 ++ desbordante-stubs/ind/__init__.pyi | 16 + desbordante-stubs/ind/algorithms.pyi | 45 +++ .../mfd_verification/algorithms.pyi | 1 + desbordante-stubs/od/__init__.pyi | 31 ++ desbordante-stubs/od/algorithms.pyi | 28 ++ desbordante-stubs/pfd/__init__.pyi | 4 + desbordante-stubs/pfd/algorithms.pyi | 5 + desbordante-stubs/statistics/algorithms.pyi | 120 ++++++- desbordante-stubs/ucc/algorithms.pyi | 2 + .../ucc_verification/algorithms.pyi | 2 + poetry.lock | 340 +++++++++++++++++- pyproject.toml | 8 +- 32 files changed, 904 insertions(+), 40 deletions(-) create mode 100644 .github/workflows/lint.yaml create mode 100644 .pre-commit-config.yaml create mode 100644 Makefile create mode 100644 desbordante-stubs/aind/__init__.pyi create mode 100644 desbordante-stubs/aind/algorithms.pyi create mode 100644 desbordante-stubs/cfd/__init__.pyi create mode 100644 desbordante-stubs/cfd/algorithms.pyi create mode 100644 desbordante-stubs/dd/__init__.pyi create mode 100644 desbordante-stubs/dd/algorithms.pyi create mode 100644 desbordante-stubs/dynamic_fd_verification/__init__.pyi create mode 100644 desbordante-stubs/dynamic_fd_verification/algorithms.pyi create mode 100644 desbordante-stubs/gfd_verification/__init__.pyi create mode 100644 desbordante-stubs/gfd_verification/algorithms.pyi create mode 100644 desbordante-stubs/ind/__init__.pyi create mode 100644 desbordante-stubs/ind/algorithms.pyi create mode 100644 desbordante-stubs/od/__init__.pyi create mode 100644 desbordante-stubs/od/algorithms.pyi create mode 100644 desbordante-stubs/pfd/__init__.pyi create mode 100644 desbordante-stubs/pfd/algorithms.pyi diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 0000000..789c510 --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,21 @@ +name: Lint +on: + pull_request: + push: +jobs: + run-linters: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install deps + run: python3 -m pip install poetry==1.8.2 && make init + + - name: Run all linters and formatters + run: make lint \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..0132393 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,33 @@ +fail_fast: true +default_language_version: + python: python3.12 + +ci: + autoupdate_commit_msg: "chore: update pre-commit hooks" + autofix_commit_msg: "style: pre-commit fixes" + skip: [make-format, make-lint] + +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: check-added-large-files + - id: check-case-conflict + - id: check-merge-conflict + - id: check-symlinks + - id: end-of-file-fixer + - id: mixed-line-ending + - id: requirements-txt-fixer + - id: trailing-whitespace + + - repo: local + hooks: + - id: make-format + name: make-format + entry: make format + language: system + + - id: make-lint + name: make-lint + entry: make lint + language: system diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a443a73 --- /dev/null +++ b/Makefile @@ -0,0 +1,30 @@ +.PHONY: init lint format stubs + +## Install dependencies +init: + poetry install + poetry run pre-commit install + +## Run all formatters and linters in project +lint: + poetry run ruff check desbordante-stubs \ + & poetry run ruff format --check desbordante-stubs \ + & poetry run black --check desbordante-stubs + +## Reformat code +format: + poetry run ruff format desbordante-stubs & poetry run ruff check --fix & poetry run black desbordante-stubs + +## Generate stubs +stubs: + pybind11-stubgen desbordante + @if [ -d "desbordante-stubs" ]; then rm -rf desbordante-stubs; fi + @if [ -d "stubs/desbordante" ]; then mv stubs/desbordante desbordante-stubs; fi + rm -rf stubs + make format + + +.DEFAULT_GOAL := help +# See for explanation. +help: + @echo "$$(tput setaf 2)Available rules:$$(tput sgr0)";sed -ne"/^## /{h;s/.*//;:d" -e"H;n;s/^## /---/;td" -e"s/:.*//;G;s/\\n## /===/;s/\\n//g;p;}" ${MAKEFILE_LIST}|awk -F === -v n=$$(tput cols) -v i=4 -v a="$$(tput setaf 6)" -v z="$$(tput sgr0)" '{printf"- %s%s%s\n",a,$$1,z;m=split($$2,w,"---");l=n-i;for(j=1;j<=m;j++){l-=length(w[j])+1;if(l<= 0){l=n-i-length(w[j])-1;}printf"%*s%s\n",-i," ",w[j];}}' diff --git a/desbordante-stubs/__init__.pyi b/desbordante-stubs/__init__.pyi index 4681075..9ec7014 100644 --- a/desbordante-stubs/__init__.pyi +++ b/desbordante-stubs/__init__.pyi @@ -1,15 +1,24 @@ """ A high-performance data profiling library oriented towards exploratory data analysis """ + from __future__ import annotations import typing from . import ac from . import afd +from . import aind from . import ar +from . import cfd from . import data_types +from . import dd +from . import dynamic_fd_verification from . import fd from . import fd_verification +from . import gfd_verification +from . import ind from . import mfd_verification +from . import od +from . import pfd from . import statistics from . import ucc from . import ucc_verification @@ -20,11 +29,21 @@ __all__ = [ "ac", "afd", "afd_verification", + "aind", "ar", + "aucc_verification", + "cfd", "data_types", + "dd", + "dynamic_fd_verification", "fd", "fd_verification", + "gfd_verification", + "ind", "mfd_verification", + "od", + "od_module", + "pfd", "statistics", "ucc", "ucc_verification", @@ -35,10 +54,12 @@ class Algorithm: """ Process data. """ + def get_description(self, option_name: str) -> str: """ Get description of an option. """ + def get_needed_options(self) -> set[str]: """ Get names of options the algorithm requires to be set at the moment. @@ -47,22 +68,27 @@ class Algorithm: algorithms' options using keyword arguments of the load_data and execute methods. """ + def get_option_type(self, option_name: str) -> tuple: """ Get info about the option's type. """ + def get_opts(self) -> dict[str, typing.Any]: """ Get option values represented as the closest Python type """ + def get_possible_options(self) -> set[str]: """ Get names of options the algorithm may request. """ + def load_data(self, **kwargs) -> None: """ Load data for execution """ + def set_option(self, option_name: str, option_value: typing.Any = None) -> None: """ Set option value. Passing None means setting the default value. @@ -76,3 +102,5 @@ class ConfigurationError(ValueError): pass afd_verification = fd_verification +aucc_verification = ucc_verification +od_module = od diff --git a/desbordante-stubs/ac/algorithms.pyi b/desbordante-stubs/ac/algorithms.pyi index dfece20..a623d1a 100644 --- a/desbordante-stubs/ac/algorithms.pyi +++ b/desbordante-stubs/ac/algorithms.pyi @@ -16,6 +16,7 @@ class AcAlgorithm(desbordante.Algorithm): iterations_limit: limit for iterations of sampling ac_seed: seed, needed for choosing a data sample """ + def __init__(self) -> None: ... def get_ac_exceptions(self) -> list[desbordante.ac.ACException]: ... def get_ac_ranges(self) -> list[desbordante.ac.ACRanges]: ... diff --git a/desbordante-stubs/aind/__init__.pyi b/desbordante-stubs/aind/__init__.pyi new file mode 100644 index 0000000..ca5863a --- /dev/null +++ b/desbordante-stubs/aind/__init__.pyi @@ -0,0 +1,4 @@ +from __future__ import annotations +from . import algorithms + +__all__ = ["algorithms"] diff --git a/desbordante-stubs/aind/algorithms.pyi b/desbordante-stubs/aind/algorithms.pyi new file mode 100644 index 0000000..65388d8 --- /dev/null +++ b/desbordante-stubs/aind/algorithms.pyi @@ -0,0 +1,6 @@ +from __future__ import annotations +from desbordante.ind.algorithms import Mind +from desbordante.ind.algorithms import Spider +from desbordante.ind.algorithms import Spider as Default + +__all__ = ["Default", "Mind", "Spider"] diff --git a/desbordante-stubs/ar/__init__.pyi b/desbordante-stubs/ar/__init__.pyi index faaf4c8..23fc769 100644 --- a/desbordante-stubs/ar/__init__.pyi +++ b/desbordante-stubs/ar/__init__.pyi @@ -2,12 +2,9 @@ from __future__ import annotations import desbordante from . import algorithms -__all__ = ["ArAlgorithm", "AssociativeRule", "algorithms"] +__all__ = ["ARStrings", "ArAlgorithm", "ArIDs", "algorithms"] -class ArAlgorithm(desbordante.Algorithm): - def get_ars(self) -> list[AssociativeRule]: ... - -class AssociativeRule: +class ARStrings: def __str__(self) -> str: ... @property def confidence(self) -> float: ... @@ -15,3 +12,16 @@ class AssociativeRule: def left(self) -> list[str]: ... @property def right(self) -> list[str]: ... + +class ArAlgorithm(desbordante.Algorithm): + def get_ar_ids(self) -> list[ArIDs]: ... + def get_ars(self) -> list[ARStrings]: ... + def get_itemnames(self) -> list[str]: ... + +class ArIDs: + @property + def confidence(self) -> float: ... + @property + def left(self) -> list[int]: ... + @property + def right(self) -> list[int]: ... diff --git a/desbordante-stubs/ar/algorithms.pyi b/desbordante-stubs/ar/algorithms.pyi index 389b691..e783341 100644 --- a/desbordante-stubs/ar/algorithms.pyi +++ b/desbordante-stubs/ar/algorithms.pyi @@ -15,6 +15,7 @@ class Apriori(desbordante.ar.ArAlgorithm): minsup: minimum support value (between 0 and 1) tid_column_index: index of the column where a TID is stored """ + def __init__(self) -> None: ... Default = Apriori diff --git a/desbordante-stubs/cfd/__init__.pyi b/desbordante-stubs/cfd/__init__.pyi new file mode 100644 index 0000000..bca8282 --- /dev/null +++ b/desbordante-stubs/cfd/__init__.pyi @@ -0,0 +1,21 @@ +from __future__ import annotations +import desbordante +from . import algorithms + +__all__ = ["CFD", "CfdAlgorithm", "Item", "algorithms"] + +class CFD: + def __str__(self) -> str: ... + @property + def lhs_items(self) -> list[Item]: ... + @property + def rhs_item(self) -> Item: ... + +class CfdAlgorithm(desbordante.Algorithm): + def get_cfds(self) -> list[CFD]: ... + +class Item: + @property + def attribute(self) -> int: ... + @property + def value(self) -> str | None: ... diff --git a/desbordante-stubs/cfd/algorithms.pyi b/desbordante-stubs/cfd/algorithms.pyi new file mode 100644 index 0000000..a53bed9 --- /dev/null +++ b/desbordante-stubs/cfd/algorithms.pyi @@ -0,0 +1,21 @@ +from __future__ import annotations +import desbordante.cfd + +__all__ = ["Default", "FDFirst"] + +class FDFirst(desbordante.cfd.CfdAlgorithm): + """ + Options: + table: table processed by the algorithm + columns_number: Number of columns in the part of the dataset if you want to use algo not on the full dataset, but on its part + cfd_minsup: minimum support value (integer number between 1 and number of tuples in dataset) + cfd_minconf: cfd minimum confidence value (between 0 and 1) + tuples_number: Number of tuples in the part of the dataset if you want to use algo not on the full dataset, but on its part + cfd_max_lhs: cfd max considered LHS size + cfd_substrategy: CFD lattice traversal strategy to use + [dfs|bfs] + """ + + def __init__(self) -> None: ... + +Default = FDFirst diff --git a/desbordante-stubs/data_types.pyi b/desbordante-stubs/data_types.pyi index 539654c..60ce52a 100644 --- a/desbordante-stubs/data_types.pyi +++ b/desbordante-stubs/data_types.pyi @@ -1,13 +1,21 @@ """ - Contains the types of data supported by Desbordante. +Contains the types of data supported by Desbordante. + +Currently only used as tags for Algorithm.get_option_type - Currently only used as tags for Algorithm.get_option_type - """ + from __future__ import annotations -__all__ = ["Table"] +__all__ = ["ColumnCombination", "Table"] + +class ColumnCombination: + def __str__(self) -> str: ... + @property + def column_indices(self) -> list[int]: ... + @property + def table_index(self) -> int: ... class Table: pass diff --git a/desbordante-stubs/dd/__init__.pyi b/desbordante-stubs/dd/__init__.pyi new file mode 100644 index 0000000..fd18974 --- /dev/null +++ b/desbordante-stubs/dd/__init__.pyi @@ -0,0 +1,8 @@ +from __future__ import annotations +from . import algorithms + +__all__ = ["DD", "algorithms"] + +class DD: + def __repr__(self) -> str: ... + def __str__(self) -> str: ... diff --git a/desbordante-stubs/dd/algorithms.pyi b/desbordante-stubs/dd/algorithms.pyi new file mode 100644 index 0000000..a64a108 --- /dev/null +++ b/desbordante-stubs/dd/algorithms.pyi @@ -0,0 +1,19 @@ +from __future__ import annotations +import desbordante +import desbordante.dd + +__all__ = ["Default", "Split"] + +class Split(desbordante.Algorithm): + """ + Options: + table: table processed by the algorithm + difference_table: CSV table containing difference limits for each column + num_rows: Use only first N rows of the table + num_columns: Use only first N columns of the table + """ + + def __init__(self) -> None: ... + def get_dds(self) -> list[desbordante.dd.DD]: ... + +Default = Split diff --git a/desbordante-stubs/dynamic_fd_verification/__init__.pyi b/desbordante-stubs/dynamic_fd_verification/__init__.pyi new file mode 100644 index 0000000..ca5863a --- /dev/null +++ b/desbordante-stubs/dynamic_fd_verification/__init__.pyi @@ -0,0 +1,4 @@ +from __future__ import annotations +from . import algorithms + +__all__ = ["algorithms"] diff --git a/desbordante-stubs/dynamic_fd_verification/algorithms.pyi b/desbordante-stubs/dynamic_fd_verification/algorithms.pyi new file mode 100644 index 0000000..218e893 --- /dev/null +++ b/desbordante-stubs/dynamic_fd_verification/algorithms.pyi @@ -0,0 +1,24 @@ +from __future__ import annotations +import desbordante +import desbordante.fd_verification + +__all__ = ["Default", "DynamicFDVerifier"] + +class DynamicFDVerifier(desbordante.Algorithm): + """ + Options: + table: table processed by the algorithm + insert: Rows to be inserted into the table using the insert operation + delete: Rows to be deleted from the table using the delete operation + update: Rows to be replaced in the table using the update operation + lhs_indices: LHS column indices + rhs_indices: RHS column indices + """ + + def __init__(self) -> None: ... + def fd_holds(self) -> bool: ... + def get_error(self) -> float: ... + def get_highlights(self) -> list[desbordante.fd_verification.Highlight]: ... + def get_num_error_clusters(self) -> int: ... + +Default = DynamicFDVerifier diff --git a/desbordante-stubs/fd/algorithms.pyi b/desbordante-stubs/fd/algorithms.pyi index 79ea93c..62a69db 100644 --- a/desbordante-stubs/fd/algorithms.pyi +++ b/desbordante-stubs/fd/algorithms.pyi @@ -11,6 +11,7 @@ __all__ = [ "FastFDs", "FdMine", "HyFD", + "PFDTane", "Pyro", "Tane", ] @@ -18,90 +19,118 @@ __all__ = [ class Aid(desbordante.fd.FdAlgorithm): """ Options: + max_lhs: max considered LHS size table: table processed by the algorithm - is_null_equal_null: specify whether two NULLs should be considered equal """ + def __init__(self) -> None: ... class DFD(desbordante.fd.FdAlgorithm): """ Options: + max_lhs: max considered LHS size table: table processed by the algorithm is_null_equal_null: specify whether two NULLs should be considered equal threads: number of threads to use. If 0, then as many threads are used as the hardware can handle concurrently. """ + def __init__(self) -> None: ... class Depminer(desbordante.fd.FdAlgorithm): """ Options: + max_lhs: max considered LHS size table: table processed by the algorithm is_null_equal_null: specify whether two NULLs should be considered equal """ + def __init__(self) -> None: ... class FDep(desbordante.fd.FdAlgorithm): """ Options: + max_lhs: max considered LHS size table: table processed by the algorithm - is_null_equal_null: specify whether two NULLs should be considered equal """ + def __init__(self) -> None: ... class FUN(desbordante.fd.FdAlgorithm): """ Options: + max_lhs: max considered LHS size table: table processed by the algorithm is_null_equal_null: specify whether two NULLs should be considered equal """ + def __init__(self) -> None: ... class FastFDs(desbordante.fd.FdAlgorithm): """ Options: + max_lhs: max considered LHS size table: table processed by the algorithm is_null_equal_null: specify whether two NULLs should be considered equal - max_lhs: max considered LHS size threads: number of threads to use. If 0, then as many threads are used as the hardware can handle concurrently. """ + def __init__(self) -> None: ... class FdMine(desbordante.fd.FdAlgorithm): """ Options: + max_lhs: max considered LHS size table: table processed by the algorithm is_null_equal_null: specify whether two NULLs should be considered equal """ + def __init__(self) -> None: ... class HyFD(desbordante.fd.FdAlgorithm): """ Options: + max_lhs: max considered LHS size table: table processed by the algorithm is_null_equal_null: specify whether two NULLs should be considered equal """ + def __init__(self) -> None: ... -class Pyro(desbordante.fd.FdAlgorithm): +class PFDTane(desbordante.fd.FdAlgorithm): """ Options: + max_lhs: max considered LHS size table: table processed by the algorithm is_null_equal_null: specify whether two NULLs should be considered equal error: error threshold value for Approximate FD algorithms + error_measure: PFD error measure to use + [per_tuple|per_value] + """ + + def __init__(self) -> None: ... + +class Pyro(desbordante.fd.FdAlgorithm): + """ + Options: max_lhs: max considered LHS size + table: table processed by the algorithm + is_null_equal_null: specify whether two NULLs should be considered equal + error: error threshold value for Approximate FD algorithms threads: number of threads to use. If 0, then as many threads are used as the hardware can handle concurrently. seed: RNG seed """ + def __init__(self) -> None: ... class Tane(desbordante.fd.FdAlgorithm): """ Options: + max_lhs: max considered LHS size table: table processed by the algorithm is_null_equal_null: specify whether two NULLs should be considered equal error: error threshold value for Approximate FD algorithms - max_lhs: max considered LHS size """ + def __init__(self) -> None: ... Default = HyFD diff --git a/desbordante-stubs/fd_verification/algorithms.pyi b/desbordante-stubs/fd_verification/algorithms.pyi index bb011ac..be2904a 100644 --- a/desbordante-stubs/fd_verification/algorithms.pyi +++ b/desbordante-stubs/fd_verification/algorithms.pyi @@ -12,6 +12,7 @@ class FDVerifier(desbordante.Algorithm): lhs_indices: LHS column indices rhs_indices: RHS column indices """ + def __init__(self) -> None: ... def fd_holds(self) -> bool: ... def get_error(self) -> float: ... diff --git a/desbordante-stubs/gfd_verification/__init__.pyi b/desbordante-stubs/gfd_verification/__init__.pyi new file mode 100644 index 0000000..f19d776 --- /dev/null +++ b/desbordante-stubs/gfd_verification/__init__.pyi @@ -0,0 +1,11 @@ +from __future__ import annotations +import desbordante +from . import algorithms + +__all__ = ["Gfd", "GfdAlgorithm", "algorithms"] + +class Gfd: + def __str__(self) -> str: ... + +class GfdAlgorithm(desbordante.Algorithm): + def get_gfds(self) -> list[Gfd]: ... diff --git a/desbordante-stubs/gfd_verification/algorithms.pyi b/desbordante-stubs/gfd_verification/algorithms.pyi new file mode 100644 index 0000000..021c967 --- /dev/null +++ b/desbordante-stubs/gfd_verification/algorithms.pyi @@ -0,0 +1,34 @@ +from __future__ import annotations +import desbordante.gfd_verification + +__all__ = ["Default", "EGfdValid", "GfdValid", "NaiveGfdValid"] + +class EGfdValid(desbordante.gfd_verification.GfdAlgorithm): + """ + Options: + gfd: Path to file with GFD + graph: Path to dot-file with graph + """ + + def __init__(self) -> None: ... + +class GfdValid(desbordante.gfd_verification.GfdAlgorithm): + """ + Options: + gfd: Path to file with GFD + graph: Path to dot-file with graph + threads: number of threads to use. If 0, then as many threads are used as the hardware can handle concurrently. + """ + + def __init__(self) -> None: ... + +class NaiveGfdValid(desbordante.gfd_verification.GfdAlgorithm): + """ + Options: + gfd: Path to file with GFD + graph: Path to dot-file with graph + """ + + def __init__(self) -> None: ... + +Default = GfdValid diff --git a/desbordante-stubs/ind/__init__.pyi b/desbordante-stubs/ind/__init__.pyi new file mode 100644 index 0000000..1c920d2 --- /dev/null +++ b/desbordante-stubs/ind/__init__.pyi @@ -0,0 +1,16 @@ +from __future__ import annotations +import desbordante +import desbordante.data_types +from . import algorithms + +__all__ = ["IND", "IndAlgorithm", "algorithms"] + +class IND: + def __str__(self) -> str: ... + def get_lhs(self) -> desbordante.data_types.ColumnCombination: ... + def get_rhs(self) -> desbordante.data_types.ColumnCombination: ... + def to_long_string(self) -> str: ... + def to_short_string(self) -> str: ... + +class IndAlgorithm(desbordante.Algorithm): + def get_inds(self) -> list[IND]: ... diff --git a/desbordante-stubs/ind/algorithms.pyi b/desbordante-stubs/ind/algorithms.pyi new file mode 100644 index 0000000..0dcb90f --- /dev/null +++ b/desbordante-stubs/ind/algorithms.pyi @@ -0,0 +1,45 @@ +from __future__ import annotations +import desbordante.ind + +__all__ = ["Default", "Faida", "Mind", "Spider"] + +class Faida(desbordante.ind.IndAlgorithm): + """ + Options: + tables: table collection processed by the algorithm + max_arity: max considered arity + sample_size: Size of a table sample. Greater value - more correct answers, but higher memory consumption. + Applies to all tables + ignore_constant_cols: Ignore INDs which contain columns filled with only one value. May increase performance but impacts the result. [true|false] + hll_accuracy: HyperLogLog approximation accuracy. Must be positive + Closer to 0 - higher accuracy, more memory needed and slower the algorithm. + + ignore_null_cols: Ignore INDs which contain columns filled only with NULLs. May increase performance but impacts the result. [true|false] + threads: number of threads to use. If 0, then as many threads are used as the hardware can handle concurrently. + """ + + def __init__(self) -> None: ... + +class Mind(desbordante.ind.IndAlgorithm): + """ + Options: + tables: table collection processed by the algorithm + error: error threshold value for Approximate FD algorithms + max_arity: max considered arity + """ + + def __init__(self) -> None: ... + +class Spider(desbordante.ind.IndAlgorithm): + """ + Options: + tables: table collection processed by the algorithm + error: error threshold value for Approximate FD algorithms + is_null_equal_null: specify whether two NULLs should be considered equal + threads: number of threads to use. If 0, then as many threads are used as the hardware can handle concurrently. + mem_limit: memory limit im MBs + """ + + def __init__(self) -> None: ... + +Default = Spider diff --git a/desbordante-stubs/mfd_verification/algorithms.pyi b/desbordante-stubs/mfd_verification/algorithms.pyi index 7c29511..57c136e 100644 --- a/desbordante-stubs/mfd_verification/algorithms.pyi +++ b/desbordante-stubs/mfd_verification/algorithms.pyi @@ -19,6 +19,7 @@ class MetricVerifier(desbordante.Algorithm): metric: metric to use [euclidean|levenshtein|cosine] """ + def __init__(self) -> None: ... def get_highlights(self) -> list[list[desbordante.mfd_verification.Highlight]]: ... def mfd_holds(self) -> bool: ... diff --git a/desbordante-stubs/od/__init__.pyi b/desbordante-stubs/od/__init__.pyi new file mode 100644 index 0000000..27073bf --- /dev/null +++ b/desbordante-stubs/od/__init__.pyi @@ -0,0 +1,31 @@ +from __future__ import annotations +from . import algorithms + +__all__ = [ + "AscCanonicalOD", + "DescCanonicalOD", + "ListOD", + "SimpleCanonicalOD", + "algorithms", +] + +class AscCanonicalOD: + def __eq__(self, arg0: AscCanonicalOD) -> bool: ... + def __hash__(self) -> int: ... + def __str__(self) -> str: ... + +class DescCanonicalOD: + def __eq__(self, arg0: DescCanonicalOD) -> bool: ... + def __hash__(self) -> int: ... + def __str__(self) -> str: ... + +class ListOD: + @property + def lhs(self) -> list[int]: ... + @property + def rhs(self) -> list[int]: ... + +class SimpleCanonicalOD: + def __eq__(self, arg0: SimpleCanonicalOD) -> bool: ... + def __hash__(self) -> int: ... + def __str__(self) -> str: ... diff --git a/desbordante-stubs/od/algorithms.pyi b/desbordante-stubs/od/algorithms.pyi new file mode 100644 index 0000000..6bb52d8 --- /dev/null +++ b/desbordante-stubs/od/algorithms.pyi @@ -0,0 +1,28 @@ +from __future__ import annotations +import desbordante +import desbordante.od + +__all__ = ["Default", "Fastod", "Order"] + +class Fastod(desbordante.Algorithm): + """ + Options: + table: table processed by the algorithm + time_limit: max running time of the algorithm. Pass 0 to remove limit + """ + + def __init__(self) -> None: ... + def get_asc_ods(self) -> list[desbordante.od.AscCanonicalOD]: ... + def get_desc_ods(self) -> list[desbordante.od.DescCanonicalOD]: ... + def get_simple_ods(self) -> list[desbordante.od.SimpleCanonicalOD]: ... + +class Order(desbordante.Algorithm): + """ + Options: + table: table processed by the algorithm + """ + + def __init__(self) -> None: ... + def get_list_ods(self) -> list[desbordante.od.ListOD]: ... + +Default = Order diff --git a/desbordante-stubs/pfd/__init__.pyi b/desbordante-stubs/pfd/__init__.pyi new file mode 100644 index 0000000..ca5863a --- /dev/null +++ b/desbordante-stubs/pfd/__init__.pyi @@ -0,0 +1,4 @@ +from __future__ import annotations +from . import algorithms + +__all__ = ["algorithms"] diff --git a/desbordante-stubs/pfd/algorithms.pyi b/desbordante-stubs/pfd/algorithms.pyi new file mode 100644 index 0000000..b2aaa99 --- /dev/null +++ b/desbordante-stubs/pfd/algorithms.pyi @@ -0,0 +1,5 @@ +from __future__ import annotations +from desbordante.fd.algorithms import PFDTane as Default +from desbordante.fd.algorithms import PFDTane + +__all__ = ["Default", "PFDTane"] diff --git a/desbordante-stubs/statistics/algorithms.pyi b/desbordante-stubs/statistics/algorithms.pyi index 9e5d2d3..de52d0f 100644 --- a/desbordante-stubs/statistics/algorithms.pyi +++ b/desbordante-stubs/statistics/algorithms.pyi @@ -10,111 +10,213 @@ class DataStats(desbordante.Algorithm): is_null_equal_null: specify whether two NULLs should be considered equal threads: number of threads to use. If 0, then as many threads are used as the hardware can handle concurrently. """ + def __init__(self) -> None: ... def get_all_statistics_as_string(self) -> str: ... def get_average(self, index: int) -> float | int | str: """ Returns average value in the column if it's numeric. """ + + def get_avg_number_of_chars(self, index: int) -> float | int | str: + """ + Returns average number of chars in a string column. + """ + def get_columns_with_all_unique_values(self) -> list[int]: """ Get indices of columns where all values are distinct. """ + def get_columns_with_null(self) -> list[int]: """ Get indices of columns which contain null value. """ + def get_corrected_std(self, index: int) -> float | int | str: """ Returns corrected standard deviation of the column if it's numeric. """ + def get_geometric_mean(self, index: int) -> float | int | str: """ Returns geometric mean of numbers in the column if it's numeric. """ + def get_kurtosis(self, index: int) -> float | int | str: """ Returns kurtosis of the column if it's numeric. """ + def get_max(self, index: int) -> float | int | str: """ Returns maximumin value of the column. """ + + def get_max_number_of_chars(self, index: int) -> float | int | str: + """ + Returns the maximal amount of chars in a column. + """ + + def get_max_number_of_words(self, index: int) -> float | int | str: + """ + Returns the maximal amount of words in a column. + """ + def get_mean_ad(self, index: int) -> float | int | str: """ Returns mean absolute deviation of the column if it's numeric. """ + def get_median(self, index: int) -> float | int | str: """ Returns median of the column if it's numeric. """ + def get_median_ad(self, index: int) -> float | int | str: """ Returns meadian absolute deviation of the column if it's numeric. """ + def get_min(self, index: int) -> float | int | str: """ Returns minimum value of the column. """ + + def get_min_number_of_chars(self, index: int) -> float | int | str: + """ + Returns the minimal amount of chars in a column. + """ + + def get_min_number_of_words(self, index: int) -> float | int | str: + """ + Returns the minimal amount of words in a column. + """ + def get_null_columns(self) -> list[int]: """ Get indices of columns with only null values. """ - def get_num_nulls(self, index: int) -> float | int | str: + + def get_num_nulls(self, index: int) -> int: """ Returns number of nulls in the column. """ + + def get_number_of_chars(self, index: int) -> float | int | str: + """ + Returns total number of characters in a string column. + """ + def get_number_of_columns(self) -> int: """ Get number of columns in the table. """ + + def get_number_of_digit_chars(self, index: int) -> float | int | str: + """ + Returns number of digit chars in a string column. + """ + def get_number_of_distinct(self, index: int) -> int: """ Get number of unique values in the column. """ + + def get_number_of_entirely_lowercase_words(self, index: int) -> float | int | str: + """ + Returns the amount of entirely lowercase words in a column. + """ + + def get_number_of_entirely_uppercase_words(self, index: int) -> float | int | str: + """ + Returns the amount of entirely uppercase words in a column. + """ + + def get_number_of_lowercase_chars(self, index: int) -> float | int | str: + """ + Returns number of lowercase chars in a string column. + """ + def get_number_of_negatives(self, index: int) -> float | int | str: """ Returns number of negative numbers in the column if it's numeric. """ + + def get_number_of_non_letter_chars(self, index: int) -> float | int | str: + """ + Returns number of non-letter chars in a string column. + """ + + def get_number_of_uppercase_chars(self, index: int) -> float | int | str: + """ + Returns number of uppercase chars in a string column. + """ + def get_number_of_values(self, index: int) -> int: """ Get number of values in the column. """ + + def get_number_of_words(self, index: int) -> float | int | str: + """ + Returns the total amount of words in a column + """ + def get_number_of_zeros(self, index: int) -> float | int | str: """ Returns number of zeros in the column if it's numeric. """ + def get_quantile( self, part: float, index: int, calc_all: bool = False ) -> float | int | str: """ Returns quantile of the column if its type is comparable. """ + def get_skewness(self, index: int) -> float | int | str: """ Returns skewness of the column if it's numeric. """ + def get_sum(self, index: int) -> float | int | str: """ Returns sum of the column's values if it's numeric. """ + def get_sum_of_squares(self, index: int) -> float | int | str: """ Returns sum of numbers' squares in the column if it's numeric. """ + + def get_top_k_chars(self, index: int, k: int) -> list[str]: + """ + Returns top k most frequent chars in a string column as a vector of chars. + """ + + def get_top_k_words(self, index: int, k: int) -> list[str]: + """ + Returns top k most frequent words in a string column as a vector of strings. + """ + + def get_vocab(self, index: int) -> float | int | str: + """ + Returns all the symbols of the columns as a sorted string. + """ + + def get_words(self, index: int) -> set[str]: + """ + Returns all distinct words of the column as a set of strings. + """ + def is_categorical(self, index: int, quantity: int) -> bool: """ Check if quantity is greater than number of unique values in the column. """ + def show_sample( - self, - start_row: int, - end_row: int, - start_col: int, - end_col: int, - str_len: int = 10, - unsigned_len: int = 5, - double_len: int = 10, + self, start_row: int, end_row: int, start_col: int, end_col: int ) -> list[list[str]]: """ Returns a table slice containing values from rows in the range [start_row, end_row] and columns in the range [start_col, end_col]. Data values are converted to strings. diff --git a/desbordante-stubs/ucc/algorithms.pyi b/desbordante-stubs/ucc/algorithms.pyi index 00b58fb..df18005 100644 --- a/desbordante-stubs/ucc/algorithms.pyi +++ b/desbordante-stubs/ucc/algorithms.pyi @@ -10,6 +10,7 @@ class HyUCC(desbordante.ucc.UccAlgorithm): is_null_equal_null: specify whether two NULLs should be considered equal threads: number of threads to use. If 0, then as many threads are used as the hardware can handle concurrently. """ + def __init__(self) -> None: ... class PyroUCC(desbordante.ucc.UccAlgorithm): @@ -21,6 +22,7 @@ class PyroUCC(desbordante.ucc.UccAlgorithm): max_lhs: max considered LHS size seed: RNG seed """ + def __init__(self) -> None: ... Default = HyUCC diff --git a/desbordante-stubs/ucc_verification/algorithms.pyi b/desbordante-stubs/ucc_verification/algorithms.pyi index 1cf7ea6..47e0de0 100644 --- a/desbordante-stubs/ucc_verification/algorithms.pyi +++ b/desbordante-stubs/ucc_verification/algorithms.pyi @@ -10,8 +10,10 @@ class UccVerifier(desbordante.Algorithm): ucc_indices: column indices for UCC verification is_null_equal_null: specify whether two NULLs should be considered equal """ + def __init__(self) -> None: ... def get_clusters_violating_ucc(self) -> list[list[int]]: ... + def get_error(self) -> float: ... def get_num_clusters_violating_ucc(self) -> int: ... def get_num_rows_violating_ucc(self) -> int: ... def ucc_holds(self) -> bool: ... diff --git a/poetry.lock b/poetry.lock index ee4d1b7..ff5ddea 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,36 +1,344 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "black" +version = "24.10.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.9" +files = [ + {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, + {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, + {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, + {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, + {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, + {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, + {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, + {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, + {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, + {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, + {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, + {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, + {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, + {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, + {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, + {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, + {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, + {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, + {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, + {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, + {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, + {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.10)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "desbordante" -version = "1.1.0" +version = "2.1.0" description = "Science-intensive high-performance data profiler" optional = false python-versions = ">=3.7" files = [ - {file = "desbordante-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6ac9c19ffaefc5a6a85908c47069988d3993f7ef46ff40cf931358959d25395"}, - {file = "desbordante-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01cc9c6733b1894ba04df78d41446a03b0d9bd3f0ce3dce33ae543c897568eb0"}, - {file = "desbordante-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b99c90bea8156d63c5f40a94b48464b26c7da96987f18fb57baeda5558376d"}, - {file = "desbordante-1.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c00db13a79273b66dbcece0fcacc81cb9271993e77725108c4b8e0ed95188eb"}, - {file = "desbordante-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:099f1852522684c0e42e6c8cb7ee32ac1d9bb9d87d1e5863bba81bf36e42d536"}, - {file = "desbordante-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42cbef2c227acd26dfb6bb6209f28a440a6ea0f1f4e770c338e03c19467a948"}, - {file = "desbordante-1.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7075e865b830ca194ed77ba21f8667fb8f87a47a1313ba7cb83f6c506fed05c0"}, - {file = "desbordante-1.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19413ecb9f1215672500ffae4c806bee27a286d83704952085e4dbb37f22aeb3"}, - {file = "desbordante-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:798b12cfd28d7354aec251cae1adf75fa0a5c3a9c757b8a4ab11840a56332b1e"}, - {file = "desbordante-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a69a17ba645e8547564167817628260761ec5ade26d3fbb49112eeddc7813717"}, + {file = "desbordante-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ffc5c1f74bc46085849a9c94e04f3df8b2270a1ea76af9dbf7e1541841b79c6"}, + {file = "desbordante-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2476bcd11bd0db59c5f1351af5de159532c5005dda72a2298e78e22c054962"}, + {file = "desbordante-2.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1d6cbfc08591a01e93ee42812779fb3f1d083bf995d03d49cdddd9bcf0a042"}, + {file = "desbordante-2.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97b2658313545d41809910ea5917608664b421ef281a770271075bc84c3db9b7"}, + {file = "desbordante-2.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8f748fefc79ca58d319d2cbc73c659603b18ce6f7a340e7c9512b6a8d7fb463"}, + {file = "desbordante-2.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fc0fa7fcb413cb1ad98e4c6480d64ec6f5b4eb96640b1bd548718f09f35114b"}, + {file = "desbordante-2.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdc3b2def533abb6dd0268b2b9af6f7ed099320b66e76fea4c74ae51bff02211"}, + {file = "desbordante-2.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08aa74f9f11c499f3137d05e7bb1920fcf494c8cb6b4b8999f7f01bb54e6cb12"}, + {file = "desbordante-2.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc79549db3d5d1a25b3bf8a728c3a9c5eac0460300d4c8b6b402e253e91bb4e9"}, + {file = "desbordante-2.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d40ee1df3e5373a43f36494d108c12ad63d2097d63d266f6c0db8f152e0b2b3"}, +] + +[[package]] +name = "distlib" +version = "0.3.9" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, +] + +[[package]] +name = "filelock" +version = "3.16.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] + +[[package]] +name = "identify" +version = "2.6.1" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, + {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "nodeenv" +version = "1.9.1" +description = "Node.js virtual environment builder" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] + +[[package]] +name = "pre-commit" +version = "4.0.1" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878"}, + {file = "pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + [[package]] name = "pybind11-stubgen" -version = "2.4.2" +version = "2.5.1" description = "PEP 561 type stubs generator for pybind11 modules" optional = false python-versions = "~=3.7" files = [ - {file = "pybind11-stubgen-2.4.2.tar.gz", hash = "sha256:e9bf7ddb06d4aa94a86f390fe72fbd3f66b0b065db2462da0895553049674b1c"}, - {file = "pybind11_stubgen-2.4.2-py3-none-any.whl", hash = "sha256:b1bb42b81162a25abc062c0b5a03ccb60fd89c6124be199e945ea76849cd3421"}, + {file = "pybind11-stubgen-2.5.1.tar.gz", hash = "sha256:4427a67038a00c5ac1637ffa6c65728c67c5b1251ecc23c7704152be0b14cc0b"}, + {file = "pybind11_stubgen-2.5.1-py3-none-any.whl", hash = "sha256:544d49df57da827c8761e7f6ef6bca996df80a33c9fd21c2521d694d4e72fe8d"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "ruff" +version = "0.7.0" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.7.0-py3-none-linux_armv6l.whl", hash = "sha256:0cdf20c2b6ff98e37df47b2b0bd3a34aaa155f59a11182c1303cce79be715628"}, + {file = "ruff-0.7.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:496494d350c7fdeb36ca4ef1c9f21d80d182423718782222c29b3e72b3512737"}, + {file = "ruff-0.7.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:214b88498684e20b6b2b8852c01d50f0651f3cc6118dfa113b4def9f14faaf06"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630fce3fefe9844e91ea5bbf7ceadab4f9981f42b704fae011bb8efcaf5d84be"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:211d877674e9373d4bb0f1c80f97a0201c61bcd1e9d045b6e9726adc42c156aa"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194d6c46c98c73949a106425ed40a576f52291c12bc21399eb8f13a0f7073495"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:82c2579b82b9973a110fab281860403b397c08c403de92de19568f32f7178598"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9af971fe85dcd5eaed8f585ddbc6bdbe8c217fb8fcf510ea6bca5bdfff56040e"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b641c7f16939b7d24b7bfc0be4102c56562a18281f84f635604e8a6989948914"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d71672336e46b34e0c90a790afeac8a31954fd42872c1f6adaea1dff76fd44f9"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ab7d98c7eed355166f367597e513a6c82408df4181a937628dbec79abb2a1fe4"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1eb54986f770f49edb14f71d33312d79e00e629a57387382200b1ef12d6a4ef9"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:dc452ba6f2bb9cf8726a84aa877061a2462afe9ae0ea1d411c53d226661c601d"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4b406c2dce5be9bad59f2de26139a86017a517e6bcd2688da515481c05a2cb11"}, + {file = "ruff-0.7.0-py3-none-win32.whl", hash = "sha256:f6c968509f767776f524a8430426539587d5ec5c662f6addb6aa25bc2e8195ec"}, + {file = "ruff-0.7.0-py3-none-win_amd64.whl", hash = "sha256:ff4aabfbaaba880e85d394603b9e75d32b0693152e16fa659a3064a85df7fce2"}, + {file = "ruff-0.7.0-py3-none-win_arm64.whl", hash = "sha256:10842f69c245e78d6adec7e1db0a7d9ddc2fff0621d730e61657b64fa36f207e"}, + {file = "ruff-0.7.0.tar.gz", hash = "sha256:47a86360cf62d9cd53ebfb0b5eb0e882193fc191c6d717e8bef4462bc3b9ea2b"}, ] +[[package]] +name = "virtualenv" +version = "20.27.0" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.8" +files = [ + {file = "virtualenv-20.27.0-py3-none-any.whl", hash = "sha256:44a72c29cceb0ee08f300b314848c86e57bf8d1f13107a5e671fb9274138d655"}, + {file = "virtualenv-20.27.0.tar.gz", hash = "sha256:2ca56a68ed615b8fe4326d11a0dca5dfbe8fd68510fb6c6349163bed3c15f2b2"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "e2e74bd9c24e336fc11a73eac5200c5dc635d8977582742a0bbae8f249604a3b" +content-hash = "459f9a554e2c8c82e453b17b3b96e6295c555956fe5fb1dd1bce978def22b80b" diff --git a/pyproject.toml b/pyproject.toml index 3a442ca..81837c4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,11 +11,17 @@ packages = [ [tool.poetry.dependencies] python = "^3.11" -desbordante = "^1.1.0" +desbordante = "^2.1.0" [tool.poetry.group.dev.dependencies] pybind11-stubgen = "^2.4.2" +ruff = "^0.7.0" +black = "^24.10.0" +pre-commit = "^4.0.1" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" + +[tool.ruff.lint] +fixable = ["ALL"]