diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 84952f76..0c4573fc 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -22,7 +22,7 @@ If applicable, add screenshots to help explain your problem.
## Context
-Please, complete the following to better understand the system you are using to run MUSE.
+Please, complete the following to better understand the system you are using to run Auto-CORPus.
- Operating system (eg. Windows 10):
- Auto-CORPus version (eg. 1.0.0):
diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml
index 494310d1..02d625ff 100644
--- a/.github/actions/setup/action.yml
+++ b/.github/actions/setup/action.yml
@@ -19,4 +19,4 @@ runs:
- name: Install dependencies
shell: bash
- run: poetry install
+ run: poetry install --all-extras
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 139d7e2d..bce4bcbc 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -20,11 +20,27 @@ jobs:
python-version: ['3.10', '3.11', '3.12', '3.13']
steps:
- uses: actions/checkout@v4
+ with:
+ # Use a custom PAT so the runners can access the private submodule
+ token: ${{ secrets.PAT }}
+ submodules: true
+ - name: Install LibreOffice
+ if: runner.os == 'Linux'
+ run: sudo apt-get update && sudo apt-get install -y libreoffice
- uses: ./.github/actions/setup
with:
python-version: ${{ matrix.python-version }}
+ - name: Install pywin32 on Windows
+ if: runner.os == 'Windows'
+ run: poetry add pywin32
- name: Run tests
- run: poetry run pytest --skip-ci-macos
+ run: poetry run pytest --skip-ci-macos --skip-ci-windows
+ - name: Upload coverage reports to Codecov
+ if: ${{ matrix.os == 'ubuntu-latest' && matrix.python-version == '3.13' && github.event.pull_request.user.login != 'dependabot[bot]' && github.event.pull_request.user.login != 'pre-commit-ci[bot]' }}
+ uses: codecov/codecov-action@v5
+ with:
+ fail_ci_if_error: true
+ token: ${{ secrets.CODECOV_TOKEN }}
- name: Check docs build
run: poetry run mkdocs build
- name: Check types
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 701af14f..9339b9ef 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -7,6 +7,7 @@ on:
jobs:
test:
uses: ./.github/workflows/ci.yml
+ secrets: inherit
build-wheel:
needs: test
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..9635646b
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "tests/data/private"]
+ path = tests/data/private
+ url = ../Auto-CORPus-private-test-data
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 727474dd..588cb6e1 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -21,19 +21,19 @@ repos:
hooks:
- id: check-github-workflows
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.11.9
+ rev: v0.11.12
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
- id: ruff-format
- repo: https://github.com/pre-commit/mirrors-mypy
- rev: v1.15.0
+ rev: v1.16.0
hooks:
- id: mypy
exclude: autocorpus/parse_xml.py
additional_dependencies: [types-beautifulsoup4, types-regex, lxml-stubs, types-tqdm, types-jsonschema]
- repo: https://github.com/igorshubovych/markdownlint-cli
- rev: v0.44.0
+ rev: v0.45.0
hooks:
- id: markdownlint-fix
- repo: https://github.com/codespell-project/codespell
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 77238ed0..01c9715e 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -10,12 +10,12 @@
"request": "launch",
"module": "autocorpus",
"args": [
- "-c",
- "${workspaceFolder}/autocorpus/configs/config_pmc.json",
+ "-b",
+ "PMC",
"-t",
"output",
"-f",
- "${workspaceFolder}/tests/data/PMC/Current/PMC8885717.html"
+ "${workspaceFolder}/tests/data/public/html/PMC/PMC8885717.html"
]
},
{
@@ -24,12 +24,12 @@
"request": "launch",
"module": "autocorpus",
"args": [
- "-c",
- "${workspaceFolder}/autocorpus/configs/config_pmc_pre_oct_2024.json",
+ "-b",
+ "LEGACY_PMC",
"-t",
"output",
"-f",
- "${workspaceFolder}/tests/data/PMC/Pre-Oct-2024/PMC8885717.html"
+ "${workspaceFolder}/tests/data/public/html/LEGACY_PMC/PMC8885717.html"
]
}
]
diff --git a/README.md b/README.md
index 2cfe39c9..949a677b 100644
--- a/README.md
+++ b/README.md
@@ -5,6 +5,7 @@
[](https://www.gnu.org/licenses/gpl-3.0)
[](https://results.pre-commit.ci/latest/github/omicsNLP/Auto-CORPus/main)
[](https://badge.fury.io/py/autocorpus)
+[](https://codecov.io/gh/omicsNLP/Auto-CORPus)
*Requires Python 3.10+*
@@ -21,24 +22,32 @@ The documentation for Auto-CORPus is available on our [GitHub Pages site].
## Installation
-Install with pip
+Install with pip:
```sh
pip install autocorpus
```
+If you want to be able to process PDF files (only available with Auto-CORPus >v1.1.0),
+you will need to install (large!) additional dependencies. To install Auto-CORPUS with
+PDF processing support, run:
+
+```sh
+pip install autocorpus[pdf]
+```
+
## Usage
-Run the below command for a single file example
+You can run Auto-CORPus on a single file like so:
```sh
-auto-corpus -c "autocorpus/configs/config_pmc.json" -t "output" -f "path/to/html/file" -o JSON
+auto-corpus -b PMC -t "output" -f "path/to/html/file" -o JSON
```
-Run the main app for a directory of files example
+Auto-CORPus can also process whole directories:
```sh
-auto-corpus -c "autocorpus/configs/config_pmc.json" -t "output" -f "path/to/directory/of/html/files" -o JSON
+auto-corpus -b PMC -t "output" -f "path/to/directory/of/html/files" -o JSON
```
### Available arguments
@@ -118,12 +127,23 @@ To get started:
1. [Download and install Poetry](https://python-poetry.org/docs/#installation) following the instructions for your OS.
1. Clone this repository and make it your working directory
+1. (Optionally) download private test data for additional regression tests. This uses data which
+ cannot be redistributed publicly (only available to members of the
+ [omicsNLP](https://github.com/omicsNLP) organisation).
+
+ ```sh
+ git submodule update --init
+ ```
+
1. Set up the virtual environment:
```sh
- poetry install
+ poetry install --all-extras
```
+ Note: The `--all-extras` flag is because of the additional dependencies required for
+ analysing extra file types (PDF, Word, Excel, etc).
+
1. Activate the virtual environment (alternatively, ensure any Python-related command is preceded by `poetry run`):
```sh
diff --git a/autocorpus/__main__.py b/autocorpus/__main__.py
index 6d4a4818..9511903b 100644
--- a/autocorpus/__main__.py
+++ b/autocorpus/__main__.py
@@ -7,8 +7,7 @@
from tqdm import tqdm
from . import add_file_logger, logger
-from .autocorpus import Autocorpus
-from .configs.default_config import DefaultConfig
+from .config import DefaultConfig, read_config
from .inputs import read_file_structure
from .run import run_autocorpus
@@ -66,7 +65,7 @@ def main():
# Load the config
if args.config:
- config = Autocorpus.read_config(args.config)
+ config = read_config(args.config)
elif args.default_config:
try:
config = DefaultConfig[args.default_config].load_config()
diff --git a/autocorpus/abbreviation.py b/autocorpus/abbreviation.py
index 9b00ed01..9da8c4ac 100644
--- a/autocorpus/abbreviation.py
+++ b/autocorpus/abbreviation.py
@@ -35,43 +35,27 @@ def _remove_quotes(text: str) -> str:
return re2.sub(r'([(])[\'"\p{Pi}]|[\'"\p{Pf}]([);:])', r"\1\2", text)
-def _is_abbreviation(candidate: str) -> bool:
- r"""Check whether input string is an abbreviation.
+def _is_abbreviation(s: str) -> bool:
+ """Check whether input string is an abbreviation.
- Based on Schwartz&Hearst.
+ To be classified as an abbreviation, a string must be composed exclusively of
+ Unicode letters or digits, optionally separated by dots or hyphens. This sequence
+ must repeat between two and ten times. We exclude strings that are *exclusively*
+ composed of digits or lowercase letters.
- 2 <= len(str) <= 10
- len(tokens) <= 2
- re.search(r'\p{L}', str)
- str[0].isalnum()
-
- and extra:
- if it matches (\p{L}\.?\s?){2,}
- it is a good candidate.
-
- Args:
- candidate: Candidate abbreviation
-
- Returns:
- True if this is a good candidate
+ Adapted from Schwartz & Hearst.
"""
- viable = True
+ # Disallow if exclusively composed of digits
+ if re2.match(r"\p{N}+$", s):
+ return False
- # Broken: See https://github.com/omicsNLP/Auto-CORPus/issues/144
- # if re2.match(r"(\p{L}\.?\s?){2,}", candidate.lstrip()):
- # viable = True
- if len(candidate) < 2 or len(candidate) > 10:
- viable = False
- if len(candidate.split()) > 2:
- viable = False
- if candidate.islower(): # customize function discard all lower case candidate
- viable = False
- if not re2.search(r"\p{L}", candidate): # \p{L} = All Unicode letter
- viable = False
- if not candidate[0].isalnum():
- viable = False
+ # Disallow if exclusively composed of lowercase unicode chars
+ if re2.match(r"\p{Ll}+$", s):
+ return False
- return viable
+ # Should be a repeating sequence of unicode chars or digits, optionally separated
+ # by dots or hyphens. The sequence must repeat between 2 and 10 times.
+ return bool(re2.match(r"([\p{L}\p{N}][\.\-]?){2,10}$", s))
def _get_definition(candidate: str, preceding: str) -> str:
@@ -398,7 +382,7 @@ def _extract_abbreviations(
def _biocify_abbreviations(
- abbreviations: _AbbreviationsDict, file_path: str
+ abbreviations: _AbbreviationsDict, file_path: Path
) -> dict[str, Any]:
passages = []
for short, long in abbreviations.items():
@@ -416,8 +400,8 @@ def _biocify_abbreviations(
"key": "autocorpus_abbreviations.key",
"documents": [
{
- "id": Path(file_path).name.partition(".")[0],
- "inputfile": file_path,
+ "id": file_path.name.partition(".")[0],
+ "inputfile": str(file_path),
"passages": passages,
}
],
@@ -425,7 +409,7 @@ def _biocify_abbreviations(
def get_abbreviations(
- main_text: dict[str, Any], soup: BeautifulSoup, file_path: str
+ main_text: dict[str, Any], soup: BeautifulSoup, file_path: Path
) -> dict[str, Any]:
"""Extract abbreviations from the input main text.
diff --git a/autocorpus/ac_bioc/annotation.py b/autocorpus/ac_bioc/annotation.py
index 1a055fe5..ba5d64e9 100644
--- a/autocorpus/ac_bioc/annotation.py
+++ b/autocorpus/ac_bioc/annotation.py
@@ -3,7 +3,7 @@
from __future__ import annotations
import xml.etree.ElementTree as ET
-from dataclasses import dataclass, field
+from dataclasses import asdict, dataclass, field
from typing import Any
from .location import BioCLocation
@@ -20,19 +20,7 @@ class BioCAnnotation:
infons: dict[str, str] = field(default_factory=dict)
locations: list[BioCLocation] = field(default_factory=list)
- def to_dict(self):
- """Convert the annotation to a dictionary representation.
-
- Returns:
- dict: A dictionary containing the annotation's id, text, offset, length, and infons.
- """
- return {
- "id": self.id,
- "text": self.text,
- "offset": self.offset,
- "length": self.length,
- "infons": self.infons,
- }
+ to_dict = asdict
def to_json(self) -> dict[str, Any]:
"""Convert the annotation to a JSON-serializable dictionary.
diff --git a/autocorpus/ac_bioc/bioctable/cell.py b/autocorpus/ac_bioc/bioctable/cell.py
index 7f241f80..472da42d 100644
--- a/autocorpus/ac_bioc/bioctable/cell.py
+++ b/autocorpus/ac_bioc/bioctable/cell.py
@@ -9,12 +9,3 @@ class BioCTableCell:
cell_id: str = field(default_factory=str)
cell_text: str = field(default_factory=str)
-
- def to_dict(self) -> dict[str, str]:
- """Convert the cell's attributes to a dictionary.
-
- Returns:
- dict[str, str]
- A dictionary containing the cell's ID and text content.
- """
- return {"cell_id": self.cell_id, "cell_text": self.cell_text}
diff --git a/autocorpus/ac_bioc/bioctable/collection.py b/autocorpus/ac_bioc/bioctable/collection.py
index 2f7b87e5..f981777f 100644
--- a/autocorpus/ac_bioc/bioctable/collection.py
+++ b/autocorpus/ac_bioc/bioctable/collection.py
@@ -1,7 +1,6 @@
"""This module defines the BioCTableCollection class."""
from dataclasses import dataclass, field
-from typing import Any
from ...ac_bioc import BioCCollection, BioCDocument
@@ -11,13 +10,3 @@ class BioCTableCollection(BioCCollection):
"""A collection of BioCTableDocument objects extending BioCCollection."""
documents: list[BioCDocument] = field(default_factory=list)
-
- def to_dict(self) -> dict[str, Any]:
- """Convert the BioCTableCollection to a dictionary representation.
-
- Returns:
- dict[str, Any]: A dictionary containing the collection's data, including its documents.
- """
- base = super().to_dict()
- base["documents"] = [doc.to_dict() for doc in self.documents]
- return base
diff --git a/autocorpus/ac_bioc/bioctable/document.py b/autocorpus/ac_bioc/bioctable/document.py
index 45a292d1..e307819f 100644
--- a/autocorpus/ac_bioc/bioctable/document.py
+++ b/autocorpus/ac_bioc/bioctable/document.py
@@ -5,10 +5,8 @@
"""
from dataclasses import dataclass, field
-from typing import Any
from ...ac_bioc import BioCAnnotation, BioCDocument, BioCPassage
-from ...ac_bioc.bioctable.passage import BioCTablePassage
@dataclass
@@ -17,11 +15,3 @@ class BioCTableDocument(BioCDocument):
passages: list[BioCPassage] = field(default_factory=list)
annotations: list[BioCAnnotation] = field(default_factory=list)
-
- def to_dict(self) -> dict[str, Any]:
- """Convert the BioCTableDocument to a dictionary representation."""
- base = super().to_dict()
- base["passages"] = [
- p.to_dict() for p in self.passages if isinstance(p, BioCTablePassage)
- ]
- return base
diff --git a/autocorpus/ac_bioc/bioctable/json.py b/autocorpus/ac_bioc/bioctable/json.py
index facd687b..94860bcb 100644
--- a/autocorpus/ac_bioc/bioctable/json.py
+++ b/autocorpus/ac_bioc/bioctable/json.py
@@ -68,7 +68,6 @@ def default(self, o):
"source": o.source,
"date": o.date,
"key": o.key,
- "version": o.version,
"infons": o.infons,
"documents": [self.default(d) for d in o.documents],
}
diff --git a/autocorpus/ac_bioc/bioctable/passage.py b/autocorpus/ac_bioc/bioctable/passage.py
index ba53266a..51de0de4 100644
--- a/autocorpus/ac_bioc/bioctable/passage.py
+++ b/autocorpus/ac_bioc/bioctable/passage.py
@@ -13,27 +13,3 @@ class BioCTablePassage(BioCPassage):
column_headings: list[BioCTableCell] = field(default_factory=list)
data_section: list[dict[str, Any]] = field(default_factory=list)
-
- def to_dict(self) -> dict[str, Any]:
- """Convert the BioCTablePassage instance to a dictionary.
-
- Returns:
- dict[str, Any]: A dictionary representation of the BioCTablePassage instance,
- including column headings and data sections.
- """
- base = super().to_dict()
- base["column_headings"] = [cell.to_dict() for cell in self.column_headings]
-
- # Convert data_section cells too
- data_section_serialized = []
- for section in self.data_section:
- serialized_section = {
- "table_section_title_1": section.get("table_section_title_1", ""),
- "data_rows": [],
- }
- for row in section["data_rows"]:
- serialized_row = [cell.to_dict() for cell in row]
- serialized_section["data_rows"].append(serialized_row)
- data_section_serialized.append(serialized_section)
- base["data_section"] = data_section_serialized
- return base
diff --git a/autocorpus/ac_bioc/collection.py b/autocorpus/ac_bioc/collection.py
index c6641aaf..63f4a7d1 100644
--- a/autocorpus/ac_bioc/collection.py
+++ b/autocorpus/ac_bioc/collection.py
@@ -8,13 +8,15 @@
import xml.etree.ElementTree as ET
from dataclasses import dataclass, field
-from typing import Any
+
+from dataclasses_json import DataClassJsonMixin, dataclass_json
from .document import BioCDocument
+@dataclass_json
@dataclass
-class BioCCollection:
+class BioCCollection(DataClassJsonMixin):
"""A class representing a BioC collection."""
source: str = field(default_factory=str)
@@ -22,49 +24,6 @@ class BioCCollection:
key: str = field(default_factory=str)
documents: list[BioCDocument] = field(default_factory=list)
infons: dict[str, str] = field(default_factory=dict)
- version: str = field(default="1.0")
-
- def to_dict(self):
- """Convert the BioCCollection instance to a dictionary.
-
- Returns:
- dict: A dictionary representation of the BioCCollection instance.
- """
- return {
- "source": self.source,
- "date": self.date,
- "key": self.key,
- "infons": self.infons,
- "documents": [d.to_dict() for d in self.documents],
- }
-
- def to_json(self) -> dict[str, Any]:
- """Convert the BioCCollection instance to a JSON-compatible dictionary.
-
- Returns:
- dict[str, Any]: A dictionary representation of the BioCCollection instance.
- """
- return self.to_dict()
-
- @classmethod
- def from_json(cls, data: dict[str, Any]) -> BioCCollection:
- """Create a BioCCollection instance from a JSON dictionary.
-
- Args:
- data (dict[str, Any]): A dictionary containing the JSON representation of a BioCCollection.
-
- Returns:
- BioCCollection: An instance of BioCCollection created from the JSON dictionary.
- """
- documents = [BioCDocument.from_dict(d) for d in data.get("documents", [])]
- return cls(
- source=data.get("source", ""),
- date=data.get("date", ""),
- key=data.get("key", ""),
- infons=data.get("infons", {}),
- version=data.get("version", ""),
- documents=documents,
- )
def to_xml(self) -> ET.Element:
"""Convert the BioCCollection instance to an XML element.
diff --git a/autocorpus/ac_bioc/document.py b/autocorpus/ac_bioc/document.py
index e87ee76c..091087e7 100644
--- a/autocorpus/ac_bioc/document.py
+++ b/autocorpus/ac_bioc/document.py
@@ -8,14 +8,17 @@
import xml.etree.ElementTree as ET
from dataclasses import dataclass, field
-from typing import Any
+from dataclasses_json import DataClassJsonMixin, dataclass_json
+
+from .annotation import BioCAnnotation
from .passage import BioCPassage
from .relation import BioCRelation
+@dataclass_json
@dataclass
-class BioCDocument:
+class BioCDocument(DataClassJsonMixin):
"""Represents a BioC document containing passages, annotations, and relations."""
id: str = field(default_factory=str)
@@ -23,44 +26,9 @@ class BioCDocument:
infons: dict[str, str] = field(default_factory=dict)
passages: list[BioCPassage] = field(default_factory=list)
relations: list[BioCRelation] = field(default_factory=list)
-
- def to_dict(self):
- """Convert the BioCDocument instance to a dictionary representation.
-
- Returns:
- dict: A dictionary containing the document's ID, infons, and passages.
- """
- return {
- "id": self.id,
- "infons": self.infons,
- "passages": [p.to_dict() for p in self.passages],
- }
-
- @classmethod
- def from_dict(cls, data: dict[str, Any]) -> BioCDocument:
- """Create a BioCDocument instance from a dictionary.
-
- Args:
- data (dict[str, Any]): A dictionary containing the document's data.
-
- Returns:
- BioCDocument: An instance of BioCDocument created from the dictionary.
- """
- passages = [BioCPassage.from_dict(p) for p in data.get("passages", [])]
- return cls(
- id=data["id"],
- infons=data.get("infons", {}),
- passages=passages,
- relations=data.get("relations", []),
- )
-
- def to_json(self) -> dict[str, Any]:
- """Convert the BioCDocument instance to a JSON-compatible dictionary.
-
- Returns:
- dict[str, Any]: A dictionary representation of the document.
- """
- return self.to_dict()
+ annotations: list[BioCAnnotation] = field(
+ default_factory=list
+ ) # TODO: discuss why this is here in legacy outputs, should it be removed?
def to_xml(self) -> ET.Element:
"""Convert the BioCDocument instance to an XML element.
diff --git a/autocorpus/ac_bioc/json.py b/autocorpus/ac_bioc/json.py
index cbc345ec..13b3908a 100644
--- a/autocorpus/ac_bioc/json.py
+++ b/autocorpus/ac_bioc/json.py
@@ -9,82 +9,19 @@
import json
from typing import Any
-from .annotation import BioCAnnotation
from .collection import BioCCollection
-from .document import BioCDocument
-from .location import BioCLocation
-from .node import BioCNode
-from .passage import BioCPassage
-from .relation import BioCRelation
-from .sentence import BioCSentence
class BioCJSONEncoder(json.JSONEncoder):
"""Custom JSON encoder for BioC-related objects."""
def default(self, o: Any) -> Any:
- """Override the default method to handle BioC-related objects."""
- match o:
- case BioCLocation():
- return {
- "offset": o.offset,
- "length": o.length,
- }
-
- case BioCNode():
- return {
- "refid": o.refid,
- "role": o.role,
- }
- case BioCSentence():
- return {
- "offset": o.offset,
- "infons": o.infons,
- "text": o.text,
- "annotations": [self.default(a) for a in o.annotations],
- "relations": [self.default(r) for r in o.relations],
- }
- case BioCPassage():
- return {
- "offset": o.offset,
- "infons": o.infons,
- "text": o.text,
- "annotations": [self.default(a) for a in o.annotations],
- "relations": [self.default(r) for r in o.relations],
- }
- case BioCDocument():
- return {
- "id": o.id,
- "infons": o.infons,
- "inputfile": o.inputfile,
- "passages": [self.default(p) for p in o.passages],
- "relations": [self.default(r) for r in o.relations],
- }
- case BioCAnnotation():
- return {
- "id": o.id,
- "infons": o.infons,
- "text": o.text,
- "locations": [self.default(loc) for loc in o.locations],
- }
- case BioCRelation():
- return {
- "id": o.id,
- "infons": o.infons,
- "nodes": [self.default(n) for n in o.nodes],
- }
- case BioCCollection():
- return {
- "source": o.source,
- "date": o.date,
- "key": o.key,
- "version": o.version,
- "infons": o.infons,
- "documents": [self.default(d) for d in o.documents],
- }
- case _:
- # Let the base class default method raise the TypeError
- return super().default(o)
+ """Return a serializable object for JSON encoding, using to_dict if available."""
+ if hasattr(o, "to_dict") and callable(o.to_dict):
+ return o.to_dict()
+ if o is None:
+ return None
+ return super().default(o)
class BioCJSON:
diff --git a/autocorpus/ac_bioc/location.py b/autocorpus/ac_bioc/location.py
index ab968d46..9bba4388 100644
--- a/autocorpus/ac_bioc/location.py
+++ b/autocorpus/ac_bioc/location.py
@@ -6,31 +6,23 @@
from __future__ import annotations
import xml.etree.ElementTree as ET
+from dataclasses import asdict, dataclass, field
+@dataclass
class BioCLocation:
"""Represents a location in BioC format."""
- def __init__(self, offset: int, length: int):
- """Initialize a BioCLocation instance.
+ offset: int = field(
+ default_factory=int,
+ metadata={"description": "The offset of the location in the text."},
+ )
+ length: int = field(
+ default_factory=int,
+ metadata={"description": "The length of the location in the text."},
+ )
- Args:
- offset (int): The starting offset of the location.
- length (int): The length of the location.
- """
- self.offset = offset
- self.length = length
-
- def to_dict(self) -> dict[str, int]:
- """Convert the BioCLocation instance to a dictionary.
-
- Returns:
- dict[str, int]: A dictionary representation of the BioCLocation instance.
- """
- return {
- "offset": self.offset,
- "length": self.length,
- }
+ to_dict = asdict
@classmethod
def from_dict(cls, data: dict[str, int]) -> BioCLocation:
diff --git a/autocorpus/ac_bioc/node.py b/autocorpus/ac_bioc/node.py
index cc3c2e26..94da67cd 100644
--- a/autocorpus/ac_bioc/node.py
+++ b/autocorpus/ac_bioc/node.py
@@ -3,9 +3,12 @@
from __future__ import annotations
import xml.etree.ElementTree as ET
-from dataclasses import dataclass, field
+from dataclasses import asdict, dataclass, field
+from dataclasses_json import dataclass_json
+
+@dataclass_json
@dataclass
class BioCNode:
"""Represents a node in a BioC graph with a reference ID and a role."""
@@ -13,12 +16,7 @@ class BioCNode:
refid: str = field(default_factory=str)
role: str = field(default_factory=str)
- def to_dict(self) -> dict[str, str]:
- """Convert the BioCNode instance to a dictionary representation."""
- return {
- "refid": self.refid,
- "role": self.role,
- }
+ to_dict = asdict
@classmethod
def from_dict(cls, data: dict[str, str]) -> BioCNode:
diff --git a/autocorpus/ac_bioc/passage.py b/autocorpus/ac_bioc/passage.py
index fbfa3cbb..c8b23de3 100644
--- a/autocorpus/ac_bioc/passage.py
+++ b/autocorpus/ac_bioc/passage.py
@@ -10,13 +10,20 @@
from dataclasses import dataclass, field
from typing import Any
+from dataclasses_json import DataClassJsonMixin, dataclass_json
+
from .annotation import BioCAnnotation
from .relation import BioCRelation
from .sentence import BioCSentence
+_DEFAULT_KEYS = set(
+ ("section_heading", "subsection_heading", "body", "section_type", "offset")
+)
+
+@dataclass_json
@dataclass
-class BioCPassage:
+class BioCPassage(DataClassJsonMixin):
"""Represents a passage in a BioC document."""
text: str = field(default_factory=str)
@@ -26,40 +33,41 @@ class BioCPassage:
annotations: list[BioCAnnotation] = field(default_factory=list)
relations: list[BioCRelation] = field(default_factory=list)
- def to_dict(self):
- """Convert the BioCPassage instance to a dictionary representation."""
- return {
- "text": self.text,
- "offset": self.offset,
- "infons": self.infons,
- "sentences": [s.to_dict() for s in self.sentences],
- }
-
@classmethod
- def from_dict(cls, data: dict[str, Any]) -> BioCPassage:
- """Create a BioCPassage instance from a dictionary.
+ def from_ac_dict(cls, passage: dict[str, Any]) -> BioCPassage:
+ """Create a BioCPassage from a passage dict and an offset.
Args:
- data (dict[str, Any]): A dictionary containing passage data.
+ passage: dict containing info about passage
Returns:
- BioCPassage: An instance of BioCPassage populated with the provided data.
+ BioCPassage object
"""
- sentences = [BioCSentence.from_dict(s) for s in data.get("sentences", [])]
- return cls(
- text=data.get("text", ""),
- offset=data.get("offset", 0),
- infons=data.get("infons", {}),
- sentences=sentences,
- )
+ infons = {k: v for k, v in passage.items() if k not in _DEFAULT_KEYS}
+ # TODO: Doesn't account for subsubsection headings which might exist
+ if heading := passage.get("section_heading", None):
+ infons["section_title_1"] = heading
+ if subheading := passage.get("subsection_heading", None):
+ infons["section_title_2"] = subheading
+ for i, section_type in enumerate(passage["section_type"]):
+ infons[f"iao_name_{i + 1}"] = section_type["iao_name"]
+ infons[f"iao_id_{i + 1}"] = section_type["iao_id"]
+
+ return cls(offset=passage.get("offset", 0), infons=infons, text=passage["body"])
- def to_json(self) -> dict[str, Any]:
- """Convert the BioCPassage instance to a JSON-compatible dictionary.
+ @classmethod
+ def from_title(cls, title: str, offset: int) -> BioCPassage:
+ """Create a BioCPassage from a title and offset.
+
+ Args:
+ title: Passage title
+ offset: Passage offset
Returns:
- dict[str, Any]: A dictionary representation of the BioCPassage instance.
+ BioCPassage object
"""
- return self.to_dict()
+ infons = {"iao_name_1": "document title", "iao_id_1": "IAO:0000305"}
+ return cls(offset=offset, infons=infons, text=title)
def to_xml(self) -> ET.Element:
"""Convert the BioCPassage instance to an XML element.
diff --git a/autocorpus/ac_bioc/relation.py b/autocorpus/ac_bioc/relation.py
index cae19c13..8b8d0d43 100644
--- a/autocorpus/ac_bioc/relation.py
+++ b/autocorpus/ac_bioc/relation.py
@@ -4,49 +4,20 @@
import xml.etree.ElementTree as ET
from dataclasses import dataclass, field
-from typing import Any
+
+from dataclasses_json import DataClassJsonMixin
from .node import BioCNode
@dataclass
-class BioCRelation:
+class BioCRelation(DataClassJsonMixin):
"""A class representing a BioC relation."""
id: str = field(default_factory=str)
infons: dict[str, str] = field(default_factory=dict)
nodes: list[BioCNode] = field(default_factory=list)
- def to_dict(self) -> dict[str, Any]:
- """Convert the BioCRelation instance to a dictionary.
-
- Returns:
- dict[str, Any]: A dictionary representation of the BioCRelation instance.
- """
- return {
- "id": self.id,
- "infons": self.infons,
- "nodes": [n.to_dict() for n in self.nodes],
- }
-
- @classmethod
- def from_dict(cls, data: dict[str, Any]) -> BioCRelation:
- """Create a BioCRelation instance from a dictionary.
-
- Args:
- data (dict[str, Any]): A dictionary containing the relation data.
-
- Returns:
- BioCRelation: An instance of BioCRelation created from the dictionary.
- """
- from .node import BioCNode # import inside to avoid circular import issues
-
- return cls(
- id=data.get("id", ""),
- infons=data.get("infons", {}),
- nodes=[BioCNode.from_dict(n) for n in data.get("nodes", [])],
- )
-
def to_xml(self) -> ET.Element:
"""Convert the BioCRelation instance to an XML element.
diff --git a/autocorpus/ac_bioc/sentence.py b/autocorpus/ac_bioc/sentence.py
index 3a3a6b56..29e2d6fd 100644
--- a/autocorpus/ac_bioc/sentence.py
+++ b/autocorpus/ac_bioc/sentence.py
@@ -4,14 +4,16 @@
import xml.etree.ElementTree as ET
from dataclasses import dataclass, field
-from typing import Any
+
+from dataclasses_json import DataClassJsonMixin, dataclass_json
from .annotation import BioCAnnotation
from .relation import BioCRelation
+@dataclass_json
@dataclass
-class BioCSentence:
+class BioCSentence(DataClassJsonMixin):
"""Represents a sentence in the BioC format."""
text: str
@@ -20,45 +22,6 @@ class BioCSentence:
annotations: list[BioCAnnotation] = field(default_factory=list)
relations: list[BioCRelation] = field(default_factory=list)
- def to_dict(self):
- """Convert the BioCSentence instance to a dictionary representation.
-
- Returns:
- dict: A dictionary containing the sentence's text, offset, infons, and annotations.
- """
- return {
- "text": self.text,
- "offset": self.offset,
- "infons": self.infons,
- "annotations": [a.to_dict() for a in self.annotations],
- }
-
- @classmethod
- def from_dict(cls, data: dict[str, Any]) -> BioCSentence:
- """Create a BioCSentence instance from a dictionary.
-
- Args:
- data (dict[str, Any]): A dictionary containing sentence data.
-
- Returns:
- BioCSentence: An instance of BioCSentence created from the dictionary.
- """
- annotations = [BioCAnnotation.from_dict(a) for a in data.get("annotations", [])]
- return cls(
- text=data.get("text", ""),
- offset=data.get("offset", 0),
- infons=data.get("infons", {}),
- annotations=annotations,
- )
-
- def to_json(self) -> dict[str, Any]:
- """Convert the BioCSentence instance to a JSON-compatible dictionary.
-
- Returns:
- dict[str, Any]: A dictionary representation of the sentence.
- """
- return self.to_dict()
-
def to_xml(self) -> ET.Element:
"""Convert the BioCSentence instance to an XML element.
diff --git a/autocorpus/autocorpus.py b/autocorpus/autocorpus.py
index 9a0e7045..5314c115 100644
--- a/autocorpus/autocorpus.py
+++ b/autocorpus/autocorpus.py
@@ -1,524 +1,110 @@
-"""Auto-CORPus primary functions are called from this script, after initialisation with __main__.py."""
+"""The Auto-CORPus primary dataclass is defined in this module."""
import json
+from dataclasses import dataclass, field
from pathlib import Path
from typing import Any
-from bs4 import BeautifulSoup
-from marker.converters.pdf import PdfConverter
-from marker.models import create_model_dict
-from marker.output import text_from_rendered
+from autocorpus.ac_bioc.collection import BioCCollection
-from autocorpus.ac_bioc.bioctable.json import BioCTableJSON
-from autocorpus.bioc_supplementary import (
- BioCTableConverter,
- BioCTextConverter,
- extract_table_from_pdf_text,
-)
-
-from . import logger
-from .abbreviation import get_abbreviations
from .ac_bioc import BioCJSON, BioCXML
from .bioc_formatter import get_formatted_bioc_collection
-from .section import get_section
-from .table import get_table_json
-from .utils import handle_not_tables
-
-pdf_converter: PdfConverter | None = None
+@dataclass
class Autocorpus:
- """Parent class for all Auto-CORPus functionality."""
-
- @staticmethod
- def read_config(config_path: str) -> dict[str, Any]:
- """Reads a configuration file and returns its content.
-
- Args:
- config_path (str): The path to the configuration file.
-
- Returns:
- dict: The content of the configuration file.
-
- Raises:
- FileNotFoundError: If the configuration file does not exist.
- json.JSONDecodeError: If the configuration file is not a valid JSON.
- KeyError: If the configuration file does not contain the expected "config" key.
- """
- with open(config_path, encoding="utf-8") as f:
- ## TODO: validate config file here if possible
- content = json.load(f)
- return content["config"]
-
- def __soupify_infile(self, fpath: Path):
- with fpath.open(encoding="utf-8") as fp:
- soup = BeautifulSoup(fp.read(), "html.parser")
- for e in soup.find_all(
- attrs={"style": ["display:none", "visibility:hidden"]}
- ):
- e.extract()
- return soup
-
- def __get_keywords(self, soup, config):
- if "keywords" not in config:
- return {}
-
- responses = handle_not_tables(config["keywords"], soup)
- if not responses:
- return {}
-
- responses = " ".join(x["node"].get_text() for x in responses)
- return {
- "section_heading": "keywords",
- "subsection_heading": "",
- "body": responses,
- "section_type": [{"iao_name": "keywords section", "iao_id": "IAO:0000630"}],
- }
-
- def __get_title(self, soup, config):
- if "title" not in config:
- return ""
+ """Dataclass for a collection of BioC formatted text, tables and abbreviations."""
- titles = handle_not_tables(config["title"], soup)
- if not titles:
- return ""
+ file_path: Path
+ main_text: dict[str, Any]
+ abbreviations: dict[str, Any]
+ tables: dict[str, Any] = field(default_factory=dict)
- return titles[0]["node"].get_text()
-
- def __get_sections(self, soup, config):
- if "sections" not in config:
- return []
-
- return handle_not_tables(config["sections"], soup)
-
- @staticmethod
- def __load_pdf_models():
- global pdf_converter
- if pdf_converter is None:
- try:
- # Load the PDF models
- pdf_converter = PdfConverter(
- artifact_dict=create_model_dict(),
- )
- except Exception as e:
- logger.error(f"Error loading PDF models: {e}")
- # If loading fails, set pdf_converter to None
- pdf_converter = None
-
- @staticmethod
- def __extract_pdf_content(
- file_path: Path,
- ) -> bool:
- """Extracts content from a PDF file.
-
- Args:
- file_path (Path): Path to the PDF file.
+ @property
+ def has_tables(self) -> bool:
+ """Check if the Autocorpus has any tables.
Returns:
- bool: success status of the extraction process.
- """
- bioc_text, bioc_tables = None, None
- global pdf_converter
- Autocorpus.__load_pdf_models()
- if not pdf_converter:
- logger.error("PDF converter not initialized.")
- return False
-
- # extract text from PDF
- rendered = pdf_converter(str(file_path))
- text, _, _ = text_from_rendered(rendered)
- # separate text and tables
- text, tables = extract_table_from_pdf_text(text)
- # format data for BioC
- bioc_text = BioCTextConverter.build_bioc(text, str(file_path), "pdf")
- bioc_tables = BioCTableConverter.build_bioc(tables, str(file_path))
-
- out_filename = str(file_path).replace(".pdf", ".pdf_bioc.json")
- with open(out_filename, "w", encoding="utf-8") as f:
- BioCJSON.dump(bioc_text, f, indent=4)
-
- out_table_filename = str(file_path).replace(".pdf", ".pdf_tables.json")
- with open(out_table_filename, "w", encoding="utf-8") as f:
- BioCTableJSON.dump(bioc_tables, f, indent=4)
- return True
-
- def __extract_text(self, soup, config):
- """Convert beautiful soup object into a python dict object with cleaned main text body.
-
- Args:
- soup (bs4.BeautifulSoup): BeautifulSoup object of html
- config (dict): AC config rules
-
- Return:
- (dict): dict of the maintext
- """
- result = {}
-
- # Tags of text body to be extracted are hard-coded as p (main text) and span (keywords and refs)
- result["title"] = self.__get_title(soup, config)
- maintext = []
- if keywords := self.__get_keywords(soup, config):
- maintext.append(keywords)
- sections = self.__get_sections(soup, config)
- for sec in sections:
- maintext.extend(get_section(config, sec))
-
- # filter out the sections which do not contain any info
- filtered_text = [x for x in maintext if x]
- unique_text = []
- seen_text = []
- for text in filtered_text:
- if text["body"] not in seen_text:
- seen_text.append(text["body"])
- unique_text.append(text)
-
- result["paragraphs"] = self.__set_unknown_section_headings(unique_text)
-
- return result
-
- def __set_unknown_section_headings(self, unique_text):
- paper = {}
- for para in unique_text:
- if para["section_heading"] != "keywords":
- paper[para["section_heading"]] = [
- x["iao_name"] for x in para["section_type"]
- ]
-
- for text in unique_text:
- if not text["section_heading"]:
- text["section_heading"] = "document part"
- text["section_type"] = [
- {"iao_name": "document part", "iao_id": "IAO:0000314"}
- ]
-
- return unique_text
-
- def __process_html_article(self, file: Path):
- soup = self.__soupify_infile(file)
- self.__process_html_tables(file, soup, self.config)
- self.main_text = self.__extract_text(soup, self.config)
- try:
- self.abbreviations = get_abbreviations(self.main_text, soup, str(file))
- except Exception as e:
- logger.error(e)
-
- def __process_html_tables(self, file_path, soup, config):
- """Extract data from tables in the HTML file.
-
- Args:
- file_path (str): path to the main text file
- soup (bs4.BeautifulSoup): soup object
- config (dict): dict of the maintext
- """
- if "tables" not in config:
- return
-
- if not self.tables:
- self.tables, self.empty_tables = get_table_json(soup, config, file_path)
- return
-
- seen_ids = set()
- for tab in self.tables["documents"]:
- if "." in tab["id"]:
- seen_ids.add(tab["id"].split(".")[0])
- else:
- seen_ids.add(tab["id"])
-
- tmp_tables, tmp_empty = get_table_json(soup, config, file_path)
- for tabl in tmp_tables["documents"]:
- if "." in tabl["id"]:
- tabl_id = tabl["id"].split(".")[0]
- tabl_pos = ".".join(tabl["id"].split(".")[1:])
- else:
- tabl_id = tabl["id"]
- tabl_pos = None
- if tabl_id in seen_ids:
- tabl_id = str(len(seen_ids) + 1)
- if tabl_pos:
- tabl["id"] = f"{tabl_id}.{tabl_pos}"
- else:
- tabl["id"] = tabl_id
- seen_ids.add(tabl_id)
- self.tables["documents"].extend(tmp_tables["documents"])
- self.empty_tables.extend(tmp_empty)
-
- def __merge_table_data(self):
- if not self.empty_tables:
- return
-
- documents = self.tables.get("documents", None)
- if not documents:
- return
-
- seen_ids = {}
- for i, table in enumerate(documents):
- if "id" in table:
- seen_ids[str(i)] = f"Table {table['id']}."
-
- for table in self.empty_tables:
- for seenID in seen_ids.keys():
- if not table["title"].startswith(seen_ids[seenID]):
- continue
-
- if "title" in table and not table["title"] == "":
- set_new = False
- for passage in documents[int(seenID)]["passages"]:
- if (
- passage["infons"]["section_type"][0]["section_name"]
- == "table_title"
- ):
- passage["text"] = table["title"]
- set_new = True
- if not set_new:
- documents[int(seenID)]["passages"].append(
- {
- "offset": 0,
- "infons": {
- "section_type": [
- {
- "section_name": "table_title",
- "iao_name": "document title",
- "iao_id": "IAO:0000305",
- }
- ]
- },
- "text": table["title"],
- }
- )
- if "caption" in table and not table["caption"] == "":
- set_new = False
- for passage in documents[int(seenID)]["passages"]:
- if (
- passage["infons"]["section_type"][0]["section_name"]
- == "table_caption"
- ):
- passage["text"] = table["caption"]
- set_new = True
- if not set_new:
- documents[int(seenID)]["passages"].append(
- {
- "offset": 0,
- "infons": {
- "section_type": [
- {
- "section_name": "table_caption",
- "iao_name": "caption",
- "iao_id": "IAO:0000304",
- }
- ]
- },
- "text": table["caption"],
- }
- )
- if "footer" in table and not table["footer"] == "":
- set_new = False
- for passage in documents[int(seenID)]["passages"]:
- if (
- passage["infons"]["section_type"][0]["section_name"]
- == "table_footer"
- ):
- passage["text"] = table["footer"]
- set_new = True
- if not set_new:
- documents[int(seenID)]["passages"].append(
- {
- "offset": 0,
- "infons": {
- "section_type": [
- {
- "section_name": "table_footer",
- "iao_name": "caption",
- "iao_id": "IAO:0000304",
- }
- ]
- },
- "text": table["footer"],
- }
- )
-
- def __process_supplementary_file(self, file: Path):
- match file.suffix:
- case ".html" | ".htm":
- self.__process_html_article(file)
- case ".xml":
- pass
- case ".pdf":
- self.__extract_pdf_content(file)
- case _:
- pass
-
- def process_file(self):
- """Processes the files specified in the configuration.
-
- This method performs the following steps:
- 1. Checks if a valid configuration is loaded. If not, raises a RuntimeError.
- 2. Handles the main text file:
- - Parses the HTML content of the file.
- - Extracts the main text from the parsed HTML.
- - Attempts to extract abbreviations from the main text and HTML content.
- If an error occurs during this process, it prints the error.
- 3. Processes linked tables, if any:
- - Parses the HTML content of each linked table file.
- 4. Merges table data.
- 5. Checks if there are any documents in the tables and sets the `has_tables` attribute accordingly.
-
- Raises:
- RuntimeError: If no valid configuration is loaded.
- """
- if not self.config:
- raise RuntimeError("A valid config file must be loaded.")
- # handle main_text
- if self.file_path:
- soup = self.__soupify_infile(self.file_path)
- self.__process_html_tables(self.file_path, soup, self.config)
- self.main_text = self.__extract_text(soup, self.config)
- try:
- self.abbreviations = get_abbreviations(
- self.main_text, soup, self.file_path
- )
- except Exception as e:
- logger.error(e)
- if self.linked_tables:
- for table_file in self.linked_tables:
- soup = self.__soupify_infile(table_file)
- self.__process_html_tables(table_file, soup, self.config)
- self.__merge_table_data()
- if "documents" in self.tables and not self.tables["documents"] == []:
- self.has_tables = True
-
- def process_files(
- self,
- files: list[Path | str] = [],
- dir_path: Path | str = "",
- linked_tables: list[Path | str] = [],
- ):
- """Processes main text files provided and nested supplementary files.
-
- Raises:
- RuntimeError: If no valid configuration is provided.
- """
- # Either a list of specific files or a directory path must be provided.
- if not (files or dir_path):
- logger.error("No files or directory provided.")
- raise FileNotFoundError("No files or directory provided.")
- #
- if dir_path:
- # Path is the preferred type, users can also provide a string though
- if isinstance(dir_path, str):
- dir_path = Path(dir_path)
- for file in dir_path.iterdir():
- if file.is_file() and file.suffix in [".html", ".htm"]:
- self.__process_html_article(file)
- elif file.is_dir():
- # recursively process all files in the subdirectory
- for sub_file in file.rglob("*"):
- self.__process_supplementary_file(sub_file)
-
- # process any specific files provided
- for specific_file in files:
- # Path is the preferred type, users can also provide a string though
- if isinstance(specific_file, str):
- specific_file = Path(specific_file)
- if specific_file.is_file() and specific_file.suffix in [".html", ".htm"]:
- self.__process_html_article(specific_file)
- else:
- # process any specific files provided
- self.__process_supplementary_file(specific_file)
-
- def __init__(
- self,
- config: dict[str, Any],
- main_text: Path | None = None,
- linked_tables=None,
- ):
- """Utilises the input config file to create valid BioC versions of input HTML journal articles.
-
- Args:
- config (dict): configuration file for the input HTML journal articles
- main_text (Path): path to the main text of the article (HTML files only)
- linked_tables (list): list of linked table file paths to be included in this run (HTML files only)
+ True if there are tables, False otherwise.
"""
- self.file_path = main_text
- self.linked_tables = linked_tables
- self.config = config
- self.main_text = {}
- self.empty_tables = []
- self.tables = {}
- self.abbreviations = {}
- self.has_tables = False
+ return bool(self.tables.get("documents"))
- def to_bioc(self):
+ def to_bioc(self) -> BioCCollection:
"""Get the currently loaded bioc as a dict.
Returns:
- (dict): bioc as a dict
+ bioc as a BioCCollection object
"""
- return get_formatted_bioc_collection(self)
+ return get_formatted_bioc_collection(self.main_text, self.file_path)
- def main_text_to_bioc_json(self):
+ def main_text_to_bioc_json(self) -> str:
"""Get the currently loaded main text as BioC JSON.
Args:
- indent (int): level of indentation
+ indent: level of indentation
Returns:
- (str): main text as BioC JSON
+ main text as BioC JSON
"""
return json.dumps(
- get_formatted_bioc_collection(self), indent=2, ensure_ascii=False
+ get_formatted_bioc_collection(self.main_text, self.file_path),
+ indent=2,
+ ensure_ascii=False,
)
- def main_text_to_bioc_xml(self):
+ def main_text_to_bioc_xml(self) -> str:
"""Get the currently loaded main text as BioC XML.
Returns:
- (str): main text as BioC XML
+ main text as BioC XML
"""
collection = BioCJSON.loads(
json.dumps(
- get_formatted_bioc_collection(self), indent=2, ensure_ascii=False
+ get_formatted_bioc_collection(self.main_text, self.file_path),
+ indent=2,
+ ensure_ascii=False,
)
)
return BioCXML.dumps(collection)
- def tables_to_bioc_json(self, indent=2):
+ def tables_to_bioc_json(self, indent: int = 2) -> str:
"""Get the currently loaded tables as Tables-JSON.
Args:
- indent (int): level of indentation
+ indent: level of indentation
Returns:
- (str): tables as Tables-JSON
+ tables as Tables-JSON
"""
return json.dumps(self.tables, ensure_ascii=False, indent=indent)
- def abbreviations_to_bioc_json(self, indent=2):
+ def abbreviations_to_bioc_json(self, indent: int = 2) -> str:
"""Get the currently loaded abbreviations as BioC JSON.
Args:
- indent (int): level of indentation
+ indent: level of indentation
Returns:
- (str): abbreviations as BioC JSON
+ abbreviations as BioC JSON
"""
return json.dumps(self.abbreviations, ensure_ascii=False, indent=indent)
- def to_json(self, indent=2):
+ def to_json(self, indent: int = 2) -> str:
"""Get the currently loaded AC object as a dict.
Args:
- indent (int): Level of indentation.
+ indent: Level of indentation.
Returns:
- (str): AC object as a JSON string
+ AC object as a JSON string
"""
return json.dumps(self.to_dict(), ensure_ascii=False, indent=indent)
- def to_dict(self):
+ def to_dict(self) -> dict[str, Any]:
"""Get the currently loaded AC object as a dict.
Returns:
- (dict): AC object as a dict
+ AC object as a dict
"""
return {
"main_text": self.main_text,
diff --git a/autocorpus/bioc_documents.py b/autocorpus/bioc_documents.py
deleted file mode 100644
index ee9a4d7d..00000000
--- a/autocorpus/bioc_documents.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""Script for handling construction of BioC documents."""
-
-from pathlib import Path
-from typing import Any
-
-from .bioc_passage import BioCPassage
-
-
-def get_formatted_bioc_document(data_store) -> dict[str, Any]:
- """Constructs the BioC document template using the provided data store.
-
- Args:
- data_store (Autocorpus): Input article data store.
-
- Returns:
- (dict): BioC document complete populated with passages.
- """
- # build document passages
- seen_headings = []
- passages = [BioCPassage.from_title(data_store.main_text["title"], 0).as_dict()]
- offset = 0 # offset for passage start position
- if data_store.main_text["title"] not in seen_headings:
- offset = len(data_store.main_text["title"])
- seen_headings.append(data_store.main_text["title"])
- for passage in data_store.main_text["paragraphs"]:
- passage_obj = BioCPassage.from_dict(passage, offset)
- passages.append(passage_obj.as_dict())
- offset += len(passage["body"])
- if passage["subsection_heading"] not in seen_headings:
- offset += len(passage["subsection_heading"])
- seen_headings.append(passage["subsection_heading"])
- if passage["section_heading"] not in seen_headings:
- offset += len(passage["section_heading"])
- seen_headings.append(passage["section_heading"])
-
- return {
- "id": Path(data_store.file_path).name.split(".")[0],
- "inputfile": data_store.file_path,
- "infons": {},
- "passages": passages,
- "annotations": [],
- "relations": [],
- }
diff --git a/autocorpus/bioc_formatter.py b/autocorpus/bioc_formatter.py
index 4ebb52b4..de84526f 100644
--- a/autocorpus/bioc_formatter.py
+++ b/autocorpus/bioc_formatter.py
@@ -1,25 +1,66 @@
"""Top-level BioC collection builder script."""
from datetime import datetime
+from pathlib import Path
from typing import Any
-from autocorpus.bioc_documents import get_formatted_bioc_document
+from .ac_bioc import BioCCollection, BioCDocument, BioCPassage
-def get_formatted_bioc_collection(input_vals: object) -> dict[str, Any]:
+def get_formatted_bioc_collection(
+ main_text: dict[str, Any],
+ file_path: Path,
+) -> BioCCollection: # TODO: Change return type to ac_bioc.BioCCollection
"""Constructs a BioC collection from input document-level data.
Args:
- input_vals (object): Input document-level data.
+ main_text: Input document-level data.
+ file_path: Path to the input file.
Returns:
- (dict): BioC collection
+ BioC collection
"""
- bioc_collection = {
- "source": "Auto-CORPus (full-text)",
- "date": datetime.today().strftime("%Y%m%d"),
- "key": "autocorpus_fulltext.key",
- "infons": {},
- "documents": [get_formatted_bioc_document(input_vals)],
- }
+ bioc_collection = BioCCollection(
+ date=datetime.today().strftime("%Y%m%d"),
+ documents=[get_formatted_bioc_document(main_text, file_path)],
+ source="Auto-CORPus (full-text)",
+ key="autocorpus_fulltext.key",
+ )
return bioc_collection
+
+
+def get_formatted_bioc_document(
+ main_text: dict[str, Any],
+ file_path: Path,
+) -> BioCDocument: # TODO: Change return type to ac_bioc.BioCDocument
+ """Constructs the BioC document template using the provided data store.
+
+ Args:
+ main_text: Input document-level data.
+ file_path: Path to the input file.
+
+ Returns:
+ BioC document complete populated with passages.
+ """
+ # build document passages
+ seen_headings = []
+ passages = [BioCPassage().from_title(main_text["title"], 0)]
+ offset = 0 # offset for passage start position
+ if main_text["title"] not in seen_headings:
+ offset = len(main_text["title"])
+ seen_headings.append(main_text["title"])
+ for passage in main_text["paragraphs"]:
+ passage["offset"] = offset
+ passage_obj = BioCPassage().from_ac_dict(passage)
+ passages.append(passage_obj)
+ offset += len(passage["body"])
+ if passage["subsection_heading"] not in seen_headings:
+ offset += len(passage["subsection_heading"])
+ seen_headings.append(passage["subsection_heading"])
+ if passage["section_heading"] not in seen_headings:
+ offset += len(passage["section_heading"])
+ seen_headings.append(passage["section_heading"])
+
+ return BioCDocument(
+ id=file_path.name.split(".")[0], inputfile=str(file_path), passages=passages
+ )
diff --git a/autocorpus/bioc_supplementary.py b/autocorpus/bioc_supplementary.py
index 91f5e305..6463ff86 100644
--- a/autocorpus/bioc_supplementary.py
+++ b/autocorpus/bioc_supplementary.py
@@ -1,9 +1,9 @@
"""This module provides functionality for converting text extracted from various file types into a BioC format."""
import datetime
-from typing import TypeVar
+from dataclasses import dataclass
+from typing import TypeVar, cast
-import pandas as pd
import regex
from pandas import DataFrame
@@ -20,6 +20,14 @@
)
+@dataclass
+class WordText:
+ """Represents a text element extracted from a Word document."""
+
+ text: str
+ is_header: bool
+
+
def _split_text_and_tables(text: str) -> tuple[list[str], list[list[str]]]:
"""Splits PDF text into main text lines and raw table lines."""
lines = [x for x in text.splitlines() if x]
@@ -70,7 +78,7 @@ def _parse_tables(raw_tables: list[list[str]]) -> list[DataFrame]:
while len(row) < num_columns:
row.append("")
- df = pd.DataFrame(rows[1:], columns=rows[0])
+ df = DataFrame(rows[1:], columns=rows[0])
parsed_tables.append(df)
return parsed_tables
@@ -202,13 +210,15 @@ class BioCTextConverter:
"""Converts text content into a BioC format for supplementary material processing."""
@staticmethod
- def build_bioc(text: str, input_file: str, file_type: str) -> BioCCollection:
+ def build_bioc(
+ text: str | list[WordText], input_file: str, file_type: str
+ ) -> BioCCollection:
"""Builds a BioCCollection object from the provided text, input file, and file type.
Args:
- text (str): The text content to be converted.
- input_file (str): The path to the input file.
- file_type (str): The type of the input file ('word' or 'pdf').
+ text: The text content to be converted.
+ input_file: The path to the input file.
+ file_type: The type of the input file ('word' or 'pdf').
Returns:
BioCCollection: The constructed BioCCollection object.
@@ -219,31 +229,28 @@ def build_bioc(text: str, input_file: str, file_type: str) -> BioCCollection:
bioc.key = "autocorpus_supplementary.key"
temp_doc = BioCDocument(id="1")
if file_type == "word":
+ text = cast(list[WordText], text)
temp_doc.passages = BioCTextConverter.__identify_word_passages(text)
elif file_type == "pdf":
+ text = cast(str, text)
+ temp_doc.passages = BioCTextConverter.__identify_passages(text)
+ else:
+ text = cast(str, text)
temp_doc.passages = BioCTextConverter.__identify_passages(text)
- temp_doc.passages = BioCTextConverter.__identify_passages(text)
temp_doc.inputfile = input_file
bioc.documents.append(temp_doc)
return bioc
@staticmethod
- def __identify_passages(text):
+ def __identify_passages(text: str | list[str]) -> list[BioCPassage]:
offset = 0
passages = []
- if text is None:
- return passages
if isinstance(text, str):
- text = text.split("\n\n")
+ split_text = text.split("\n\n")
else:
- text = [x.split("\n") for x in text]
- temp = []
- for i in text:
- for t in i:
- temp.append(t)
- text = temp
- text = [x for x in text if x]
- for line in text:
+ split_text = [t for x in text for t in x.split("\n")]
+ split_text = [x for x in split_text if x]
+ for line in split_text:
iao_name = "supplementary material section"
iao_id = "IAO:0000326"
passage = BioCPassage()
@@ -255,21 +262,21 @@ def __identify_passages(text):
return passages
@staticmethod
- def __identify_word_passages(text):
+ def __identify_word_passages(text: list[WordText]) -> list[BioCPassage]:
offset = 0
passages = []
- line, is_header = text
- line = line.replace("\n", "")
- if line.isupper() or is_header:
- iao_name = "document title"
- iao_id = "IAO:0000305"
- else:
- iao_name = "supplementary material section"
- iao_id = "IAO:0000326"
- passage = BioCPassage()
- passage.offset = offset
- passage.infons = {"iao_name_1": iao_name, "iao_id_1": iao_id}
- passage.text = line
- passages.append(passage)
- offset += len(line)
+ for t in text:
+ paragraph = t.text.replace("\n", "")
+ if paragraph.isupper() or t.is_header:
+ iao_name = "document title"
+ iao_id = "IAO:0000305"
+ else:
+ iao_name = "supplementary material section"
+ iao_id = "IAO:0000326"
+ passage = BioCPassage()
+ passage.offset = offset
+ passage.infons = {"iao_name_1": iao_name, "iao_id_1": iao_id}
+ passage.text = paragraph
+ passages.append(passage)
+ offset += len(paragraph)
return passages
diff --git a/autocorpus/configs/default_config.py b/autocorpus/config.py
similarity index 51%
rename from autocorpus/configs/default_config.py
rename to autocorpus/config.py
index 0d5d52e1..dda079c3 100644
--- a/autocorpus/configs/default_config.py
+++ b/autocorpus/config.py
@@ -6,14 +6,34 @@
from typing import Any
+def read_config(config_path: str) -> dict[str, Any]:
+ """Reads a configuration file and returns its contents.
+
+ Args:
+ config_path: The path to the configuration file.
+
+ Returns:
+ dict: The contents of the configuration file.
+
+ Raises:
+ FileNotFoundError: If the configuration file does not exist.
+ json.JSONDecodeError: If the configuration file is not a valid JSON.
+ KeyError: If the configuration file does not contain the expected "config" key.
+ """
+ with open(config_path, encoding="utf-8") as f:
+ ## TODO: validate config file here if possible
+ content = json.load(f)
+ return content["config"]
+
+
class DefaultConfig(Enum):
"""An enumeration representing different configuration files for various datasets.
Attributes:
- LEGACY_PMC (str): Configuration file for legacy PMC data (pre-October 2024).
- PMC (str): Configuration file for current PMC data.
- PLOS_GENETICS (str): Configuration file for PLOS Genetics data.
- NATURE_GENETICS (str): Configuration file for Nature Genetics data.
+ LEGACY_PMC: Configuration file for legacy PMC data (pre-October 2024).
+ PMC: Configuration file for current PMC data.
+ PLOS_GENETICS: Configuration file for PLOS Genetics data.
+ NATURE_GENETICS: Configuration file for Nature Genetics data.
Methods:
load_config():
@@ -27,14 +47,14 @@ class DefaultConfig(Enum):
PLOS_GENETICS = "config_plos_genetics.json"
NATURE_GENETICS = "config_nature_genetics.json"
- def __init__(self, filename):
+ def __init__(self, filename: str) -> None:
"""Initializes the DefaultConfig enum with the given filename.
Args:
- filename (str): The name of the configuration file to load.
+ filename: The name of the configuration file to load.
"""
self._filename = filename
- self._config = None # Lazy-loaded cache
+ self._config: dict[str, Any] = {} # Lazy-loaded cache
def load_config(self) -> dict[str, Any]:
"""Loads the configuration file when first accessed.
@@ -42,7 +62,7 @@ def load_config(self) -> dict[str, Any]:
Returns:
The configuration file as a dictionary.
"""
- if self._config is None:
+ if self._config == {}:
config_path = resources.files("autocorpus.configs") / self._filename
with config_path.open("r", encoding="utf-8") as f_in:
self._config = json.load(f_in)["config"]
diff --git a/autocorpus/data_structures.py b/autocorpus/data_structures.py
new file mode 100644
index 00000000..037fa953
--- /dev/null
+++ b/autocorpus/data_structures.py
@@ -0,0 +1,26 @@
+"""Module to define common data structures for autocorpus."""
+
+from dataclasses import asdict, dataclass
+from typing import Any
+
+
+@dataclass
+class Paragraph:
+ """A paragraph for a section of the article."""
+
+ section_heading: str
+ subsection_heading: str
+ body: str
+ section_type: list[dict[str, str]]
+
+ def as_dict(self) -> dict[str, Any]:
+ """Return the dictionary representation of the Paragraph."""
+ return asdict(self)
+
+
+@dataclass(frozen=True)
+class SectionChild:
+ """A child node in the section."""
+
+ subheading: str
+ body: str
diff --git a/autocorpus/file_processing.py b/autocorpus/file_processing.py
new file mode 100644
index 00000000..fe13e26e
--- /dev/null
+++ b/autocorpus/file_processing.py
@@ -0,0 +1,123 @@
+"""Module providing functions for processing files with Auto-CORPus."""
+
+from collections.abc import Iterable
+from pathlib import Path
+from typing import Any
+
+from . import logger
+from .autocorpus import Autocorpus
+from .file_type import FileType, check_file_type
+from .html import process_html_article
+
+
+def process_file(
+ config: dict[str, Any], file_path: Path, linked_tables: list[Path] = []
+) -> Autocorpus:
+ """Process the input file based on its type.
+
+ This method checks the file type and processes the file accordingly.
+
+ Args:
+ config: Configuration dictionary for the input journal articles
+ file_path: Path to the article file to be processed
+ linked_tables: list of linked table file paths to be included in this run
+ (HTML files only)
+
+ Raises:
+ NotImplementedError: For files types with no implemented processing.
+ ModuleNotFoundError: For PDF processing if required packages are not found.
+ """
+ main_text: dict[str, Any] = {}
+ tables_dict: dict[str, Any] = {}
+ match check_file_type(file_path):
+ case FileType.HTML:
+ return Autocorpus(
+ file_path, *process_html_article(config, file_path, linked_tables)
+ )
+ case FileType.XML:
+ raise NotImplementedError(
+ f"Could not process file {file_path}. Process XML files by running:\n\t"
+ f"python -m autocorpus.parse_xml {file_path}"
+ )
+ case FileType.PDF:
+ try:
+ from .pdf import extract_pdf_content
+
+ text, tables = extract_pdf_content(file_path)
+
+ if text:
+ main_text = text.to_dict()
+
+ if tables:
+ tables_dict = tables.to_dict()
+
+ return Autocorpus(file_path, main_text, dict(), tables_dict)
+
+ except ModuleNotFoundError:
+ logger.error(
+ "Could not load necessary PDF packages. If you installed "
+ "Auto-CORPUS via pip, you can obtain these with:\n"
+ " pip install autocorpus[pdf]"
+ )
+ raise
+ case FileType.WORD:
+ try:
+ from .word import extract_word_content
+
+ text, tbls = extract_word_content(file_path)
+
+ if text:
+ main_text = text.to_dict()
+
+ if tbls:
+ tables_dict = tbls.to_dict()
+
+ return Autocorpus(file_path, main_text, dict(), tables_dict)
+ except ModuleNotFoundError:
+ logger.error(
+ "Could not load necessary Word packages. Microsoft Word is required to process Word documents on Windows & MAC OS, or alternatively LibreOffice can be used on Linux.\n"
+ )
+ raise
+
+ case FileType.UNKNOWN:
+ raise NotImplementedError(f"Could not identify file type for {file_path}")
+
+
+def process_directory(config: dict[str, Any], dir_path: Path) -> Iterable[Autocorpus]:
+ """Process all files in a directory and its subdirectories.
+
+ Args:
+ config: Configuration dictionary for the input HTML journal articles
+ dir_path: Path to the directory containing files to be processed.
+
+ Returns:
+ A generator yielding Autocorpus objects for each processed file.
+ """
+ for file_path in dir_path.iterdir():
+ if file_path.is_file():
+ yield process_file(config, file_path)
+
+ elif file_path.is_dir():
+ # recursively process all files in the subdirectory
+ for sub_file_path in file_path.rglob("*"):
+ yield process_file(config, sub_file_path)
+
+
+def process_files(config: dict[str, Any], files: list[Path]) -> Iterable[Autocorpus]:
+ """Process all files in a list.
+
+ Args:
+ config: Configuration dictionary for the input HTML journal articles
+ files: list of Paths to the files to be processed.
+
+ Returns:
+ A generator yielding Autocorpus objects for each processed file.
+
+ Raises:
+ RuntimeError: If the list of files is invalid.
+ """
+ if not all(file.is_file() for file in files):
+ raise RuntimeError("All files must be valid file paths.")
+
+ for file_path in files:
+ yield process_file(config, file_path)
diff --git a/autocorpus/file_type.py b/autocorpus/file_type.py
new file mode 100644
index 00000000..66966030
--- /dev/null
+++ b/autocorpus/file_type.py
@@ -0,0 +1,71 @@
+"""Contains utilities for identifying file types based on content and extension."""
+
+from enum import Enum, auto
+from pathlib import Path
+
+from lxml import etree
+
+from . import logger
+
+
+class FileType(Enum):
+ """Enum for different file types.
+
+ Access the attributes like so FileType.HTML, FileType.XML, etc.
+
+ Attributes:
+ HTML: Represents an HTML file.
+ XML: Represents an XML file.
+ PDF: Represents a PDF file.
+ WORD: Represents a Word document (DOCX or DOC).
+ UNKNOWN: Represents any other file type that is not recognized.
+ """
+
+ HTML = auto()
+ XML = auto()
+ PDF = auto()
+ WORD = auto()
+ UNKNOWN = auto()
+
+
+def check_file_type(file_path: Path) -> FileType:
+ """Determines the type of a file based on its content and extension.
+
+ This function checks the given file type by checking the file extension and then
+ attempting to parse it using appropriate parsers. If the file cannot
+ be parsed or the fileextension is not recognised, it is classified as "OTHER".
+
+ Args:
+ file_path: The path to the file to be checked.
+
+ Returns:
+ A FileType Enum value indicating the type of the file.
+
+ Raises:
+ FileNotFoundError: If the provided path does not point to a file.
+ """
+ if not file_path.is_file():
+ message = f"File {file_path} is not a file."
+ logger.error(message)
+ raise FileNotFoundError(message)
+ file_extension = file_path.suffix.lower()
+ match file_extension:
+ case ".html" | ".htm" | ".xml":
+ try:
+ if not etree.parse(file_path, etree.XMLParser()).docinfo.xml_version:
+ raise etree.ParseError("Not a valid XML file")
+ return FileType.XML
+ except etree.ParseError:
+ docinfo = etree.parse(file_path, etree.HTMLParser()).docinfo
+ if not isinstance(docinfo, etree.DocInfo) and not docinfo.doctype:
+ raise etree.ParseError("Not a valid HTML file")
+ return FileType.HTML
+ except Exception as ex:
+ logger.error(f"Error parsing file {file_path}: {ex}")
+ return FileType.UNKNOWN
+ case ".pdf":
+ return FileType.PDF
+ case ".docx" | ".doc":
+ return FileType.WORD
+ case _:
+ return FileType.UNKNOWN
diff --git a/autocorpus/html.py b/autocorpus/html.py
new file mode 100644
index 00000000..edc127c3
--- /dev/null
+++ b/autocorpus/html.py
@@ -0,0 +1,323 @@
+"""The Auto-CORPus HTML processing module."""
+
+from pathlib import Path
+from typing import Any, cast
+
+from bs4 import BeautifulSoup, Tag
+
+from . import logger
+from .abbreviation import get_abbreviations
+from .data_structures import Paragraph
+from .section import get_section
+from .table import get_table_json
+from .utils import handle_not_tables
+
+
+def load_html_file(fpath: Path) -> BeautifulSoup:
+ """Convert the input file into a BeautifulSoup object.
+
+ Args:
+ fpath: Path to the input file.
+
+ Returns:
+ BeautifulSoup object of the input file.
+ """
+ with fpath.open(encoding="utf-8") as fp:
+ soup = BeautifulSoup(fp.read(), "html.parser")
+ for e in soup.find_all(attrs={"style": ["display:none", "visibility:hidden"]}):
+ e.extract()
+ return soup
+
+
+def _get_keywords(
+ soup: BeautifulSoup, keywords_config: dict[str, Any]
+) -> Paragraph | None:
+ """Extract keywords from the soup object based on the provided configuration.
+
+ Args:
+ soup: BeautifulSoup object of the HTML file.
+ keywords_config: AC config rules for keywords.
+
+ Returns:
+ dict: Extracted keywords as a dictionary.
+ """
+ responses = handle_not_tables(keywords_config, soup)
+ if not responses:
+ return None
+
+ return Paragraph(
+ section_heading="keywords",
+ subsection_heading="",
+ body=" ".join(
+ x["node"].get_text() for x in responses if isinstance(x["node"], Tag)
+ ),
+ section_type=[{"iao_name": "keywords section", "iao_id": "IAO:0000630"}],
+ )
+
+
+def _get_title(soup: BeautifulSoup, title_config: dict[str, Any]) -> str:
+ """Extract the title from the soup object based on the provided configuration.
+
+ Args:
+ soup: BeautifulSoup object of the HTML file.
+ title_config: AC config rules for the title.
+
+ Returns:
+ Extracted title as a string.
+ """
+ titles = handle_not_tables(title_config, soup)
+ if not titles:
+ return ""
+
+ node = cast(Tag, titles[0]["node"])
+
+ return node.get_text()
+
+
+def _get_sections(
+ soup: BeautifulSoup, sections_config: dict[str, Any]
+) -> list[dict[str, Tag | list[str]]]:
+ """Extract sections from the soup object based on the provided configuration.
+
+ Args:
+ soup: Beautiful Soup object of the HTML file.
+ sections_config: AC config rules for sections.
+
+ Returns:
+ A list of matches for the provided config rules. Either as a Tag or a list of
+ strings.
+ """
+ return handle_not_tables(sections_config, soup)
+
+
+def _set_unknown_section_headings(unique_text: list[Paragraph]) -> list[Paragraph]:
+ """Set the heading for sections that are not specified in the config.
+
+ Args:
+ unique_text: List of unique text sections.
+
+ Returns:
+ A list of unique text sections with unknown headings set to "document part".
+ """
+ paper = {}
+ for para in unique_text:
+ if para.section_heading != "keywords":
+ paper[para.section_heading] = [x["iao_name"] for x in para.section_type]
+
+ for text in unique_text:
+ if not text.section_heading:
+ text.section_heading = "document part"
+ text.section_type = [{"iao_name": "document part", "iao_id": "IAO:0000314"}]
+
+ return unique_text
+
+
+def _extract_text(soup: BeautifulSoup, config: dict[str, Any]) -> dict[str, Any]:
+ """Extract the main text of the article from the soup object.
+
+ This converts a BeautifulSoup object of a html article into a Python dict that
+ aligns with the BioC format defined in the provided config.
+
+ Args:
+ soup: BeautifulSoup object of html
+ config: AC config rules
+
+ Return:
+ dict of the maintext
+ """
+ result: dict[str, Any] = {}
+
+ # Extract tags of text body and hard-code as:
+ # p (main text) and span (keywords and refs)
+ result["title"] = _get_title(soup, config["title"]) if "title" in config else ""
+ maintext = []
+ if "keywords" in config and (keywords := _get_keywords(soup, config["keywords"])):
+ maintext.append(keywords)
+ sections = _get_sections(soup, config["sections"]) if "sections" in config else []
+ for sec in sections:
+ maintext.extend(get_section(config, sec))
+
+ # filter out the sections which do not contain any info
+ filtered_text = [x for x in maintext if x]
+ unique_text = []
+ seen_text = []
+ for text in filtered_text:
+ if text.body not in seen_text:
+ seen_text.append(text.body)
+ unique_text.append(text)
+
+ result["paragraphs"] = [
+ p.as_dict() for p in _set_unknown_section_headings(unique_text)
+ ]
+
+ return result
+
+
+def _extend_tables_documents(
+ documents: list[dict[str, Any]], new_documents: list[dict[str, Any]]
+) -> list[dict[str, Any]]:
+ """Extends the list of tables documents with new documents, ensuring unique IDs.
+
+ Args:
+ documents: The original list of documents to be extended.
+ new_documents: New list of documents to add.
+
+ Returns:
+ A list of documents with unique IDs, combining the original and new documents.
+ """
+ seen_ids = set()
+ for doc in documents:
+ seen_ids.add(doc["id"].partition(".")[0])
+
+ for doc in new_documents:
+ tabl_id, _, tabl_pos = doc["id"].partition(".")
+ if tabl_id in seen_ids:
+ tabl_id = str(len(seen_ids) + 1)
+ if tabl_pos:
+ doc["id"] = f"{tabl_id}.{tabl_pos}"
+ else:
+ doc["id"] = tabl_id
+ seen_ids.add(tabl_id)
+
+ documents.extend(new_documents)
+
+ return documents
+
+
+def _merge_tables_with_empty_tables(
+ documents: list[dict[str, Any]], empty_tables: list[dict[str, Any]]
+) -> list[dict[str, Any]]:
+ """Extends the list of tables documents with empty tables, ensuring titles are set.
+
+ Args:
+ documents: The original list of documents to be extended.
+ empty_tables: A list of empty tables to merge with the documents.
+
+ Returns:
+ A list of documents with titles and captions from empty tables merged in.
+ """
+
+ def _set_table_passage(passages, section_name, iao_name, iao_id, text):
+ set_new = False
+ for passage in passages:
+ if passage["infons"]["section_type"][0]["section_name"] == section_name:
+ passage["text"] = text
+ set_new = True
+ if set_new:
+ return passages
+ return {
+ "offset": 0,
+ "infons": {
+ "section_type": [
+ {
+ "section_name": section_name,
+ "iao_name": iao_name,
+ "iao_id": iao_id,
+ }
+ ]
+ },
+ "text": text,
+ }
+
+ seen_ids: dict[int, str] = {}
+ for i, table in enumerate(documents):
+ if "id" in table:
+ seen_ids[i] = f"Table {table['id']}."
+
+ for table in empty_tables:
+ for seen_id in seen_ids:
+ if not table["title"].startswith(seen_ids[seen_id]):
+ continue
+
+ if title := table.get("title"):
+ documents[seen_id]["passages"] = _set_table_passage(
+ documents[seen_id]["passages"],
+ "table_title",
+ "document title",
+ "IAO:0000305",
+ title,
+ )
+ if caption := table.get("caption"):
+ documents[seen_id]["passages"] = _set_table_passage(
+ documents[seen_id],
+ "table_caption",
+ "caption",
+ "IAO:0000304",
+ caption,
+ )
+ if footer := table.get("footer"):
+ documents[seen_id]["passages"] = _set_table_passage(
+ documents[seen_id],
+ "table_footer",
+ "caption",
+ "IAO:0000304",
+ footer,
+ )
+ return documents
+
+
+def process_html_article(
+ config: dict[str, Any], file_path: Path, linked_tables: list[Path] = []
+) -> tuple[dict[str, Any], dict[str, Any], dict[str, Any]]:
+ """Create valid BioC versions of input HTML journal articles based off config.
+
+ Processes the main text file and tables specified in the configuration.
+
+ This method performs the following steps:
+ 1. Checks if a valid configuration is loaded. If not, raises a RuntimeError.
+ 2. Handles the main text file:
+ - Parses the HTML content of the file.
+ - Extracts the main text from the parsed HTML.
+ - Attempts to extract abbreviations from the main text and HTML content.
+ If an error occurs during this process, it prints the error.
+ 3. Processes linked tables, if any:
+ - Parses the HTML content of each linked table file.
+ 4. Merges table data.
+ 5. Checks if there are any documents in the tables and sets the `has_tables`
+ attribute accordingly.
+
+ Args:
+ config: Configuration dictionary for the input journal articles
+ file_path: Path to the article file to be processed
+ linked_tables: list of linked table file paths to be included in this run
+ (HTML files only)
+
+ Returns:
+ A tuple containing:
+ - main_text: Extracted main text as a dictionary.
+ - abbreviations: Extracted abbreviations as a dictionary.
+ - tables: Extracted tables as a dictionary (possibly empty).
+
+ Raises:
+ RuntimeError: If no valid configuration is loaded.
+ """
+ if config == {}:
+ raise RuntimeError("A valid config file must be loaded.")
+
+ soup = load_html_file(file_path)
+ main_text = _extract_text(soup, config)
+ try:
+ abbreviations = get_abbreviations(main_text, soup, file_path)
+ except Exception as e:
+ logger.error(e)
+
+ if "tables" not in config:
+ return main_text, abbreviations, dict()
+
+ tables, empty_tables = get_table_json(soup, config, file_path)
+
+ new_documents = []
+ for table_file in linked_tables:
+ soup = load_html_file(table_file)
+ new_tables, new_empty_tables = get_table_json(soup, config, table_file)
+ new_documents.extend(new_tables.get("documents", []))
+ empty_tables.extend(new_empty_tables)
+ tables["documents"] = _extend_tables_documents(
+ tables.get("documents", []), new_documents
+ )
+ if empty_tables:
+ tables["documents"] = _merge_tables_with_empty_tables(
+ tables["documents"], empty_tables
+ )
+
+ return main_text, abbreviations, tables
diff --git a/autocorpus/pdf.py b/autocorpus/pdf.py
new file mode 100644
index 00000000..476c92fb
--- /dev/null
+++ b/autocorpus/pdf.py
@@ -0,0 +1,132 @@
+"""Functionality for processing PDF files."""
+
+from pathlib import Path
+
+import pandas as pd
+import regex
+from marker.converters.pdf import PdfConverter
+from marker.models import create_model_dict
+from marker.output import text_from_rendered
+from pandas import DataFrame
+
+from autocorpus.bioc_supplementary import BioCTableConverter, BioCTextConverter
+
+from . import logger
+from .ac_bioc import BioCCollection
+from .ac_bioc.bioctable.json import BioCTableCollection
+
+_pdf_converter: PdfConverter | None = None
+
+
+def _get_pdf_converter() -> PdfConverter | None:
+ global _pdf_converter
+ if _pdf_converter is None:
+ try:
+ # Load the PDF models
+ _pdf_converter = PdfConverter(
+ artifact_dict=create_model_dict(),
+ )
+ except Exception as e:
+ logger.error(f"Error loading PDF models: {e}")
+ return None
+
+ return _pdf_converter
+
+
+def extract_pdf_content(
+ file_path: Path,
+) -> tuple[BioCCollection, BioCTableCollection]:
+ """Extracts content from a PDF file.
+
+ Args:
+ file_path (Path): Path to the PDF file.
+
+ Returns:
+ A tuple of BioCTextConverter and BioCTableConverter objects containing
+ the extracted text and tables.
+
+ Raises:
+ RuntimeError: If the PDF converter is not initialized.
+ """
+ bioc_text, bioc_tables = None, None
+
+ pdf_converter = _get_pdf_converter()
+ if not pdf_converter:
+ message = "PDF converter not initialized."
+ logger.error(message)
+ raise RuntimeError(message)
+
+ # extract text from PDF
+ rendered = pdf_converter(str(file_path))
+ text, _, _ = text_from_rendered(rendered)
+ # separate text and tables
+ text, tables = _extract_table_from_pdf_text(text)
+ # format data for BioC
+ bioc_text = BioCTextConverter.build_bioc(text, str(file_path), "pdf")
+ bioc_tables = BioCTableConverter.build_bioc(tables, str(file_path))
+
+ return bioc_text, bioc_tables
+
+
+def _split_text_and_tables(text: str) -> tuple[list[str], list[list[str]]]:
+ """Splits PDF text into main text lines and raw table lines."""
+ lines = [x for x in text.splitlines() if x]
+ tables = []
+ table_lines = []
+ main_text_lines = []
+ inside_table = False
+
+ for line in lines:
+ if "|" in line:
+ inside_table = True
+ table_lines.append(line)
+ elif inside_table:
+ inside_table = False
+ tables.append(table_lines)
+ main_text_lines.append(line)
+ table_lines = []
+ continue
+ else:
+ main_text_lines.append(line)
+
+ return main_text_lines, tables
+
+
+def _parse_tables(raw_tables: list[list[str]]) -> list[DataFrame]:
+ """Converts raw table text lines into DataFrames."""
+ parsed_tables = []
+ for table in raw_tables:
+ # Remove lines that are just dashes
+ table = [line for line in table if not regex.match(r"^\s*[\p{Pd}]+\s*$", line)]
+
+ rows = []
+ for line in table:
+ if regex.search(r"\|", line):
+ cells = [
+ cell.strip()
+ for cell in line.split("|")
+ if not all(x in "|-" for x in cell)
+ ]
+ if cells:
+ rows.append(cells)
+
+ if not rows:
+ continue
+
+ num_columns = max(len(row) for row in rows)
+ for row in rows:
+ while len(row) < num_columns:
+ row.append("")
+
+ df = pd.DataFrame(rows[1:], columns=rows[0])
+ parsed_tables.append(df)
+
+ return parsed_tables
+
+
+def _extract_table_from_pdf_text(text: str) -> tuple[str, list[DataFrame]]:
+ """Extracts tables from PDF text and returns the remaining text and parsed tables."""
+ main_text_lines, raw_tables = _split_text_and_tables(text)
+ tables_output = _parse_tables(raw_tables)
+ text_output = "\n\n".join(main_text_lines)
+ return text_output, tables_output
diff --git a/autocorpus/py.typed b/autocorpus/py.typed
new file mode 100644
index 00000000..e69de29b
diff --git a/autocorpus/reference.py b/autocorpus/reference.py
index 688dd6ce..ad188366 100644
--- a/autocorpus/reference.py
+++ b/autocorpus/reference.py
@@ -1,11 +1,40 @@
"""Use regular expression for searching/replacing reference strings."""
import re
+from dataclasses import dataclass
from typing import Any
+from .data_structures import Paragraph
-def get_references(reference: dict[str, Any], section_heading: str) -> dict[str, Any]:
- """Retrieve a structured reference dictionary from a BeautifulSoup object and section heading.
+
+@dataclass
+class ReferencesParagraph(Paragraph):
+ """A paragraph for the references section of the article."""
+
+ title: str = ""
+ journal: str = ""
+ volume: str = ""
+
+ def as_dict(self) -> dict[str, Any]:
+ """Return the dictionary representation of the ReferencesParagraph.
+
+ For consistency between old and new PMC specification, we only include the three
+ fields `title`, `journal`, and `volume` if they are not empty.
+
+ Returns:
+ A dictionary representation of the ReferencesParagraph.
+ """
+ return {
+ k: v
+ for k, v in super().as_dict().items()
+ if v or (k not in ("title", "journal", "volume"))
+ }
+
+
+def get_references(
+ reference: dict[str, Any], section_heading: str
+) -> ReferencesParagraph:
+ """Retrieve a structured reference dictionary from a BS4 object and section heading.
Args:
reference: dictionary containing the references node
@@ -15,13 +44,15 @@ def get_references(reference: dict[str, Any], section_heading: str) -> dict[str,
"""
text = reference["node"].get_text().replace("Go to:", "").replace("\n", "")
text = re.sub(r"\s{2,}", " ", text)
- ref_section = {
- "section_heading": section_heading,
- "subsection_heading": "",
- "body": text,
- "section_type": [{"iao_name": "references section", "iao_id": "IAO:0000320"}],
- }
-
- ref_section |= {k: ". ".join(v) for k, v in reference.items() if k != "node"}
+ ref_section = ReferencesParagraph(
+ section_heading,
+ "",
+ text,
+ [{"iao_name": "references section", "iao_id": "IAO:0000320"}],
+ )
+
+ for k, v in reference.items():
+ if k != "node":
+ setattr(ref_section, k, ". ".join(v))
return ref_section
diff --git a/autocorpus/run.py b/autocorpus/run.py
index 2744c917..fd44c2e7 100644
--- a/autocorpus/run.py
+++ b/autocorpus/run.py
@@ -2,7 +2,7 @@
from pathlib import Path
-from .autocorpus import Autocorpus
+from .file_processing import process_file
def run_autocorpus(config, structure, key, output_format):
@@ -14,14 +14,12 @@ def run_autocorpus(config, structure, key, output_format):
key: The key in the structure dict for the current file.
output_format: The output format to use (JSON or XML).
"""
- ac = Autocorpus(
+ ac = process_file(
config=config,
- main_text=structure[key]["main_text"],
- linked_tables=sorted(structure[key]["linked_tables"]),
+ file_path=Path(structure[key]["main_text"]),
+ linked_tables=sorted(Path(lt) for lt in structure[key]["linked_tables"]),
)
- ac.process_files()
-
out_dir = Path(structure[key]["out_dir"])
if structure[key]["main_text"]:
key = key.replace("\\", "/")
@@ -46,6 +44,15 @@ def run_autocorpus(config, structure, key, output_format):
) as outfp:
outfp.write(ac.abbreviations_to_bioc_json())
+ ## TODO: Uncomment when SI conversion is supported
+ # out_filename = str(file_path).replace(".pdf", ".pdf_bioc.json")
+ # with open(out_filename, "w", encoding="utf-8") as f:
+ # BioCJSON.dump(bioc_text, f, indent=4)
+
+ # out_table_filename = str(file_path).replace(".pdf", ".pdf_tables.json")
+ # with open(out_table_filename, "w", encoding="utf-8") as f:
+ # BioCTableJSON.dump(bioc_tables, f, indent=4)
+
# AC does not support the conversion of tables or abbreviations to XML
if ac.has_tables:
with open(
diff --git a/autocorpus/section.py b/autocorpus/section.py
index 80c75865..9b51a762 100644
--- a/autocorpus/section.py
+++ b/autocorpus/section.py
@@ -8,18 +8,18 @@
import re
from collections.abc import Iterable
-from dataclasses import asdict, dataclass
from functools import lru_cache
from importlib import resources
from itertools import chain
-from typing import Any
+from typing import Any, cast
import nltk
from bs4 import BeautifulSoup, Tag
from fuzzywuzzy import fuzz
from . import logger
-from .reference import get_references
+from .data_structures import Paragraph, SectionChild
+from .reference import ReferencesParagraph, get_references
from .utils import handle_not_tables
@@ -131,24 +131,12 @@ def get_iao_term_to_id_mapping(iao_term: str) -> dict[str, str]:
return {"iao_name": iao_term, "iao_id": mapping_result_id_version}
-@dataclass
-class Paragraph:
- """A paragraph for a section of the article."""
-
- section_heading: str
- subsection_heading: str
- body: str
- section_type: list[dict[str, str]]
-
- as_dict = asdict
-
-
def _get_abbreviations(
abbreviations_config: dict[str, Any], soup_section: BeautifulSoup
) -> str:
try:
abbreviations_tables = handle_not_tables(abbreviations_config, soup_section)
- node = abbreviations_tables[0]["node"]
+ node = cast(Tag, abbreviations_tables[0]["node"])
abbreviations = {}
for tr in node.find_all("tr"):
short_form, long_form = (td.get_text() for td in tr.find_all("td"))
@@ -161,7 +149,7 @@ def _get_abbreviations(
def _get_references(
config: dict[str, Any], section_heading: str, soup_section: BeautifulSoup
-) -> Iterable[dict[str, Any]]:
+) -> Iterable[ReferencesParagraph]:
"""Constructs the article references using the provided configuration file.
Args:
@@ -174,14 +162,6 @@ def _get_references(
yield get_references(ref, section_heading)
-@dataclass(frozen=True)
-class SectionChild:
- """A child node in the section."""
-
- subheading: str
- body: str
-
-
def _navigate_children(
subheading: str,
soup_sections: list[Tag],
@@ -225,13 +205,16 @@ def _get_section(
) -> Iterable[SectionChild]:
subsections = handle_not_tables(config["sub-sections"], soup_section)
paragraphs = [
- para["node"] for para in handle_not_tables(config["paragraphs"], soup_section)
+ cast(Tag, para["node"])
+ for para in handle_not_tables(config["paragraphs"], soup_section)
]
tables = [
- table["node"] for table in handle_not_tables(config["tables"], soup_section)
+ cast(Tag, table["node"])
+ for table in handle_not_tables(config["tables"], soup_section)
]
figures = [
- figure["node"] for figure in handle_not_tables(config["figures"], soup_section)
+ cast(Tag, figure["node"])
+ for figure in handle_not_tables(config["figures"], soup_section)
]
unwanted_paragraphs = list(
chain.from_iterable(
@@ -245,7 +228,7 @@ def _get_section(
def get_section(
config: dict[str, dict[str, Any]], section_dict: dict[str, Any]
-) -> Iterable[dict[str, Any]]:
+) -> Iterable[Paragraph]:
"""Identifies a section using the provided configuration.
Args:
@@ -262,7 +245,7 @@ def get_section(
abbreviations_config, section_dict["node"]
)
for body in abbreviations:
- yield Paragraph(section_heading, "", body, section_type).as_dict()
+ yield Paragraph(section_heading, "", body, section_type)
return
if {
@@ -278,4 +261,4 @@ def get_section(
child.subheading,
child.body,
section_type,
- ).as_dict()
+ )
diff --git a/autocorpus/table.py b/autocorpus/table.py
index 35dc42d9..a4745373 100644
--- a/autocorpus/table.py
+++ b/autocorpus/table.py
@@ -101,7 +101,8 @@ def __table_to_2d(t: BeautifulSoup) -> list[list[str]]:
def __check_superrow(cells: list[str]) -> bool:
"""Check if the current row is a superrow.
- Superrows contain cells that are split and contain more values than other cells on the same row.
+ Superrows contain cells that are split and contain more values than other cells on
+ the same row.
Args:
cells: Cells in row
@@ -372,30 +373,33 @@ def __format_table_bioc(table_json, table_identifier, file_path):
def get_table_json(
- soup: BeautifulSoup, config: dict[str, Any], file_name: str
+ soup: BeautifulSoup, config: dict[str, Any], file_path: Path
) -> tuple[dict[str, Any], list[dict[str, Any]]]:
- """Extracts and processes tables from an HTML document using BeautifulSoup and a configuration dictionary.
+ """Extracts and processes tables from an HTML document.
+
+ This is done using BeautifulSoup and a configuration dictionary.
The function performs the following steps:
1. Extracts tables from the HTML document based on the provided configuration.
2. Removes empty tables and tables with specific classes (e.g., "table-group").
3. Identifies and processes table headers, superrows, and subheaders.
- 4. Converts tables into a 2D format and processes cell data types (e.g., numeric, text, mixed).
+ 4. Converts tables into a 2D format and processes cell data types (e.g., numeric,
+ text, mixed).
5. Converts the processed table data into a JSON-compatible format.
6. Merges headers and formats the final table data for output.
Args:
soup: A BeautifulSoup object representing the parsed HTML document.
config: A dictionary containing configuration options for table processing.
- file_name: The file name or path of the HTML document being processed.
+ file_path: The file name or path of the HTML document being processed.
Returns:
- A dictionary containing the processed table data in JSON format and a list of dictionaries representing empty tables.
+ A dictionary containing the processed table data in JSON format and a list of
+ dictionaries representing empty tables.
"""
soup_tables: list[dict[str, Any]] = handle_tables(config["tables"], soup)
- file_path: str = file_name
- file_name = Path(file_name).name
+ file_name = file_path.name
table_identifier: str | None = None
if re.search(r"_table_\d+\.html", file_name):
table_identifier = file_name.split("/")[-1].split("_")[-1].split(".")[0]
@@ -412,16 +416,6 @@ def get_table_json(
pop_list.append(i)
empty_tables.append(table)
soup_tables = [table for i, table in enumerate(soup_tables) if i not in pop_list]
- empty_tables = []
- for etable in empty_tables:
- # has a table element, not empty
- if not etable["node"].find("table"):
- et_dict = {
- "title": " ".join(etable["title"]),
- "caption": " ".join(etable["caption"]),
- "footer": " ".join(etable["footer"]),
- }
- empty_tables.append(et_dict)
# One table
tables = []
@@ -449,7 +443,9 @@ def get_table_json(
first_col_vals = [
i for i in first_col if first_col.index(i) not in header_idx
]
- unique_vals = set(i for i in first_col_vals if i not in ("", "None"))
+ unique_vals = dict.fromkeys(
+ i for i in first_col_vals if i not in ("", "None")
+ )
if len(unique_vals) <= len(first_col_vals) / 2:
section_names = list(unique_vals)
for i in section_names:
@@ -564,5 +560,5 @@ def get_table_json(
tables += cur_table
table_json = {"tables": tables}
- table_json = __format_table_bioc(table_json, table_identifier, file_path)
+ table_json = __format_table_bioc(table_json, table_identifier, str(file_path))
return table_json, empty_tables
diff --git a/autocorpus/utils.py b/autocorpus/utils.py
index 8ee3b2f0..4fd4d6e0 100644
--- a/autocorpus/utils.py
+++ b/autocorpus/utils.py
@@ -6,7 +6,7 @@
from typing import Any
import bs4
-from bs4 import BeautifulSoup, NavigableString
+from bs4 import BeautifulSoup, NavigableString, Tag
from lxml import etree
from lxml.html.soupparser import fromstring
@@ -129,15 +129,15 @@ def parse_configs(definition):
return bs_attrs
-def handle_defined_by(config, soup):
+def handle_defined_by(config: dict[str, Any], soup: BeautifulSoup) -> list[Tag]:
"""Retrieve matching nodes for the 'defined-by' config rules.
Args:
- config (dict): config file section used to parse
- soup (bs4.BeautifulSoup): soup section to parse
+ config: config file section used to parse
+ soup: soup section to parse
Returns:
- (list): list of objects, each object being a matching node. Object of the form:
+ A list of objects, each object being a matching node. Object of the form:
{
node: bs4Object,
data:{
@@ -145,9 +145,11 @@ def handle_defined_by(config, soup):
}
}
node is a bs4 object of a single result derived from bs4.find_all()
- data is an object where the results from the config "data" sections is housed. The key is the name of the data
- section and the values are all matches found within any of the main matches which match the current data section
- definition. The values is the response you get from get_text() on any found nodes, not the nodes themselves.
+ data is an object where the results from the config "data" sections is housed.
+ The key is the name of the data section and the values are all matches found
+ within any of the main matches which match the current data section definition.
+ The values is the response you get from get_text() on any found nodes, not the
+ nodes themselves.
"""
if "defined-by" not in config:
quit(f"{config} does not contain the required 'defined-by' key.")
@@ -155,7 +157,7 @@ def handle_defined_by(config, soup):
seen_text = []
for definition in config["defined-by"]:
bs_attrs = parse_configs(definition)
- new_matches = []
+ new_matches = [] # type: ignore[var-annotated]
if bs_attrs["name"] or bs_attrs["attrs"]:
new_matches = soup.find_all(
bs_attrs["name"] if bs_attrs["name"] else None,
@@ -201,8 +203,9 @@ def handle_defined_by(config, soup):
def handle_not_tables(
- config: dict[str, Any], soup: BeautifulSoup
-) -> list[dict[str, Any]]:
+ config: dict[str, Any],
+ soup: BeautifulSoup,
+) -> list[dict[str, Tag | list[str]]]:
"""Executes a search on non-table bs4 soup objects based on provided config rules.
Args:
@@ -210,13 +213,14 @@ def handle_not_tables(
soup: BeautifulSoup object containing the input text to search
Returns:
- Matches for the provided config rules
+ A list of matches for the provided config rules. Either as a Tag or a list of
+ strings.
"""
responses = []
matches = handle_defined_by(config, soup)
if "data" in config:
for match in matches:
- response_addition = {"node": match}
+ response_addition: dict[str, Tag | list[str]] = {"node": match}
for ele in config["data"]:
seen_text = set()
for definition in config["data"][ele]:
diff --git a/autocorpus/word.py b/autocorpus/word.py
new file mode 100644
index 00000000..f7eca2db
--- /dev/null
+++ b/autocorpus/word.py
@@ -0,0 +1,205 @@
+"""This module provides functionality to extract text and tables from Word documents (.doc and .docx).
+
+It includes methods to handle older .doc files by converting them to .docx format and processing them.
+"""
+
+import os
+import platform
+import subprocess
+from pathlib import Path
+
+from docx import Document
+from docx.document import Document as DocumentObject
+from pandas import DataFrame
+
+from . import logger
+from .ac_bioc.bioctable.collection import BioCTableCollection
+from .ac_bioc.collection import BioCCollection
+from .bioc_supplementary import (
+ BioCTableConverter,
+ BioCTextConverter,
+ WordText,
+)
+
+
+def __extract_tables(doc: DocumentObject) -> list[DataFrame]:
+ """Extracts tables from a .docx document as a list of DataFrames.
+
+ Args:
+ doc: The Document object representing the .docx document.
+
+ Returns:
+ List[pd.DataFrame]: A list of pandas DataFrames, each representing a table in the document.
+
+ Example:
+ from docx import Document
+
+ doc = Document("document.docx")
+ tables = __extract_tables(doc)
+ """
+ dataframes: list[DataFrame] = []
+
+ for table in doc.tables:
+ data = []
+ for row in table.rows:
+ data.append([cell.text.strip() for cell in row.cells])
+ df = DataFrame(data)
+ dataframes.append(df)
+
+ return dataframes
+
+
+def __windows_convert_doc_to_docx(docx_path: Path, file: Path) -> Path | None:
+ """Converts a .doc file to .docx format using Microsoft Word on Windows."""
+ try:
+ import win32com.client
+ except ImportError:
+ logger.error(
+ "pywin32 is required to convert Word documents on Windows. Please install it via 'pip install pywin32'."
+ )
+ return None
+
+ word = None
+ try:
+ word = win32com.client.DispatchEx("Word.Application")
+ doc = word.Documents.Open(str(file))
+ doc.SaveAs(str(docx_path), 16) # 16 = wdFormatDocumentDefault (.docx)
+ doc.Close()
+ logger.info(
+ f"Successfully converted '{file}' to '{docx_path}' using Word on Windows."
+ )
+ return docx_path
+ except Exception as e:
+ logger.exception(f"Failed to convert '{file}' on Windows: {e}")
+ return None
+ finally:
+ if word:
+ try:
+ word.Quit()
+ except Exception as quit_err:
+ logger.warning(f"Could not quit Word application cleanly: {quit_err}")
+
+
+def __linux_convert_doc_to_docx(docx_path: Path, file: Path) -> Path | None:
+ """Converts a .doc file to .docx format using LibreOffice on Linux."""
+ try:
+ result = subprocess.run(
+ [
+ "soffice",
+ "--headless",
+ "--convert-to",
+ "docx",
+ "--outdir",
+ str(docx_path.parent),
+ str(file),
+ ],
+ check=True,
+ capture_output=True,
+ text=True,
+ )
+ logger.info(f"LibreOffice output: {result.stdout}")
+ return docx_path
+ except FileNotFoundError:
+ logger.error(
+ "LibreOffice ('soffice') not found. Please install it to enable DOC to DOCX conversion."
+ )
+ return None
+ except subprocess.CalledProcessError as e:
+ logger.exception(f"LibreOffice failed to convert '{file}': {e.stderr}")
+ return None
+
+
+def __escape_applescript_path(path: Path) -> str:
+ # Convert to absolute path just in case
+ path = path.absolute()
+ # Escape backslashes and double quotes for AppleScript
+ return str(path).replace("\\", "\\\\").replace('"', '\\"')
+
+
+def __macos_convert_doc_to_docx(docx_path: Path, file: Path) -> Path | None:
+ """Converts a .doc file to .docx format using AppleScript on macOS."""
+ try:
+ applescript = f'''
+ tell application "Microsoft Word"
+ open "{__escape_applescript_path(file)}"
+ save as active document file name "{__escape_applescript_path(docx_path)}" file format format document
+ close active document saving no
+ end tell
+ '''
+ subprocess.run(["osascript", "-e", applescript], check=True)
+ logger.info(
+ f"Successfully converted '{file}' to '{docx_path}' using Word on macOS."
+ )
+ return docx_path
+ except FileNotFoundError:
+ logger.error(
+ "osascript not found. Ensure you have AppleScript and Microsoft Word installed on macOS."
+ )
+ return None
+ except subprocess.CalledProcessError as e:
+ logger.exception(f"AppleScript failed to convert '{file}': {e}")
+ return None
+
+
+def __convert_older_doc_file(file: Path, output_dir: Path) -> Path | None:
+ """Converts an older .doc file to .docx format using platform-specific methods."""
+ operating_system = platform.system()
+ docx_path = output_dir / file.with_suffix(".docx").name
+
+ if operating_system == "Windows":
+ return __windows_convert_doc_to_docx(docx_path, file)
+ elif operating_system == "Darwin": # macOS
+ return __macos_convert_doc_to_docx(docx_path, file)
+ else:
+ return __linux_convert_doc_to_docx(docx_path, file) # Fallback to Linux method
+
+
+def extract_word_content(file_path: Path):
+ """Extracts text from a .doc file by converting it to .docx and processing with python-docx."""
+ if file_path.suffix.lower() not in [".doc", ".docx"]:
+ raise ValueError("Input file must be a .doc file.")
+ try:
+ output_dir = Path(file_path).parent.absolute()
+ # Check if the file is a .doc file
+ if file_path.suffix.lower() == ".doc":
+ docx_path = __convert_older_doc_file(file_path, output_dir)
+
+ # Extract text from the resulting .docx file
+ doc = Document(str(docx_path))
+ tables = __extract_tables(doc)
+ text_sizes = set(
+ [
+ int(x.style.font.size)
+ for x in doc.paragraphs
+ if x.style and x.style.font.size
+ ]
+ )
+ paragraphs = [
+ WordText(
+ x.text,
+ True
+ if text_sizes
+ and x.style
+ and x.style.font.size
+ and int(x.style.font.size) > min(text_sizes)
+ else False,
+ )
+ for x in doc.paragraphs
+ ]
+ bioc_text: BioCCollection | None = None
+ bioc_tables: BioCTableCollection | None = None
+
+ if paragraphs:
+ bioc_text = BioCTextConverter.build_bioc(paragraphs, str(file_path), "word")
+
+ if tables:
+ bioc_tables = BioCTableConverter.build_bioc(tables, str(file_path))
+
+ os.unlink(str(docx_path))
+ return bioc_text, bioc_tables
+ except FileNotFoundError:
+ logger.error(
+ "LibreOffice 'soffice' command not found. Ensure it is installed and in your PATH."
+ )
+ except Exception as e:
+ logger.error(f"Error processing file {file_path}: {e}")
diff --git a/codecov.yml b/codecov.yml
new file mode 100644
index 00000000..e686d224
--- /dev/null
+++ b/codecov.yml
@@ -0,0 +1,9 @@
+# Don't fail CI if coverage drops
+coverage:
+ status:
+ project:
+ default:
+ informational: true
+ patch:
+ default:
+ informational: true
diff --git a/docs/io.md b/docs/io.md
new file mode 100644
index 00000000..c931092a
--- /dev/null
+++ b/docs/io.md
@@ -0,0 +1,128 @@
+# Inputs and Outputs
+
+Auto-CORPus can be used directly on one file, or a list of files. However, to use it on
+a directory containing multiple files and nested directories, there is an assumed
+structure. This is useful for analysing an article along with its associated tables
+and supplementary information.
+
+## Input
+
+Auto-CORPus processes two categories of biomedical literature: **full text with tables**
+and **supplementary information**.
+
+Full text input files can be in HTML, XML or PDF formats, with an option to process
+standalone HTML files which describe a single table.
+
+Supplementary information files can be in PDF, word processor (doc, docx), spreadsheet
+(xlsx, xls, csv, tsv) and presentation (pptx, ppt, pptm, odp) formats.
+
+Auto-CORPus relies on a prescriptive directory structure and naming convention to
+distinguish and group full text, table and supplementary information files.
+
+The input directory passed to Auto-CORPus should contain article full text files and
+optional subdirectories for tables and supplementary information for each article.
+
+The article full text file is named:
+
+- `{article_name}.html` or `{article_name}.xml` or `{article_name}.pdf`
+
+Article table HTML files are placed in a subdirectory named:
+
+- `{article_name}_tbl`
+
+The table files in the subdirectory must contain _X at the end of the file name, where X
+is the table number.
+
+- `{any_name_you_want}_X.html`
+
+Article supplementary information files are placed in a subdirectory named:
+
+- `{article_name}_si`
+
+The supplementary information files in the subdirectory can have any name, but must
+contain a `.pdf`, `.docx`, `.doc`, `.xlsx`, `.xls`, `.csv`, `.tsv`, `.pptx`, `.ppt`,
+`.pptm` or `.odp` file extension.
+
+## Output
+
+Auto-COPRus will write output to the “root” location passed to it, replicating the input
+directory structure.
+
+
+
+
+| Input |
+Output |
+
+
+|
+
+```text
+inputs
+├── PMC1.html
+├── PMC1_tbl
+│ ├── results_tbl_1.html
+│ └── results_tbl_2.html
+└── PMC1_si
+ └── suppl_methods.docx
+```
+
+ |
+
+
+```text
+outputs
+├── PMC1_bioc.json
+├── PMC1_abbreviations.json
+├── PMC1_tbl
+│ └── PMC1_tables.json
+└── PMC1_si
+ └── suppl_methods.docx_bioc.json
+```
+
+ |
+
+
+|
+
+```text
+inputs
+├── article1.pdf
+└── article1_si
+ ├── extended_results.xlsx
+ └── file3454.pdf
+```
+
+ |
+
+
+```text
+outputs
+├── article1_bioc.json
+├── article1_abbreviations.json
+├── article1_tables.json
+└── article1_si
+ ├── extended_results.xlsx_tables.json
+ └── file3454.pdf_bioc.json
+```
+
+ |
+
+
+
+
+For each full text file, a bioc and abbreviations json file is output to the root.
+
+If a tables subdirectory was not given for the article, the tables json file is output
+to the root.
+
+If a tables subdirectory was given, the tables json file is output to the subdirectory.
+The tables json contains all tables from the separate HTML files and any tables
+described within the main text.
+
+The processed supplementary files are output to the supplementary subdirectory. If
+Auto-CORPus detects text in the input file, a bioc file is output with \_bioc.json
+appended to the end of the original filename. If Auto-CORPus detects one or more tables
+in the input file, a tables json file is output with \_tables.json appended to the end
+of the original filename. If both text and tables are detected, then both formats will
+be output.
diff --git a/mkdocs.yml b/mkdocs.yml
index 451b314f..b8e5d897 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -43,6 +43,7 @@ plugins:
nav:
- Auto-CORPus documentation: index.md
+ - io.md
- How to create/edit a config file: config_tutorial.md
- Use of data elements: data_elements.md
- Package workflows: package_workflows.md
diff --git a/poetry.lock b/poetry.lock
index fdc0a55f..ece8ed73 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -4,7 +4,7 @@
name = "annotated-types"
version = "0.7.0"
description = "Reusable constraint types to use with typing.Annotated"
-optional = false
+optional = true
python-versions = ">=3.8"
files = [
{file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
@@ -15,7 +15,7 @@ files = [
name = "anthropic"
version = "0.46.0"
description = "The official Python library for the anthropic API"
-optional = false
+optional = true
python-versions = ">=3.8"
files = [
{file = "anthropic-0.46.0-py3-none-any.whl", hash = "sha256:1445ec9be78d2de7ea51b4d5acd3574e414aea97ef903d0ecbb57bec806aaa49"},
@@ -39,7 +39,7 @@ vertex = ["google-auth (>=2,<3)"]
name = "anyio"
version = "4.9.0"
description = "High level compatibility layer for multiple asynchronous event loop implementations"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
{file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"},
@@ -134,7 +134,7 @@ lxml = ["lxml"]
name = "cachetools"
version = "5.5.2"
description = "Extensible memoizing collections and decorators"
-optional = false
+optional = true
python-versions = ">=3.7"
files = [
{file = "cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a"},
@@ -143,13 +143,13 @@ files = [
[[package]]
name = "certifi"
-version = "2025.1.31"
+version = "2025.4.26"
description = "Python package for providing Mozilla's CA Bundle."
optional = false
python-versions = ">=3.6"
files = [
- {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"},
- {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"},
+ {file = "certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"},
+ {file = "certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6"},
]
[[package]]
@@ -165,114 +165,114 @@ files = [
[[package]]
name = "charset-normalizer"
-version = "3.4.1"
+version = "3.4.2"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
optional = false
python-versions = ">=3.7"
files = [
- {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"},
- {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"},
- {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"},
+ {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"},
+ {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"},
+ {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"},
+ {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"},
+ {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"},
+ {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"},
+ {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"},
+ {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"},
+ {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"},
+ {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"},
+ {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"},
+ {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"},
+ {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"},
+ {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"},
+ {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"},
+ {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"},
+ {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"},
+ {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"},
+ {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"},
+ {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"},
+ {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"},
+ {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"},
+ {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"},
+ {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"},
+ {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"},
+ {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"},
+ {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"},
+ {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"},
+ {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"},
+ {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"},
+ {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"},
+ {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"},
+ {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"},
+ {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"},
+ {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"},
+ {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"},
+ {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"},
+ {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"},
+ {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"},
+ {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"},
+ {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"},
+ {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"},
+ {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"},
+ {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"},
+ {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"},
+ {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"},
+ {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"},
+ {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"},
+ {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"},
+ {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"},
+ {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"},
+ {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"},
+ {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"},
+ {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"},
+ {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"},
+ {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"},
+ {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"},
+ {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"},
+ {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"},
+ {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"},
+ {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"},
+ {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"},
+ {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"},
+ {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"},
+ {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"},
+ {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"},
+ {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"},
+ {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"},
+ {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"},
+ {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"},
+ {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"},
+ {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"},
+ {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"},
+ {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"},
+ {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"},
+ {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"},
+ {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"},
+ {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"},
+ {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"},
+ {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"},
+ {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"},
+ {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"},
+ {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"},
+ {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"},
+ {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"},
+ {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"},
+ {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"},
+ {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"},
+ {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"},
+ {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"},
+ {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"},
+ {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"},
]
[[package]]
name = "click"
-version = "8.1.8"
+version = "8.2.1"
description = "Composable command line interface toolkit"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.10"
files = [
- {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
- {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
+ {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"},
+ {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"},
]
[package.dependencies]
@@ -291,74 +291,78 @@ files = [
[[package]]
name = "coverage"
-version = "7.7.1"
+version = "7.8.2"
description = "Code coverage measurement for Python"
optional = false
python-versions = ">=3.9"
files = [
- {file = "coverage-7.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:553ba93f8e3c70e1b0031e4dfea36aba4e2b51fe5770db35e99af8dc5c5a9dfe"},
- {file = "coverage-7.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:44683f2556a56c9a6e673b583763096b8efbd2df022b02995609cf8e64fc8ae0"},
- {file = "coverage-7.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02fad4f8faa4153db76f9246bc95c1d99f054f4e0a884175bff9155cf4f856cb"},
- {file = "coverage-7.7.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c181ceba2e6808ede1e964f7bdc77bd8c7eb62f202c63a48cc541e5ffffccb6"},
- {file = "coverage-7.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b5b207a8b08c6a934b214e364cab2fa82663d4af18981a6c0a9e95f8df7602"},
- {file = "coverage-7.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:25fe40967717bad0ce628a0223f08a10d54c9d739e88c9cbb0f77b5959367542"},
- {file = "coverage-7.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:881cae0f9cbd928c9c001487bb3dcbfd0b0af3ef53ae92180878591053be0cb3"},
- {file = "coverage-7.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90e9141e9221dd6fbc16a2727a5703c19443a8d9bf7d634c792fa0287cee1ab"},
- {file = "coverage-7.7.1-cp310-cp310-win32.whl", hash = "sha256:ae13ed5bf5542d7d4a0a42ff5160e07e84adc44eda65ddaa635c484ff8e55917"},
- {file = "coverage-7.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:171e9977c6a5d2b2be9efc7df1126fd525ce7cad0eb9904fe692da007ba90d81"},
- {file = "coverage-7.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1165490be0069e34e4f99d08e9c5209c463de11b471709dfae31e2a98cbd49fd"},
- {file = "coverage-7.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:44af11c00fd3b19b8809487630f8a0039130d32363239dfd15238e6d37e41a48"},
- {file = "coverage-7.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fbba59022e7c20124d2f520842b75904c7b9f16c854233fa46575c69949fb5b9"},
- {file = "coverage-7.7.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af94fb80e4f159f4d93fb411800448ad87b6039b0500849a403b73a0d36bb5ae"},
- {file = "coverage-7.7.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eae79f8e3501133aa0e220bbc29573910d096795882a70e6f6e6637b09522133"},
- {file = "coverage-7.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e33426a5e1dc7743dd54dfd11d3a6c02c5d127abfaa2edd80a6e352b58347d1a"},
- {file = "coverage-7.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b559adc22486937786731dac69e57296cb9aede7e2687dfc0d2696dbd3b1eb6b"},
- {file = "coverage-7.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b838a91e84e1773c3436f6cc6996e000ed3ca5721799e7789be18830fad009a2"},
- {file = "coverage-7.7.1-cp311-cp311-win32.whl", hash = "sha256:2c492401bdb3a85824669d6a03f57b3dfadef0941b8541f035f83bbfc39d4282"},
- {file = "coverage-7.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:1e6f867379fd033a0eeabb1be0cffa2bd660582b8b0c9478895c509d875a9d9e"},
- {file = "coverage-7.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:eff187177d8016ff6addf789dcc421c3db0d014e4946c1cc3fbf697f7852459d"},
- {file = "coverage-7.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2444fbe1ba1889e0b29eb4d11931afa88f92dc507b7248f45be372775b3cef4f"},
- {file = "coverage-7.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:177d837339883c541f8524683e227adcaea581eca6bb33823a2a1fdae4c988e1"},
- {file = "coverage-7.7.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15d54ecef1582b1d3ec6049b20d3c1a07d5e7f85335d8a3b617c9960b4f807e0"},
- {file = "coverage-7.7.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c82b27c56478d5e1391f2e7b2e7f588d093157fa40d53fd9453a471b1191f2"},
- {file = "coverage-7.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:315ff74b585110ac3b7ab631e89e769d294f303c6d21302a816b3554ed4c81af"},
- {file = "coverage-7.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4dd532dac197d68c478480edde74fd4476c6823355987fd31d01ad9aa1e5fb59"},
- {file = "coverage-7.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:385618003e3d608001676bb35dc67ae3ad44c75c0395d8de5780af7bb35be6b2"},
- {file = "coverage-7.7.1-cp312-cp312-win32.whl", hash = "sha256:63306486fcb5a827449464f6211d2991f01dfa2965976018c9bab9d5e45a35c8"},
- {file = "coverage-7.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:37351dc8123c154fa05b7579fdb126b9f8b1cf42fd6f79ddf19121b7bdd4aa04"},
- {file = "coverage-7.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:eebd927b86761a7068a06d3699fd6c20129becf15bb44282db085921ea0f1585"},
- {file = "coverage-7.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2a79c4a09765d18311c35975ad2eb1ac613c0401afdd9cb1ca4110aeb5dd3c4c"},
- {file = "coverage-7.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b1c65a739447c5ddce5b96c0a388fd82e4bbdff7251396a70182b1d83631019"},
- {file = "coverage-7.7.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:392cc8fd2b1b010ca36840735e2a526fcbd76795a5d44006065e79868cc76ccf"},
- {file = "coverage-7.7.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bb47cc9f07a59a451361a850cb06d20633e77a9118d05fd0f77b1864439461b"},
- {file = "coverage-7.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b4c144c129343416a49378e05c9451c34aae5ccf00221e4fa4f487db0816ee2f"},
- {file = "coverage-7.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bc96441c9d9ca12a790b5ae17d2fa6654da4b3962ea15e0eabb1b1caed094777"},
- {file = "coverage-7.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3d03287eb03186256999539d98818c425c33546ab4901028c8fa933b62c35c3a"},
- {file = "coverage-7.7.1-cp313-cp313-win32.whl", hash = "sha256:8fed429c26b99641dc1f3a79179860122b22745dd9af36f29b141e178925070a"},
- {file = "coverage-7.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:092b134129a8bb940c08b2d9ceb4459af5fb3faea77888af63182e17d89e1cf1"},
- {file = "coverage-7.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3154b369141c3169b8133973ac00f63fcf8d6dbcc297d788d36afbb7811e511"},
- {file = "coverage-7.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:264ff2bcce27a7f455b64ac0dfe097680b65d9a1a293ef902675fa8158d20b24"},
- {file = "coverage-7.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba8480ebe401c2f094d10a8c4209b800a9b77215b6c796d16b6ecdf665048950"},
- {file = "coverage-7.7.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:520af84febb6bb54453e7fbb730afa58c7178fd018c398a8fcd8e269a79bf96d"},
- {file = "coverage-7.7.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88d96127ae01ff571d465d4b0be25c123789cef88ba0879194d673fdea52f54e"},
- {file = "coverage-7.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0ce92c5a9d7007d838456f4b77ea159cb628187a137e1895331e530973dcf862"},
- {file = "coverage-7.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0dab4ef76d7b14f432057fdb7a0477e8bffca0ad39ace308be6e74864e632271"},
- {file = "coverage-7.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7e688010581dbac9cab72800e9076e16f7cccd0d89af5785b70daa11174e94de"},
- {file = "coverage-7.7.1-cp313-cp313t-win32.whl", hash = "sha256:e52eb31ae3afacdacfe50705a15b75ded67935770c460d88c215a9c0c40d0e9c"},
- {file = "coverage-7.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a6b6b3bd121ee2ec4bd35039319f3423d0be282b9752a5ae9f18724bc93ebe7c"},
- {file = "coverage-7.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:34a3bf6b92e6621fc4dcdaab353e173ccb0ca9e4bfbcf7e49a0134c86c9cd303"},
- {file = "coverage-7.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d6874929d624d3a670f676efafbbc747f519a6121b581dd41d012109e70a5ebd"},
- {file = "coverage-7.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ba5ff236c87a7b7aa1441a216caf44baee14cbfbd2256d306f926d16b026578"},
- {file = "coverage-7.7.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452735fafe8ff5918236d5fe1feac322b359e57692269c75151f9b4ee4b7e1bc"},
- {file = "coverage-7.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5f99a93cecf799738e211f9746dc83749b5693538fbfac279a61682ba309387"},
- {file = "coverage-7.7.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:11dd6f52c2a7ce8bf0a5f3b6e4a8eb60e157ffedc3c4b4314a41c1dfbd26ce58"},
- {file = "coverage-7.7.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:b52edb940d087e2a96e73c1523284a2e94a4e66fa2ea1e2e64dddc67173bad94"},
- {file = "coverage-7.7.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d2e73e2ac468536197e6b3ab79bc4a5c9da0f078cd78cfcc7fe27cf5d1195ef0"},
- {file = "coverage-7.7.1-cp39-cp39-win32.whl", hash = "sha256:18f544356bceef17cc55fcf859e5664f06946c1b68efcea6acdc50f8f6a6e776"},
- {file = "coverage-7.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:d66ff48ab3bb6f762a153e29c0fc1eb5a62a260217bc64470d7ba602f5886d20"},
- {file = "coverage-7.7.1-pp39.pp310.pp311-none-any.whl", hash = "sha256:5b7b02e50d54be6114cc4f6a3222fec83164f7c42772ba03b520138859b5fde1"},
- {file = "coverage-7.7.1-py3-none-any.whl", hash = "sha256:822fa99dd1ac686061e1219b67868e25d9757989cf2259f735a4802497d6da31"},
- {file = "coverage-7.7.1.tar.gz", hash = "sha256:199a1272e642266b90c9f40dec7fd3d307b51bf639fa0d15980dc0b3246c1393"},
+ {file = "coverage-7.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd8ec21e1443fd7a447881332f7ce9d35b8fbd2849e761bb290b584535636b0a"},
+ {file = "coverage-7.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c26c2396674816deaeae7ded0e2b42c26537280f8fe313335858ffff35019be"},
+ {file = "coverage-7.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1aec326ed237e5880bfe69ad41616d333712c7937bcefc1343145e972938f9b3"},
+ {file = "coverage-7.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e818796f71702d7a13e50c70de2a1924f729228580bcba1607cccf32eea46e6"},
+ {file = "coverage-7.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:546e537d9e24efc765c9c891328f30f826e3e4808e31f5d0f87c4ba12bbd1622"},
+ {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab9b09a2349f58e73f8ebc06fac546dd623e23b063e5398343c5270072e3201c"},
+ {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fd51355ab8a372d89fb0e6a31719e825cf8df8b6724bee942fb5b92c3f016ba3"},
+ {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0774df1e093acb6c9e4d58bce7f86656aeed6c132a16e2337692c12786b32404"},
+ {file = "coverage-7.8.2-cp310-cp310-win32.whl", hash = "sha256:00f2e2f2e37f47e5f54423aeefd6c32a7dbcedc033fcd3928a4f4948e8b96af7"},
+ {file = "coverage-7.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:145b07bea229821d51811bf15eeab346c236d523838eda395ea969d120d13347"},
+ {file = "coverage-7.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b99058eef42e6a8dcd135afb068b3d53aff3921ce699e127602efff9956457a9"},
+ {file = "coverage-7.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5feb7f2c3e6ea94d3b877def0270dff0947b8d8c04cfa34a17be0a4dc1836879"},
+ {file = "coverage-7.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:670a13249b957bb9050fab12d86acef7bf8f6a879b9d1a883799276e0d4c674a"},
+ {file = "coverage-7.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bdc8bf760459a4a4187b452213e04d039990211f98644c7292adf1e471162b5"},
+ {file = "coverage-7.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07a989c867986c2a75f158f03fdb413128aad29aca9d4dbce5fc755672d96f11"},
+ {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2db10dedeb619a771ef0e2949ccba7b75e33905de959c2643a4607bef2f3fb3a"},
+ {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e6ea7dba4e92926b7b5f0990634b78ea02f208d04af520c73a7c876d5a8d36cb"},
+ {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ef2f22795a7aca99fc3c84393a55a53dd18ab8c93fb431004e4d8f0774150f54"},
+ {file = "coverage-7.8.2-cp311-cp311-win32.whl", hash = "sha256:641988828bc18a6368fe72355df5f1703e44411adbe49bba5644b941ce6f2e3a"},
+ {file = "coverage-7.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8ab4a51cb39dc1933ba627e0875046d150e88478dbe22ce145a68393e9652975"},
+ {file = "coverage-7.8.2-cp311-cp311-win_arm64.whl", hash = "sha256:8966a821e2083c74d88cca5b7dcccc0a3a888a596a04c0b9668a891de3a0cc53"},
+ {file = "coverage-7.8.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2f6fe3654468d061942591aef56686131335b7a8325684eda85dacdf311356c"},
+ {file = "coverage-7.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76090fab50610798cc05241bf83b603477c40ee87acd358b66196ab0ca44ffa1"},
+ {file = "coverage-7.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd0a0a5054be160777a7920b731a0570284db5142abaaf81bcbb282b8d99279"},
+ {file = "coverage-7.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da23ce9a3d356d0affe9c7036030b5c8f14556bd970c9b224f9c8205505e3b99"},
+ {file = "coverage-7.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9392773cffeb8d7e042a7b15b82a414011e9d2b5fdbbd3f7e6a6b17d5e21b20"},
+ {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:876cbfd0b09ce09d81585d266c07a32657beb3eaec896f39484b631555be0fe2"},
+ {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3da9b771c98977a13fbc3830f6caa85cae6c9c83911d24cb2d218e9394259c57"},
+ {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a990f6510b3292686713bfef26d0049cd63b9c7bb17e0864f133cbfd2e6167f"},
+ {file = "coverage-7.8.2-cp312-cp312-win32.whl", hash = "sha256:bf8111cddd0f2b54d34e96613e7fbdd59a673f0cf5574b61134ae75b6f5a33b8"},
+ {file = "coverage-7.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:86a323a275e9e44cdf228af9b71c5030861d4d2610886ab920d9945672a81223"},
+ {file = "coverage-7.8.2-cp312-cp312-win_arm64.whl", hash = "sha256:820157de3a589e992689ffcda8639fbabb313b323d26388d02e154164c57b07f"},
+ {file = "coverage-7.8.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ea561010914ec1c26ab4188aef8b1567272ef6de096312716f90e5baa79ef8ca"},
+ {file = "coverage-7.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cb86337a4fcdd0e598ff2caeb513ac604d2f3da6d53df2c8e368e07ee38e277d"},
+ {file = "coverage-7.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a4636ddb666971345541b59899e969f3b301143dd86b0ddbb570bd591f1e85"},
+ {file = "coverage-7.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5040536cf9b13fb033f76bcb5e1e5cb3b57c4807fef37db9e0ed129c6a094257"},
+ {file = "coverage-7.8.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc67994df9bcd7e0150a47ef41278b9e0a0ea187caba72414b71dc590b99a108"},
+ {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e6c86888fd076d9e0fe848af0a2142bf606044dc5ceee0aa9eddb56e26895a0"},
+ {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:684ca9f58119b8e26bef860db33524ae0365601492e86ba0b71d513f525e7050"},
+ {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8165584ddedb49204c4e18da083913bdf6a982bfb558632a79bdaadcdafd0d48"},
+ {file = "coverage-7.8.2-cp313-cp313-win32.whl", hash = "sha256:34759ee2c65362163699cc917bdb2a54114dd06d19bab860725f94ef45a3d9b7"},
+ {file = "coverage-7.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:2f9bc608fbafaee40eb60a9a53dbfb90f53cc66d3d32c2849dc27cf5638a21e3"},
+ {file = "coverage-7.8.2-cp313-cp313-win_arm64.whl", hash = "sha256:9fe449ee461a3b0c7105690419d0b0aba1232f4ff6d120a9e241e58a556733f7"},
+ {file = "coverage-7.8.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8369a7c8ef66bded2b6484053749ff220dbf83cba84f3398c84c51a6f748a008"},
+ {file = "coverage-7.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:159b81df53a5fcbc7d45dae3adad554fdbde9829a994e15227b3f9d816d00b36"},
+ {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6fcbbd35a96192d042c691c9e0c49ef54bd7ed865846a3c9d624c30bb67ce46"},
+ {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05364b9cc82f138cc86128dc4e2e1251c2981a2218bfcd556fe6b0fbaa3501be"},
+ {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46d532db4e5ff3979ce47d18e2fe8ecad283eeb7367726da0e5ef88e4fe64740"},
+ {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4000a31c34932e7e4fa0381a3d6deb43dc0c8f458e3e7ea6502e6238e10be625"},
+ {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:43ff5033d657cd51f83015c3b7a443287250dc14e69910577c3e03bd2e06f27b"},
+ {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94316e13f0981cbbba132c1f9f365cac1d26716aaac130866ca812006f662199"},
+ {file = "coverage-7.8.2-cp313-cp313t-win32.whl", hash = "sha256:3f5673888d3676d0a745c3d0e16da338c5eea300cb1f4ada9c872981265e76d8"},
+ {file = "coverage-7.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:2c08b05ee8d7861e45dc5a2cc4195c8c66dca5ac613144eb6ebeaff2d502e73d"},
+ {file = "coverage-7.8.2-cp313-cp313t-win_arm64.whl", hash = "sha256:1e1448bb72b387755e1ff3ef1268a06617afd94188164960dba8d0245a46004b"},
+ {file = "coverage-7.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:496948261eaac5ac9cf43f5d0a9f6eb7a6d4cb3bedb2c5d294138142f5c18f2a"},
+ {file = "coverage-7.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eacd2de0d30871eff893bab0b67840a96445edcb3c8fd915e6b11ac4b2f3fa6d"},
+ {file = "coverage-7.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b039ffddc99ad65d5078ef300e0c7eed08c270dc26570440e3ef18beb816c1ca"},
+ {file = "coverage-7.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e49824808d4375ede9dd84e9961a59c47f9113039f1a525e6be170aa4f5c34d"},
+ {file = "coverage-7.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b069938961dfad881dc2f8d02b47645cd2f455d3809ba92a8a687bf513839787"},
+ {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:de77c3ba8bb686d1c411e78ee1b97e6e0b963fb98b1637658dd9ad2c875cf9d7"},
+ {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1676628065a498943bd3f64f099bb573e08cf1bc6088bbe33cf4424e0876f4b3"},
+ {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8e1a26e7e50076e35f7afafde570ca2b4d7900a491174ca357d29dece5aacee7"},
+ {file = "coverage-7.8.2-cp39-cp39-win32.whl", hash = "sha256:6782a12bf76fa61ad9350d5a6ef5f3f020b57f5e6305cbc663803f2ebd0f270a"},
+ {file = "coverage-7.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:1efa4166ba75ccefd647f2d78b64f53f14fb82622bc94c5a5cb0a622f50f1c9e"},
+ {file = "coverage-7.8.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:ec455eedf3ba0bbdf8f5a570012617eb305c63cb9f03428d39bf544cb2b94837"},
+ {file = "coverage-7.8.2-py3-none-any.whl", hash = "sha256:726f32ee3713f7359696331a18daf0c3b3a70bb0ae71141b9d3c52be7c595e32"},
+ {file = "coverage-7.8.2.tar.gz", hash = "sha256:a886d531373a1f6ff9fad2a2ba4a045b68467b779ae729ee0b3b10ac20033b27"},
]
[package.dependencies]
@@ -367,6 +371,21 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1
[package.extras]
toml = ["tomli"]
+[[package]]
+name = "dataclasses-json"
+version = "0.6.7"
+description = "Easily serialize dataclasses to and from JSON."
+optional = false
+python-versions = "<4.0,>=3.7"
+files = [
+ {file = "dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a"},
+ {file = "dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0"},
+]
+
+[package.dependencies]
+marshmallow = ">=3.18.0,<4.0.0"
+typing-inspect = ">=0.4.0,<1"
+
[[package]]
name = "distlib"
version = "0.3.9"
@@ -382,27 +401,55 @@ files = [
name = "distro"
version = "1.9.0"
description = "Distro - an OS platform information API"
-optional = false
+optional = true
python-versions = ">=3.6"
files = [
{file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"},
{file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"},
]
+[[package]]
+name = "einops"
+version = "0.8.1"
+description = "A new flavour of deep learning operations"
+optional = true
+python-versions = ">=3.8"
+files = [
+ {file = "einops-0.8.1-py3-none-any.whl", hash = "sha256:919387eb55330f5757c6bea9165c5ff5cfe63a642682ea788a6d472576d81737"},
+ {file = "einops-0.8.1.tar.gz", hash = "sha256:de5d960a7a761225532e0f1959e5315ebeafc0cd43394732f103ca44b9837e84"},
+]
+
[[package]]
name = "exceptiongroup"
-version = "1.2.2"
+version = "1.3.0"
description = "Backport of PEP 654 (exception groups)"
optional = false
python-versions = ">=3.7"
files = [
- {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"},
- {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"},
+ {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"},
+ {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"},
]
+[package.dependencies]
+typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""}
+
[package.extras]
test = ["pytest (>=6)"]
+[[package]]
+name = "execnet"
+version = "2.1.1"
+description = "execnet: rapid multi-Python deployment"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"},
+ {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"},
+]
+
+[package.extras]
+testing = ["hatch", "pre-commit", "pytest", "tox"]
+
[[package]]
name = "filelock"
version = "3.18.0"
@@ -423,7 +470,7 @@ typing = ["typing-extensions (>=4.12.2)"]
name = "filetype"
version = "1.2.0"
description = "Infer file type and MIME type of any file/buffer. No external dependencies."
-optional = false
+optional = true
python-versions = "*"
files = [
{file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"},
@@ -432,13 +479,13 @@ files = [
[[package]]
name = "fsspec"
-version = "2025.3.2"
+version = "2025.5.1"
description = "File-system specification"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
- {file = "fsspec-2025.3.2-py3-none-any.whl", hash = "sha256:2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711"},
- {file = "fsspec-2025.3.2.tar.gz", hash = "sha256:e52c77ef398680bbd6a98c0e628fbc469491282981209907bbc8aea76a04fdc6"},
+ {file = "fsspec-2025.5.1-py3-none-any.whl", hash = "sha256:24d3a2e663d5fc735ab256263c4075f374a174c3410c0b25e5bd1970bceaa462"},
+ {file = "fsspec-2025.5.1.tar.gz", hash = "sha256:2e55e47a540b91843b755e83ded97c6e897fa0942b11490113f09e9c443c2475"},
]
[package.extras]
@@ -473,7 +520,7 @@ tqdm = ["tqdm"]
name = "ftfy"
version = "6.3.1"
description = "Fixes mojibake and other problems with Unicode, after the fact"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
{file = "ftfy-6.3.1-py3-none-any.whl", hash = "sha256:7c70eb532015cd2f9adb53f101fb6c7945988d023a085d127d1573dc49dd0083"},
@@ -519,13 +566,13 @@ dev = ["flake8", "markdown", "twine", "wheel"]
[[package]]
name = "google-auth"
-version = "2.39.0"
+version = "2.40.2"
description = "Google Authentication Library"
-optional = false
+optional = true
python-versions = ">=3.7"
files = [
- {file = "google_auth-2.39.0-py2.py3-none-any.whl", hash = "sha256:0150b6711e97fb9f52fe599f55648950cc4540015565d8fbb31be2ad6e1548a2"},
- {file = "google_auth-2.39.0.tar.gz", hash = "sha256:73222d43cdc35a3aeacbfdcaf73142a97839f10de930550d89ebfe1d0a00cde7"},
+ {file = "google_auth-2.40.2-py2.py3-none-any.whl", hash = "sha256:f7e568d42eedfded58734f6a60c58321896a621f7c116c411550a4b4a13da90b"},
+ {file = "google_auth-2.40.2.tar.gz", hash = "sha256:a33cde547a2134273226fa4b853883559947ebe9207521f7afc707efbf690f58"},
]
[package.dependencies]
@@ -545,13 +592,13 @@ urllib3 = ["packaging", "urllib3"]
[[package]]
name = "google-genai"
-version = "1.12.1"
+version = "1.18.0"
description = "GenAI Python SDK"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
- {file = "google_genai-1.12.1-py3-none-any.whl", hash = "sha256:7cbc1bc029712946ce41bcf80c0eaa89eb8c09c308efbbfe30fd491f402c258a"},
- {file = "google_genai-1.12.1.tar.gz", hash = "sha256:5c7eda422360643ce602a3f6b23152470ec1039310ef40080cbe4e71237f6391"},
+ {file = "google_genai-1.18.0-py3-none-any.whl", hash = "sha256:3527bb93c8306e725401aca0a0a684610bbf1ef9aa61c2ed3333a695f43dc9af"},
+ {file = "google_genai-1.18.0.tar.gz", hash = "sha256:242a02df3248e291f03e37019ce5a1c8a21a14ec245b59668c9f2b4d8965295e"},
]
[package.dependencies]
@@ -565,13 +612,13 @@ websockets = ">=13.0.0,<15.1.0"
[[package]]
name = "griffe"
-version = "1.6.2"
+version = "1.7.3"
description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API."
optional = false
python-versions = ">=3.9"
files = [
- {file = "griffe-1.6.2-py3-none-any.whl", hash = "sha256:6399f7e663150e4278a312a8e8a14d2f3d7bd86e2ef2f8056a1058e38579c2ee"},
- {file = "griffe-1.6.2.tar.gz", hash = "sha256:3a46fa7bd83280909b63c12b9a975732a927dd97809efe5b7972290b606c5d91"},
+ {file = "griffe-1.7.3-py3-none-any.whl", hash = "sha256:c6b3ee30c2f0f17f30bcdef5068d6ab7a2a4f1b8bf1a3e74b56fffd21e1c5f75"},
+ {file = "griffe-1.7.3.tar.gz", hash = "sha256:52ee893c6a3a968b639ace8015bec9d36594961e156e23315c8e8e51401fa50b"},
]
[package.dependencies]
@@ -581,18 +628,38 @@ colorama = ">=0.4"
name = "h11"
version = "0.16.0"
description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
-optional = false
+optional = true
python-versions = ">=3.8"
files = [
{file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"},
{file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"},
]
+[[package]]
+name = "hf-xet"
+version = "1.1.2"
+description = "Fast transfer of large files with the Hugging Face Hub."
+optional = true
+python-versions = ">=3.8"
+files = [
+ {file = "hf_xet-1.1.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:dfd1873fd648488c70735cb60f7728512bca0e459e61fcd107069143cd798469"},
+ {file = "hf_xet-1.1.2-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:29b584983b2d977c44157d9241dcf0fd50acde0b7bff8897fe4386912330090d"},
+ {file = "hf_xet-1.1.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b29ac84298147fe9164cc55ad994ba47399f90b5d045b0b803b99cf5f06d8ec"},
+ {file = "hf_xet-1.1.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d921ba32615676e436a0d15e162331abc9ed43d440916b1d836dc27ce1546173"},
+ {file = "hf_xet-1.1.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d9b03c34e13c44893ab6e8fea18ee8d2a6878c15328dd3aabedbdd83ee9f2ed3"},
+ {file = "hf_xet-1.1.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:01b18608955b3d826307d37da8bd38b28a46cd2d9908b3a3655d1363274f941a"},
+ {file = "hf_xet-1.1.2-cp37-abi3-win_amd64.whl", hash = "sha256:3562902c81299b09f3582ddfb324400c6a901a2f3bc854f83556495755f4954c"},
+ {file = "hf_xet-1.1.2.tar.gz", hash = "sha256:3712d6d4819d3976a1c18e36db9f503e296283f9363af818f50703506ed63da3"},
+]
+
+[package.extras]
+tests = ["pytest"]
+
[[package]]
name = "httpcore"
version = "1.0.9"
description = "A minimal low-level HTTP client."
-optional = false
+optional = true
python-versions = ">=3.8"
files = [
{file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"},
@@ -613,7 +680,7 @@ trio = ["trio (>=0.22.0,<1.0)"]
name = "httpx"
version = "0.28.1"
description = "The next generation HTTP client."
-optional = false
+optional = true
python-versions = ">=3.8"
files = [
{file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"},
@@ -635,18 +702,19 @@ zstd = ["zstandard (>=0.18.0)"]
[[package]]
name = "huggingface-hub"
-version = "0.30.2"
+version = "0.32.3"
description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub"
-optional = false
+optional = true
python-versions = ">=3.8.0"
files = [
- {file = "huggingface_hub-0.30.2-py3-none-any.whl", hash = "sha256:68ff05969927058cfa41df4f2155d4bb48f5f54f719dd0390103eefa9b191e28"},
- {file = "huggingface_hub-0.30.2.tar.gz", hash = "sha256:9a7897c5b6fd9dad3168a794a8998d6378210f5b9688d0dfc180b1a228dc2466"},
+ {file = "huggingface_hub-0.32.3-py3-none-any.whl", hash = "sha256:e46f7ea7fe2b5e5f67cc4e37eb201140091946a314d7c2b134a9673dadd80b6a"},
+ {file = "huggingface_hub-0.32.3.tar.gz", hash = "sha256:752c889ebf3a63cbd39803f6d87ccc135a463bbcb36abfa2faff0ccbf1cec087"},
]
[package.dependencies]
filelock = "*"
fsspec = ">=2023.5.0"
+hf-xet = {version = ">=1.1.2,<2.0.0", markers = "platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"arm64\" or platform_machine == \"aarch64\""}
packaging = ">=20.9"
pyyaml = ">=5.1"
requests = "*"
@@ -654,29 +722,31 @@ tqdm = ">=4.42.1"
typing-extensions = ">=3.7.4.3"
[package.extras]
-all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
+all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "authlib (>=1.3.2)", "fastapi", "gradio (>=4.0.0)", "httpx", "itsdangerous", "jedi", "libcst (==1.4.0)", "mypy (==1.15.0)", "mypy (>=1.14.1,<1.15.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
cli = ["InquirerPy (==0.3.4)"]
-dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
+dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "authlib (>=1.3.2)", "fastapi", "gradio (>=4.0.0)", "httpx", "itsdangerous", "jedi", "libcst (==1.4.0)", "mypy (==1.15.0)", "mypy (>=1.14.1,<1.15.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"]
hf-transfer = ["hf-transfer (>=0.1.4)"]
-hf-xet = ["hf-xet (>=0.1.4)"]
+hf-xet = ["hf-xet (>=1.1.2,<2.0.0)"]
inference = ["aiohttp"]
-quality = ["libcst (==1.4.0)", "mypy (==1.5.1)", "ruff (>=0.9.0)"]
+mcp = ["aiohttp", "mcp (>=1.8.0)", "typer"]
+oauth = ["authlib (>=1.3.2)", "fastapi", "httpx", "itsdangerous"]
+quality = ["libcst (==1.4.0)", "mypy (==1.15.0)", "mypy (>=1.14.1,<1.15.0)", "ruff (>=0.9.0)"]
tensorflow = ["graphviz", "pydot", "tensorflow"]
tensorflow-testing = ["keras (<3.0)", "tensorflow"]
-testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"]
+testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "authlib (>=1.3.2)", "fastapi", "gradio (>=4.0.0)", "httpx", "itsdangerous", "jedi", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"]
torch = ["safetensors[torch]", "torch"]
typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"]
[[package]]
name = "identify"
-version = "2.6.9"
+version = "2.6.12"
description = "File identification library for Python"
optional = false
python-versions = ">=3.9"
files = [
- {file = "identify-2.6.9-py2.py3-none-any.whl", hash = "sha256:c98b4322da415a8e5a70ff6e51fbc2d2932c015532d77e9f8537b4ba7813b150"},
- {file = "identify-2.6.9.tar.gz", hash = "sha256:d40dfe3142a1421d8518e3d3985ef5ac42890683e32306ad614a29490abeb6bf"},
+ {file = "identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2"},
+ {file = "identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6"},
]
[package.extras]
@@ -726,109 +796,110 @@ i18n = ["Babel (>=2.7)"]
[[package]]
name = "jiter"
-version = "0.9.0"
+version = "0.10.0"
description = "Fast iterable JSON parser."
-optional = false
-python-versions = ">=3.8"
+optional = true
+python-versions = ">=3.9"
files = [
- {file = "jiter-0.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:816ec9b60fdfd1fec87da1d7ed46c66c44ffec37ab2ef7de5b147b2fce3fd5ad"},
- {file = "jiter-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b1d3086f8a3ee0194ecf2008cf81286a5c3e540d977fa038ff23576c023c0ea"},
- {file = "jiter-0.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1339f839b91ae30b37c409bf16ccd3dc453e8b8c3ed4bd1d6a567193651a4a51"},
- {file = "jiter-0.9.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ffba79584b3b670fefae66ceb3a28822365d25b7bf811e030609a3d5b876f538"},
- {file = "jiter-0.9.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cfc7d0a8e899089d11f065e289cb5b2daf3d82fbe028f49b20d7b809193958d"},
- {file = "jiter-0.9.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e00a1a2bbfaaf237e13c3d1592356eab3e9015d7efd59359ac8b51eb56390a12"},
- {file = "jiter-0.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1d9870561eb26b11448854dce0ff27a9a27cb616b632468cafc938de25e9e51"},
- {file = "jiter-0.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9872aeff3f21e437651df378cb75aeb7043e5297261222b6441a620218b58708"},
- {file = "jiter-0.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1fd19112d1049bdd47f17bfbb44a2c0001061312dcf0e72765bfa8abd4aa30e5"},
- {file = "jiter-0.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6ef5da104664e526836070e4a23b5f68dec1cc673b60bf1edb1bfbe8a55d0678"},
- {file = "jiter-0.9.0-cp310-cp310-win32.whl", hash = "sha256:cb12e6d65ebbefe5518de819f3eda53b73187b7089040b2d17f5b39001ff31c4"},
- {file = "jiter-0.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:c43ca669493626d8672be3b645dbb406ef25af3f4b6384cfd306da7eb2e70322"},
- {file = "jiter-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6c4d99c71508912a7e556d631768dcdef43648a93660670986916b297f1c54af"},
- {file = "jiter-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f60fb8ce7df529812bf6c625635a19d27f30806885139e367af93f6e734ef58"},
- {file = "jiter-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51c4e1a4f8ea84d98b7b98912aa4290ac3d1eabfde8e3c34541fae30e9d1f08b"},
- {file = "jiter-0.9.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f4c677c424dc76684fea3e7285a7a2a7493424bea89ac441045e6a1fb1d7b3b"},
- {file = "jiter-0.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2221176dfec87f3470b21e6abca056e6b04ce9bff72315cb0b243ca9e835a4b5"},
- {file = "jiter-0.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c7adb66f899ffa25e3c92bfcb593391ee1947dbdd6a9a970e0d7e713237d572"},
- {file = "jiter-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c98d27330fdfb77913c1097a7aab07f38ff2259048949f499c9901700789ac15"},
- {file = "jiter-0.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eda3f8cc74df66892b1d06b5d41a71670c22d95a1ca2cbab73654745ce9d0419"},
- {file = "jiter-0.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd5ab5ddc11418dce28343123644a100f487eaccf1de27a459ab36d6cca31043"},
- {file = "jiter-0.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42f8a68a69f047b310319ef8e2f52fdb2e7976fb3313ef27df495cf77bcad965"},
- {file = "jiter-0.9.0-cp311-cp311-win32.whl", hash = "sha256:a25519efb78a42254d59326ee417d6f5161b06f5da827d94cf521fed961b1ff2"},
- {file = "jiter-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:923b54afdd697dfd00d368b7ccad008cccfeb1efb4e621f32860c75e9f25edbd"},
- {file = "jiter-0.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7b46249cfd6c48da28f89eb0be3f52d6fdb40ab88e2c66804f546674e539ec11"},
- {file = "jiter-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:609cf3c78852f1189894383cf0b0b977665f54cb38788e3e6b941fa6d982c00e"},
- {file = "jiter-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d726a3890a54561e55a9c5faea1f7655eda7f105bd165067575ace6e65f80bb2"},
- {file = "jiter-0.9.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e89dc075c1fef8fa9be219e249f14040270dbc507df4215c324a1839522ea75"},
- {file = "jiter-0.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e8ffa3c353b1bc4134f96f167a2082494351e42888dfcf06e944f2729cbe1d"},
- {file = "jiter-0.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203f28a72a05ae0e129b3ed1f75f56bc419d5f91dfacd057519a8bd137b00c42"},
- {file = "jiter-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca1a02ad60ec30bb230f65bc01f611c8608b02d269f998bc29cca8619a919dc"},
- {file = "jiter-0.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:237e5cee4d5d2659aaf91bbf8ec45052cc217d9446070699441a91b386ae27dc"},
- {file = "jiter-0.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:528b6b71745e7326eed73c53d4aa57e2a522242320b6f7d65b9c5af83cf49b6e"},
- {file = "jiter-0.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9f48e86b57bc711eb5acdfd12b6cb580a59cc9a993f6e7dcb6d8b50522dcd50d"},
- {file = "jiter-0.9.0-cp312-cp312-win32.whl", hash = "sha256:699edfde481e191d81f9cf6d2211debbfe4bd92f06410e7637dffb8dd5dfde06"},
- {file = "jiter-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0"},
- {file = "jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7"},
- {file = "jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b"},
- {file = "jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69"},
- {file = "jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103"},
- {file = "jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635"},
- {file = "jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4"},
- {file = "jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d"},
- {file = "jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3"},
- {file = "jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5"},
- {file = "jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d"},
- {file = "jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53"},
- {file = "jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7"},
- {file = "jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001"},
- {file = "jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a"},
- {file = "jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf"},
- {file = "jiter-0.9.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4a2d16360d0642cd68236f931b85fe50288834c383492e4279d9f1792e309571"},
- {file = "jiter-0.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e84ed1c9c9ec10bbb8c37f450077cbe3c0d4e8c2b19f0a49a60ac7ace73c7452"},
- {file = "jiter-0.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f3c848209ccd1bfa344a1240763975ca917de753c7875c77ec3034f4151d06c"},
- {file = "jiter-0.9.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7825f46e50646bee937e0f849d14ef3a417910966136f59cd1eb848b8b5bb3e4"},
- {file = "jiter-0.9.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d82a811928b26d1a6311a886b2566f68ccf2b23cf3bfed042e18686f1f22c2d7"},
- {file = "jiter-0.9.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c058ecb51763a67f019ae423b1cbe3fa90f7ee6280c31a1baa6ccc0c0e2d06e"},
- {file = "jiter-0.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9897115ad716c48f0120c1f0c4efae348ec47037319a6c63b2d7838bb53aaef4"},
- {file = "jiter-0.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:351f4c90a24c4fb8c87c6a73af2944c440494ed2bea2094feecacb75c50398ae"},
- {file = "jiter-0.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d45807b0f236c485e1e525e2ce3a854807dfe28ccf0d013dd4a563395e28008a"},
- {file = "jiter-0.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1537a890724ba00fdba21787010ac6f24dad47f763410e9e1093277913592784"},
- {file = "jiter-0.9.0-cp38-cp38-win32.whl", hash = "sha256:e3630ec20cbeaddd4b65513fa3857e1b7c4190d4481ef07fb63d0fad59033321"},
- {file = "jiter-0.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:2685f44bf80e95f8910553bf2d33b9c87bf25fceae6e9f0c1355f75d2922b0ee"},
- {file = "jiter-0.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:9ef340fae98065071ccd5805fe81c99c8f80484e820e40043689cf97fb66b3e2"},
- {file = "jiter-0.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:efb767d92c63b2cd9ec9f24feeb48f49574a713870ec87e9ba0c2c6e9329c3e2"},
- {file = "jiter-0.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:113f30f87fb1f412510c6d7ed13e91422cfd329436364a690c34c8b8bd880c42"},
- {file = "jiter-0.9.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8793b6df019b988526f5a633fdc7456ea75e4a79bd8396a3373c371fc59f5c9b"},
- {file = "jiter-0.9.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a9aaa5102dba4e079bb728076fadd5a2dca94c05c04ce68004cfd96f128ea34"},
- {file = "jiter-0.9.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d838650f6ebaf4ccadfb04522463e74a4c378d7e667e0eb1865cfe3990bfac49"},
- {file = "jiter-0.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0194f813efdf4b8865ad5f5c5f50f8566df7d770a82c51ef593d09e0b347020"},
- {file = "jiter-0.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7954a401d0a8a0b8bc669199db78af435aae1e3569187c2939c477c53cb6a0a"},
- {file = "jiter-0.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4feafe787eb8a8d98168ab15637ca2577f6ddf77ac6c8c66242c2d028aa5420e"},
- {file = "jiter-0.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:27cd1f2e8bb377f31d3190b34e4328d280325ad7ef55c6ac9abde72f79e84d2e"},
- {file = "jiter-0.9.0-cp39-cp39-win32.whl", hash = "sha256:161d461dcbe658cf0bd0aa375b30a968b087cdddc624fc585f3867c63c6eca95"},
- {file = "jiter-0.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:e8b36d8a16a61993be33e75126ad3d8aa29cf450b09576f3c427d27647fcb4aa"},
- {file = "jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893"},
+ {file = "jiter-0.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cd2fb72b02478f06a900a5782de2ef47e0396b3e1f7d5aba30daeb1fce66f303"},
+ {file = "jiter-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32bb468e3af278f095d3fa5b90314728a6916d89ba3d0ffb726dd9bf7367285e"},
+ {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8b3e0068c26ddedc7abc6fac37da2d0af16b921e288a5a613f4b86f050354f"},
+ {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:286299b74cc49e25cd42eea19b72aa82c515d2f2ee12d11392c56d8701f52224"},
+ {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ed5649ceeaeffc28d87fb012d25a4cd356dcd53eff5acff1f0466b831dda2a7"},
+ {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2ab0051160cb758a70716448908ef14ad476c3774bd03ddce075f3c1f90a3d6"},
+ {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03997d2f37f6b67d2f5c475da4412be584e1cec273c1cfc03d642c46db43f8cf"},
+ {file = "jiter-0.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c404a99352d839fed80d6afd6c1d66071f3bacaaa5c4268983fc10f769112e90"},
+ {file = "jiter-0.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66e989410b6666d3ddb27a74c7e50d0829704ede652fd4c858e91f8d64b403d0"},
+ {file = "jiter-0.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b532d3af9ef4f6374609a3bcb5e05a1951d3bf6190dc6b176fdb277c9bbf15ee"},
+ {file = "jiter-0.10.0-cp310-cp310-win32.whl", hash = "sha256:da9be20b333970e28b72edc4dff63d4fec3398e05770fb3205f7fb460eb48dd4"},
+ {file = "jiter-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:f59e533afed0c5b0ac3eba20d2548c4a550336d8282ee69eb07b37ea526ee4e5"},
+ {file = "jiter-0.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3bebe0c558e19902c96e99217e0b8e8b17d570906e72ed8a87170bc290b1e978"},
+ {file = "jiter-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:558cc7e44fd8e507a236bee6a02fa17199ba752874400a0ca6cd6e2196cdb7dc"},
+ {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d613e4b379a07d7c8453c5712ce7014e86c6ac93d990a0b8e7377e18505e98d"},
+ {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f62cf8ba0618eda841b9bf61797f21c5ebd15a7a1e19daab76e4e4b498d515b2"},
+ {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:919d139cdfa8ae8945112398511cb7fca58a77382617d279556b344867a37e61"},
+ {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13ddbc6ae311175a3b03bd8994881bc4635c923754932918e18da841632349db"},
+ {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c440ea003ad10927a30521a9062ce10b5479592e8a70da27f21eeb457b4a9c5"},
+ {file = "jiter-0.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc347c87944983481e138dea467c0551080c86b9d21de6ea9306efb12ca8f606"},
+ {file = "jiter-0.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:13252b58c1f4d8c5b63ab103c03d909e8e1e7842d302473f482915d95fefd605"},
+ {file = "jiter-0.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7d1bbf3c465de4a24ab12fb7766a0003f6f9bce48b8b6a886158c4d569452dc5"},
+ {file = "jiter-0.10.0-cp311-cp311-win32.whl", hash = "sha256:db16e4848b7e826edca4ccdd5b145939758dadf0dc06e7007ad0e9cfb5928ae7"},
+ {file = "jiter-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c9c1d5f10e18909e993f9641f12fe1c77b3e9b533ee94ffa970acc14ded3812"},
+ {file = "jiter-0.10.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1e274728e4a5345a6dde2d343c8da018b9d4bd4350f5a472fa91f66fda44911b"},
+ {file = "jiter-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7202ae396446c988cb2a5feb33a543ab2165b786ac97f53b59aafb803fef0744"},
+ {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ba7722d6748b6920ed02a8f1726fb4b33e0fd2f3f621816a8b486c66410ab2"},
+ {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:371eab43c0a288537d30e1f0b193bc4eca90439fc08a022dd83e5e07500ed026"},
+ {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c675736059020365cebc845a820214765162728b51ab1e03a1b7b3abb70f74c"},
+ {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c5867d40ab716e4684858e4887489685968a47e3ba222e44cde6e4a2154f959"},
+ {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395bb9a26111b60141757d874d27fdea01b17e8fac958b91c20128ba8f4acc8a"},
+ {file = "jiter-0.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6842184aed5cdb07e0c7e20e5bdcfafe33515ee1741a6835353bb45fe5d1bd95"},
+ {file = "jiter-0.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62755d1bcea9876770d4df713d82606c8c1a3dca88ff39046b85a048566d56ea"},
+ {file = "jiter-0.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533efbce2cacec78d5ba73a41756beff8431dfa1694b6346ce7af3a12c42202b"},
+ {file = "jiter-0.10.0-cp312-cp312-win32.whl", hash = "sha256:8be921f0cadd245e981b964dfbcd6fd4bc4e254cdc069490416dd7a2632ecc01"},
+ {file = "jiter-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:a7c7d785ae9dda68c2678532a5a1581347e9c15362ae9f6e68f3fdbfb64f2e49"},
+ {file = "jiter-0.10.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e0588107ec8e11b6f5ef0e0d656fb2803ac6cf94a96b2b9fc675c0e3ab5e8644"},
+ {file = "jiter-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cafc4628b616dc32530c20ee53d71589816cf385dd9449633e910d596b1f5c8a"},
+ {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:520ef6d981172693786a49ff5b09eda72a42e539f14788124a07530f785c3ad6"},
+ {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:554dedfd05937f8fc45d17ebdf298fe7e0c77458232bcb73d9fbbf4c6455f5b3"},
+ {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bc299da7789deacf95f64052d97f75c16d4fc8c4c214a22bf8d859a4288a1c2"},
+ {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5161e201172de298a8a1baad95eb85db4fb90e902353b1f6a41d64ea64644e25"},
+ {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2227db6ba93cb3e2bf67c87e594adde0609f146344e8207e8730364db27041"},
+ {file = "jiter-0.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15acb267ea5e2c64515574b06a8bf393fbfee6a50eb1673614aa45f4613c0cca"},
+ {file = "jiter-0.10.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:901b92f2e2947dc6dfcb52fd624453862e16665ea909a08398dde19c0731b7f4"},
+ {file = "jiter-0.10.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d0cb9a125d5a3ec971a094a845eadde2db0de85b33c9f13eb94a0c63d463879e"},
+ {file = "jiter-0.10.0-cp313-cp313-win32.whl", hash = "sha256:48a403277ad1ee208fb930bdf91745e4d2d6e47253eedc96e2559d1e6527006d"},
+ {file = "jiter-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:75f9eb72ecb640619c29bf714e78c9c46c9c4eaafd644bf78577ede459f330d4"},
+ {file = "jiter-0.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:28ed2a4c05a1f32ef0e1d24c2611330219fed727dae01789f4a335617634b1ca"},
+ {file = "jiter-0.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a4c418b1ec86a195f1ca69da8b23e8926c752b685af665ce30777233dfe070"},
+ {file = "jiter-0.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d7bfed2fe1fe0e4dda6ef682cee888ba444b21e7a6553e03252e4feb6cf0adca"},
+ {file = "jiter-0.10.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5e9251a5e83fab8d87799d3e1a46cb4b7f2919b895c6f4483629ed2446f66522"},
+ {file = "jiter-0.10.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:023aa0204126fe5b87ccbcd75c8a0d0261b9abdbbf46d55e7ae9f8e22424eeb8"},
+ {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c189c4f1779c05f75fc17c0c1267594ed918996a231593a21a5ca5438445216"},
+ {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15720084d90d1098ca0229352607cd68256c76991f6b374af96f36920eae13c4"},
+ {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4f2fb68e5f1cfee30e2b2a09549a00683e0fde4c6a2ab88c94072fc33cb7426"},
+ {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce541693355fc6da424c08b7edf39a2895f58d6ea17d92cc2b168d20907dee12"},
+ {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c50c40272e189d50006ad5c73883caabb73d4e9748a688b216e85a9a9ca3b9"},
+ {file = "jiter-0.10.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa3402a2ff9815960e0372a47b75c76979d74402448509ccd49a275fa983ef8a"},
+ {file = "jiter-0.10.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:1956f934dca32d7bb647ea21d06d93ca40868b505c228556d3373cbd255ce853"},
+ {file = "jiter-0.10.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:fcedb049bdfc555e261d6f65a6abe1d5ad68825b7202ccb9692636c70fcced86"},
+ {file = "jiter-0.10.0-cp314-cp314-win32.whl", hash = "sha256:ac509f7eccca54b2a29daeb516fb95b6f0bd0d0d8084efaf8ed5dfc7b9f0b357"},
+ {file = "jiter-0.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5ed975b83a2b8639356151cef5c0d597c68376fc4922b45d0eb384ac058cfa00"},
+ {file = "jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5"},
+ {file = "jiter-0.10.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bd6292a43c0fc09ce7c154ec0fa646a536b877d1e8f2f96c19707f65355b5a4d"},
+ {file = "jiter-0.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39de429dcaeb6808d75ffe9effefe96a4903c6a4b376b2f6d08d77c1aaee2f18"},
+ {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52ce124f13a7a616fad3bb723f2bfb537d78239d1f7f219566dc52b6f2a9e48d"},
+ {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:166f3606f11920f9a1746b2eea84fa2c0a5d50fd313c38bdea4edc072000b0af"},
+ {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28dcecbb4ba402916034fc14eba7709f250c4d24b0c43fc94d187ee0580af181"},
+ {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86c5aa6910f9bebcc7bc4f8bc461aff68504388b43bfe5e5c0bd21efa33b52f4"},
+ {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ceeb52d242b315d7f1f74b441b6a167f78cea801ad7c11c36da77ff2d42e8a28"},
+ {file = "jiter-0.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ff76d8887c8c8ee1e772274fcf8cc1071c2c58590d13e33bd12d02dc9a560397"},
+ {file = "jiter-0.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a9be4d0fa2b79f7222a88aa488bd89e2ae0a0a5b189462a12def6ece2faa45f1"},
+ {file = "jiter-0.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ab7fd8738094139b6c1ab1822d6f2000ebe41515c537235fd45dabe13ec9324"},
+ {file = "jiter-0.10.0-cp39-cp39-win32.whl", hash = "sha256:5f51e048540dd27f204ff4a87f5d79294ea0aa3aa552aca34934588cf27023cf"},
+ {file = "jiter-0.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:1b28302349dc65703a9e4ead16f163b1c339efffbe1049c30a44b001a2a4fff9"},
+ {file = "jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500"},
]
[[package]]
name = "joblib"
-version = "1.4.2"
+version = "1.5.1"
description = "Lightweight pipelining with Python functions"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"},
- {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"},
+ {file = "joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a"},
+ {file = "joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444"},
]
[[package]]
name = "jsonschema"
-version = "4.23.0"
+version = "4.24.0"
description = "An implementation of JSON Schema validation for Python"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"},
- {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"},
+ {file = "jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d"},
+ {file = "jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196"},
]
[package.dependencies]
@@ -843,13 +914,13 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-
[[package]]
name = "jsonschema-specifications"
-version = "2024.10.1"
+version = "2025.4.1"
description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry"
optional = false
python-versions = ">=3.9"
files = [
- {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"},
- {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"},
+ {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"},
+ {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"},
]
[package.dependencies]
@@ -1125,24 +1196,24 @@ test = ["coverage[toml] (>=7.2.5)", "mypy (>=1.2.0)", "pytest (>=7.3.0)", "pytes
[[package]]
name = "markdown"
-version = "3.7"
+version = "3.8"
description = "Python implementation of John Gruber's Markdown."
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"},
- {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"},
+ {file = "markdown-3.8-py3-none-any.whl", hash = "sha256:794a929b79c5af141ef5ab0f2f642d0f7b1872981250230e72682346f7cc90dc"},
+ {file = "markdown-3.8.tar.gz", hash = "sha256:7df81e63f0df5c4b24b7d156eb81e4690595239b7d70937d0409f1b0de319c6f"},
]
[package.extras]
-docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"]
+docs = ["mdx_gh_links (>=0.2)", "mkdocs (>=1.6)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"]
testing = ["coverage", "pyyaml"]
[[package]]
name = "markdown2"
version = "2.5.3"
description = "A fast and complete Python implementation of Markdown"
-optional = false
+optional = true
python-versions = "<4,>=3.9"
files = [
{file = "markdown2-2.5.3-py3-none-any.whl", hash = "sha256:a8ebb7e84b8519c37bf7382b3db600f1798a22c245bfd754a1f87ca8d7ea63b3"},
@@ -1159,7 +1230,7 @@ wavedrom = ["wavedrom"]
name = "markdownify"
version = "0.13.1"
description = "Convert HTML to markdown."
-optional = false
+optional = true
python-versions = "*"
files = [
{file = "markdownify-0.13.1-py3-none-any.whl", hash = "sha256:1d181d43d20902bcc69d7be85b5316ed174d0dda72ff56e14ae4c95a4a407d22"},
@@ -1172,18 +1243,18 @@ six = ">=1.15,<2"
[[package]]
name = "marker-pdf"
-version = "1.6.2"
+version = "1.7.4"
description = "Convert documents to markdown with high speed and accuracy."
-optional = false
+optional = true
python-versions = "<4.0,>=3.10"
files = [
- {file = "marker_pdf-1.6.2-py3-none-any.whl", hash = "sha256:48fbc6353e6fc3510d30d5682a8974fc9d6eb58a13e7c3f525ed6973b721f108"},
- {file = "marker_pdf-1.6.2.tar.gz", hash = "sha256:38725082c89c0aec5e28e4f1df8f3974ccc0742c2265f0342c20e52fbde90bf0"},
+ {file = "marker_pdf-1.7.4-py3-none-any.whl", hash = "sha256:c27d4657a366140b871dd3aebb6421bd8351e5e3be46bc8ea6ad2242d4e3f935"},
+ {file = "marker_pdf-1.7.4.tar.gz", hash = "sha256:292e9e42eb8f426e713b1dc147edbfdc5608731b0f00646e34be1f03dec0d7df"},
]
[package.dependencies]
anthropic = ">=0.46.0,<0.47.0"
-click = ">=8.1.7,<9.0.0"
+click = ">=8.2.0,<9.0.0"
filetype = ">=1.2.0,<2.0.0"
ftfy = ">=6.1.1,<7.0.0"
google-genai = ">=1.0.0,<2.0.0"
@@ -1199,8 +1270,8 @@ python-dotenv = ">=1.0.0,<2.0.0"
rapidfuzz = ">=3.8.1,<4.0.0"
regex = ">=2024.4.28,<2025.0.0"
scikit-learn = ">=1.6.1,<2.0.0"
-surya-ocr = ">=0.13.1,<0.14.0"
-torch = ">=2.5.1,<3.0.0"
+surya-ocr = ">=0.14.5,<0.15.0"
+torch = ">=2.7.0,<3.0.0"
tqdm = ">=4.66.1,<5.0.0"
transformers = ">=4.45.2,<5.0.0"
@@ -1277,6 +1348,25 @@ files = [
{file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
]
+[[package]]
+name = "marshmallow"
+version = "3.26.1"
+description = "A lightweight library for converting complex datatypes to and from native Python datatypes."
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c"},
+ {file = "marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6"},
+]
+
+[package.dependencies]
+packaging = ">=17.0"
+
+[package.extras]
+dev = ["marshmallow[tests]", "pre-commit (>=3.5,<5.0)", "tox"]
+docs = ["autodocsumm (==0.2.14)", "furo (==2024.8.6)", "sphinx (==8.1.3)", "sphinx-copybutton (==0.5.2)", "sphinx-issues (==5.0.0)", "sphinxext-opengraph (==0.9.1)"]
+tests = ["pytest", "simplejson"]
+
[[package]]
name = "mergedeep"
version = "1.3.4"
@@ -1320,13 +1410,13 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp
[[package]]
name = "mkdocs-autorefs"
-version = "1.4.1"
+version = "1.4.2"
description = "Automatically link across pages in MkDocs."
optional = false
python-versions = ">=3.9"
files = [
- {file = "mkdocs_autorefs-1.4.1-py3-none-any.whl", hash = "sha256:9793c5ac06a6ebbe52ec0f8439256e66187badf4b5334b5fde0b128ec134df4f"},
- {file = "mkdocs_autorefs-1.4.1.tar.gz", hash = "sha256:4b5b6235a4becb2b10425c2fa191737e415b37aa3418919db33e5d774c9db079"},
+ {file = "mkdocs_autorefs-1.4.2-py3-none-any.whl", hash = "sha256:83d6d777b66ec3c372a1aad4ae0cf77c243ba5bcda5bf0c6b8a2c5e7a3d89f13"},
+ {file = "mkdocs_autorefs-1.4.2.tar.gz", hash = "sha256:e2ebe1abd2b67d597ed19378c0fff84d73d1dbce411fce7a7cc6f161888b6749"},
]
[package.dependencies]
@@ -1458,13 +1548,13 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"]
[[package]]
name = "mkdocstrings-python"
-version = "1.16.10"
+version = "1.16.11"
description = "A Python handler for mkdocstrings."
optional = false
python-versions = ">=3.9"
files = [
- {file = "mkdocstrings_python-1.16.10-py3-none-any.whl", hash = "sha256:63bb9f01f8848a644bdb6289e86dc38ceddeaa63ecc2e291e3b2ca52702a6643"},
- {file = "mkdocstrings_python-1.16.10.tar.gz", hash = "sha256:f9eedfd98effb612ab4d0ed6dd2b73aff6eba5215e0a65cea6d877717f75502e"},
+ {file = "mkdocstrings_python-1.16.11-py3-none-any.whl", hash = "sha256:25d96cc9c1f9c272ea1bd8222c900b5f852bf46c984003e9c7c56eaa4696190f"},
+ {file = "mkdocstrings_python-1.16.11.tar.gz", hash = "sha256:935f95efa887f99178e4a7becaaa1286fb35adafffd669b04fd611d97c00e5ce"},
]
[package.dependencies]
@@ -1477,7 +1567,7 @@ typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""}
name = "mpmath"
version = "1.3.0"
description = "Python library for arbitrary-precision floating-point arithmetic"
-optional = false
+optional = true
python-versions = "*"
files = [
{file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"},
@@ -1492,47 +1582,48 @@ tests = ["pytest (>=4.6)"]
[[package]]
name = "mypy"
-version = "1.15.0"
+version = "1.16.0"
description = "Optional static typing for Python"
optional = false
python-versions = ">=3.9"
files = [
- {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"},
- {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"},
- {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b"},
- {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3"},
- {file = "mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b"},
- {file = "mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828"},
- {file = "mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f"},
- {file = "mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5"},
- {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e"},
- {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c"},
- {file = "mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f"},
- {file = "mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f"},
- {file = "mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd"},
- {file = "mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f"},
- {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464"},
- {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee"},
- {file = "mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e"},
- {file = "mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22"},
- {file = "mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445"},
- {file = "mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d"},
- {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5"},
- {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036"},
- {file = "mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357"},
- {file = "mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf"},
- {file = "mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078"},
- {file = "mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba"},
- {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5"},
- {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b"},
- {file = "mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2"},
- {file = "mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980"},
- {file = "mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e"},
- {file = "mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43"},
+ {file = "mypy-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7909541fef256527e5ee9c0a7e2aeed78b6cda72ba44298d1334fe7881b05c5c"},
+ {file = "mypy-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e71d6f0090c2256c713ed3d52711d01859c82608b5d68d4fa01a3fe30df95571"},
+ {file = "mypy-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:936ccfdd749af4766be824268bfe22d1db9eb2f34a3ea1d00ffbe5b5265f5491"},
+ {file = "mypy-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4086883a73166631307fdd330c4a9080ce24913d4f4c5ec596c601b3a4bdd777"},
+ {file = "mypy-1.16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:feec38097f71797da0231997e0de3a58108c51845399669ebc532c815f93866b"},
+ {file = "mypy-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:09a8da6a0ee9a9770b8ff61b39c0bb07971cda90e7297f4213741b48a0cc8d93"},
+ {file = "mypy-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9f826aaa7ff8443bac6a494cf743f591488ea940dd360e7dd330e30dd772a5ab"},
+ {file = "mypy-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82d056e6faa508501af333a6af192c700b33e15865bda49611e3d7d8358ebea2"},
+ {file = "mypy-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:089bedc02307c2548eb51f426e085546db1fa7dd87fbb7c9fa561575cf6eb1ff"},
+ {file = "mypy-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6a2322896003ba66bbd1318c10d3afdfe24e78ef12ea10e2acd985e9d684a666"},
+ {file = "mypy-1.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:021a68568082c5b36e977d54e8f1de978baf401a33884ffcea09bd8e88a98f4c"},
+ {file = "mypy-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:54066fed302d83bf5128632d05b4ec68412e1f03ef2c300434057d66866cea4b"},
+ {file = "mypy-1.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c5436d11e89a3ad16ce8afe752f0f373ae9620841c50883dc96f8b8805620b13"},
+ {file = "mypy-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f2622af30bf01d8fc36466231bdd203d120d7a599a6d88fb22bdcb9dbff84090"},
+ {file = "mypy-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d045d33c284e10a038f5e29faca055b90eee87da3fc63b8889085744ebabb5a1"},
+ {file = "mypy-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b4968f14f44c62e2ec4a038c8797a87315be8df7740dc3ee8d3bfe1c6bf5dba8"},
+ {file = "mypy-1.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb14a4a871bb8efb1e4a50360d4e3c8d6c601e7a31028a2c79f9bb659b63d730"},
+ {file = "mypy-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:bd4e1ebe126152a7bbaa4daedd781c90c8f9643c79b9748caa270ad542f12bec"},
+ {file = "mypy-1.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a9e056237c89f1587a3be1a3a70a06a698d25e2479b9a2f57325ddaaffc3567b"},
+ {file = "mypy-1.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b07e107affb9ee6ce1f342c07f51552d126c32cd62955f59a7db94a51ad12c0"},
+ {file = "mypy-1.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c6fb60cbd85dc65d4d63d37cb5c86f4e3a301ec605f606ae3a9173e5cf34997b"},
+ {file = "mypy-1.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7e32297a437cc915599e0578fa6bc68ae6a8dc059c9e009c628e1c47f91495d"},
+ {file = "mypy-1.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:afe420c9380ccec31e744e8baff0d406c846683681025db3531b32db56962d52"},
+ {file = "mypy-1.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:55f9076c6ce55dd3f8cd0c6fff26a008ca8e5131b89d5ba6d86bd3f47e736eeb"},
+ {file = "mypy-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f56236114c425620875c7cf71700e3d60004858da856c6fc78998ffe767b73d3"},
+ {file = "mypy-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:15486beea80be24ff067d7d0ede673b001d0d684d0095803b3e6e17a886a2a92"},
+ {file = "mypy-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f2ed0e0847a80655afa2c121835b848ed101cc7b8d8d6ecc5205aedc732b1436"},
+ {file = "mypy-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb5fbc8063cb4fde7787e4c0406aa63094a34a2daf4673f359a1fb64050e9cb2"},
+ {file = "mypy-1.16.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a5fcfdb7318c6a8dd127b14b1052743b83e97a970f0edb6c913211507a255e20"},
+ {file = "mypy-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:2e7e0ad35275e02797323a5aa1be0b14a4d03ffdb2e5f2b0489fa07b89c67b21"},
+ {file = "mypy-1.16.0-py3-none-any.whl", hash = "sha256:29e1499864a3888bca5c1542f2d7232c6e586295183320caa95758fc84034031"},
+ {file = "mypy-1.16.0.tar.gz", hash = "sha256:84b94283f817e2aa6350a14b4a8fb2a35a53c286f97c9d30f53b63620e7af8ab"},
]
[package.dependencies]
mypy_extensions = ">=1.0.0"
+pathspec = ">=0.9.0"
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
typing_extensions = ">=4.6.0"
@@ -1545,20 +1636,20 @@ reports = ["lxml"]
[[package]]
name = "mypy-extensions"
-version = "1.0.0"
+version = "1.1.0"
description = "Type system extensions for programs checked with the mypy type checker."
optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.8"
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"},
+ {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"},
+ {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"},
]
[[package]]
name = "networkx"
version = "3.4.2"
description = "Python package for creating and manipulating graphs and networks"
-optional = false
+optional = true
python-versions = ">=3.10"
files = [
{file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"},
@@ -1611,73 +1702,73 @@ files = [
[[package]]
name = "numpy"
-version = "2.2.5"
+version = "2.2.6"
description = "Fundamental package for array computing in Python"
optional = false
python-versions = ">=3.10"
files = [
- {file = "numpy-2.2.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f4a922da1729f4c40932b2af4fe84909c7a6e167e6e99f71838ce3a29f3fe26"},
- {file = "numpy-2.2.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b6f91524d31b34f4a5fee24f5bc16dcd1491b668798b6d85585d836c1e633a6a"},
- {file = "numpy-2.2.5-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:19f4718c9012e3baea91a7dba661dcab2451cda2550678dc30d53acb91a7290f"},
- {file = "numpy-2.2.5-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:eb7fd5b184e5d277afa9ec0ad5e4eb562ecff541e7f60e69ee69c8d59e9aeaba"},
- {file = "numpy-2.2.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6413d48a9be53e183eb06495d8e3b006ef8f87c324af68241bbe7a39e8ff54c3"},
- {file = "numpy-2.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7451f92eddf8503c9b8aa4fe6aa7e87fd51a29c2cfc5f7dbd72efde6c65acf57"},
- {file = "numpy-2.2.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0bcb1d057b7571334139129b7f941588f69ce7c4ed15a9d6162b2ea54ded700c"},
- {file = "numpy-2.2.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36ab5b23915887543441efd0417e6a3baa08634308894316f446027611b53bf1"},
- {file = "numpy-2.2.5-cp310-cp310-win32.whl", hash = "sha256:422cc684f17bc963da5f59a31530b3936f57c95a29743056ef7a7903a5dbdf88"},
- {file = "numpy-2.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:e4f0b035d9d0ed519c813ee23e0a733db81ec37d2e9503afbb6e54ccfdee0fa7"},
- {file = "numpy-2.2.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c42365005c7a6c42436a54d28c43fe0e01ca11eb2ac3cefe796c25a5f98e5e9b"},
- {file = "numpy-2.2.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:498815b96f67dc347e03b719ef49c772589fb74b8ee9ea2c37feae915ad6ebda"},
- {file = "numpy-2.2.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6411f744f7f20081b1b4e7112e0f4c9c5b08f94b9f086e6f0adf3645f85d3a4d"},
- {file = "numpy-2.2.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9de6832228f617c9ef45d948ec1cd8949c482238d68b2477e6f642c33a7b0a54"},
- {file = "numpy-2.2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:369e0d4647c17c9363244f3468f2227d557a74b6781cb62ce57cf3ef5cc7c610"},
- {file = "numpy-2.2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:262d23f383170f99cd9191a7c85b9a50970fe9069b2f8ab5d786eca8a675d60b"},
- {file = "numpy-2.2.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa70fdbdc3b169d69e8c59e65c07a1c9351ceb438e627f0fdcd471015cd956be"},
- {file = "numpy-2.2.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37e32e985f03c06206582a7323ef926b4e78bdaa6915095ef08070471865b906"},
- {file = "numpy-2.2.5-cp311-cp311-win32.whl", hash = "sha256:f5045039100ed58fa817a6227a356240ea1b9a1bc141018864c306c1a16d4175"},
- {file = "numpy-2.2.5-cp311-cp311-win_amd64.whl", hash = "sha256:b13f04968b46ad705f7c8a80122a42ae8f620536ea38cf4bdd374302926424dd"},
- {file = "numpy-2.2.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ee461a4eaab4f165b68780a6a1af95fb23a29932be7569b9fab666c407969051"},
- {file = "numpy-2.2.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ec31367fd6a255dc8de4772bd1658c3e926d8e860a0b6e922b615e532d320ddc"},
- {file = "numpy-2.2.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:47834cde750d3c9f4e52c6ca28a7361859fcaf52695c7dc3cc1a720b8922683e"},
- {file = "numpy-2.2.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2c1a1c6ccce4022383583a6ded7bbcda22fc635eb4eb1e0a053336425ed36dfa"},
- {file = "numpy-2.2.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d75f338f5f79ee23548b03d801d28a505198297534f62416391857ea0479571"},
- {file = "numpy-2.2.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a801fef99668f309b88640e28d261991bfad9617c27beda4a3aec4f217ea073"},
- {file = "numpy-2.2.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:abe38cd8381245a7f49967a6010e77dbf3680bd3627c0fe4362dd693b404c7f8"},
- {file = "numpy-2.2.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a0ac90e46fdb5649ab6369d1ab6104bfe5854ab19b645bf5cda0127a13034ae"},
- {file = "numpy-2.2.5-cp312-cp312-win32.whl", hash = "sha256:0cd48122a6b7eab8f06404805b1bd5856200e3ed6f8a1b9a194f9d9054631beb"},
- {file = "numpy-2.2.5-cp312-cp312-win_amd64.whl", hash = "sha256:ced69262a8278547e63409b2653b372bf4baff0870c57efa76c5703fd6543282"},
- {file = "numpy-2.2.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:059b51b658f4414fff78c6d7b1b4e18283ab5fa56d270ff212d5ba0c561846f4"},
- {file = "numpy-2.2.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:47f9ed103af0bc63182609044b0490747e03bd20a67e391192dde119bf43d52f"},
- {file = "numpy-2.2.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:261a1ef047751bb02f29dfe337230b5882b54521ca121fc7f62668133cb119c9"},
- {file = "numpy-2.2.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4520caa3807c1ceb005d125a75e715567806fed67e315cea619d5ec6e75a4191"},
- {file = "numpy-2.2.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d14b17b9be5f9c9301f43d2e2a4886a33b53f4e6fdf9ca2f4cc60aeeee76372"},
- {file = "numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d"},
- {file = "numpy-2.2.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4cbdef3ddf777423060c6f81b5694bad2dc9675f110c4b2a60dc0181543fac7"},
- {file = "numpy-2.2.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54088a5a147ab71a8e7fdfd8c3601972751ded0739c6b696ad9cb0343e21ab73"},
- {file = "numpy-2.2.5-cp313-cp313-win32.whl", hash = "sha256:c8b82a55ef86a2d8e81b63da85e55f5537d2157165be1cb2ce7cfa57b6aef38b"},
- {file = "numpy-2.2.5-cp313-cp313-win_amd64.whl", hash = "sha256:d8882a829fd779f0f43998e931c466802a77ca1ee0fe25a3abe50278616b1471"},
- {file = "numpy-2.2.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e8b025c351b9f0e8b5436cf28a07fa4ac0204d67b38f01433ac7f9b870fa38c6"},
- {file = "numpy-2.2.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dfa94b6a4374e7851bbb6f35e6ded2120b752b063e6acdd3157e4d2bb922eba"},
- {file = "numpy-2.2.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:97c8425d4e26437e65e1d189d22dff4a079b747ff9c2788057bfb8114ce1e133"},
- {file = "numpy-2.2.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:352d330048c055ea6db701130abc48a21bec690a8d38f8284e00fab256dc1376"},
- {file = "numpy-2.2.5-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b4c0773b6ada798f51f0f8e30c054d32304ccc6e9c5d93d46cb26f3d385ab19"},
- {file = "numpy-2.2.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55f09e00d4dccd76b179c0f18a44f041e5332fd0e022886ba1c0bbf3ea4a18d0"},
- {file = "numpy-2.2.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02f226baeefa68f7d579e213d0f3493496397d8f1cff5e2b222af274c86a552a"},
- {file = "numpy-2.2.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c26843fd58f65da9491165072da2cccc372530681de481ef670dcc8e27cfb066"},
- {file = "numpy-2.2.5-cp313-cp313t-win32.whl", hash = "sha256:1a161c2c79ab30fe4501d5a2bbfe8b162490757cf90b7f05be8b80bc02f7bb8e"},
- {file = "numpy-2.2.5-cp313-cp313t-win_amd64.whl", hash = "sha256:d403c84991b5ad291d3809bace5e85f4bbf44a04bdc9a88ed2bb1807b3360bb8"},
- {file = "numpy-2.2.5-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b4ea7e1cff6784e58fe281ce7e7f05036b3e1c89c6f922a6bfbc0a7e8768adbe"},
- {file = "numpy-2.2.5-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d7543263084a85fbc09c704b515395398d31d6395518446237eac219eab9e55e"},
- {file = "numpy-2.2.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0255732338c4fdd00996c0421884ea8a3651eea555c3a56b84892b66f696eb70"},
- {file = "numpy-2.2.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d2e3bdadaba0e040d1e7ab39db73e0afe2c74ae277f5614dad53eadbecbbb169"},
- {file = "numpy-2.2.5.tar.gz", hash = "sha256:a9c0d994680cd991b1cb772e8b297340085466a6fe964bc9d4e80f5e2f43c291"},
+ {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"},
+ {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"},
+ {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163"},
+ {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf"},
+ {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83"},
+ {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915"},
+ {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680"},
+ {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289"},
+ {file = "numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d"},
+ {file = "numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3"},
+ {file = "numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae"},
+ {file = "numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a"},
+ {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42"},
+ {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491"},
+ {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a"},
+ {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf"},
+ {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1"},
+ {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab"},
+ {file = "numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47"},
+ {file = "numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303"},
+ {file = "numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff"},
+ {file = "numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c"},
+ {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3"},
+ {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282"},
+ {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87"},
+ {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249"},
+ {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49"},
+ {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de"},
+ {file = "numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4"},
+ {file = "numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2"},
+ {file = "numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84"},
+ {file = "numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b"},
+ {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d"},
+ {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566"},
+ {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f"},
+ {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f"},
+ {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868"},
+ {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d"},
+ {file = "numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd"},
+ {file = "numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c"},
+ {file = "numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6"},
+ {file = "numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda"},
+ {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40"},
+ {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8"},
+ {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f"},
+ {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa"},
+ {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571"},
+ {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1"},
+ {file = "numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff"},
+ {file = "numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06"},
+ {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d"},
+ {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db"},
+ {file = "numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543"},
+ {file = "numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00"},
+ {file = "numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd"},
]
[[package]]
name = "nvidia-cublas-cu12"
version = "12.6.4.1"
description = "CUBLAS native runtime libraries"
-optional = false
+optional = true
python-versions = ">=3"
files = [
{file = "nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08ed2686e9875d01b58e3cb379c6896df8e76c75e0d4a7f7dace3d7b6d9ef8eb"},
@@ -1689,7 +1780,7 @@ files = [
name = "nvidia-cuda-cupti-cu12"
version = "12.6.80"
description = "CUDA profiling tools runtime libs."
-optional = false
+optional = true
python-versions = ">=3"
files = [
{file = "nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:166ee35a3ff1587f2490364f90eeeb8da06cd867bd5b701bf7f9a02b78bc63fc"},
@@ -1703,7 +1794,7 @@ files = [
name = "nvidia-cuda-nvrtc-cu12"
version = "12.6.77"
description = "NVRTC native runtime libraries"
-optional = false
+optional = true
python-versions = ">=3"
files = [
{file = "nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5847f1d6e5b757f1d2b3991a01082a44aad6f10ab3c5c0213fa3e25bddc25a13"},
@@ -1715,7 +1806,7 @@ files = [
name = "nvidia-cuda-runtime-cu12"
version = "12.6.77"
description = "CUDA Runtime native Libraries"
-optional = false
+optional = true
python-versions = ">=3"
files = [
{file = "nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6116fad3e049e04791c0256a9778c16237837c08b27ed8c8401e2e45de8d60cd"},
@@ -1729,7 +1820,7 @@ files = [
name = "nvidia-cudnn-cu12"
version = "9.5.1.17"
description = "cuDNN runtime libraries"
-optional = false
+optional = true
python-versions = ">=3"
files = [
{file = "nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:9fd4584468533c61873e5fda8ca41bac3a38bcb2d12350830c69b0a96a7e4def"},
@@ -1744,7 +1835,7 @@ nvidia-cublas-cu12 = "*"
name = "nvidia-cufft-cu12"
version = "11.3.0.4"
description = "CUFFT native runtime libraries"
-optional = false
+optional = true
python-versions = ">=3"
files = [
{file = "nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d16079550df460376455cba121db6564089176d9bac9e4f360493ca4741b22a6"},
@@ -1761,7 +1852,7 @@ nvidia-nvjitlink-cu12 = "*"
name = "nvidia-cufile-cu12"
version = "1.11.1.6"
description = "cuFile GPUDirect libraries"
-optional = false
+optional = true
python-versions = ">=3"
files = [
{file = "nvidia_cufile_cu12-1.11.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc23469d1c7e52ce6c1d55253273d32c565dd22068647f3aa59b3c6b005bf159"},
@@ -1772,7 +1863,7 @@ files = [
name = "nvidia-curand-cu12"
version = "10.3.7.77"
description = "CURAND native runtime libraries"
-optional = false
+optional = true
python-versions = ">=3"
files = [
{file = "nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6e82df077060ea28e37f48a3ec442a8f47690c7499bff392a5938614b56c98d8"},
@@ -1786,7 +1877,7 @@ files = [
name = "nvidia-cusolver-cu12"
version = "11.7.1.2"
description = "CUDA solver native runtime libraries"
-optional = false
+optional = true
python-versions = ">=3"
files = [
{file = "nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0ce237ef60acde1efc457335a2ddadfd7610b892d94efee7b776c64bb1cac9e0"},
@@ -1805,7 +1896,7 @@ nvidia-nvjitlink-cu12 = "*"
name = "nvidia-cusparse-cu12"
version = "12.5.4.2"
description = "CUSPARSE native runtime libraries"
-optional = false
+optional = true
python-versions = ">=3"
files = [
{file = "nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d25b62fb18751758fe3c93a4a08eff08effedfe4edf1c6bb5afd0890fe88f887"},
@@ -1822,7 +1913,7 @@ nvidia-nvjitlink-cu12 = "*"
name = "nvidia-cusparselt-cu12"
version = "0.6.3"
description = "NVIDIA cuSPARSELt"
-optional = false
+optional = true
python-versions = "*"
files = [
{file = "nvidia_cusparselt_cu12-0.6.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8371549623ba601a06322af2133c4a44350575f5a3108fb75f3ef20b822ad5f1"},
@@ -1834,7 +1925,7 @@ files = [
name = "nvidia-nccl-cu12"
version = "2.26.2"
description = "NVIDIA Collective Communication Library (NCCL) Runtime"
-optional = false
+optional = true
python-versions = ">=3"
files = [
{file = "nvidia_nccl_cu12-2.26.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c196e95e832ad30fbbb50381eb3cbd1fadd5675e587a548563993609af19522"},
@@ -1845,7 +1936,7 @@ files = [
name = "nvidia-nvjitlink-cu12"
version = "12.6.85"
description = "Nvidia JIT LTO Library"
-optional = false
+optional = true
python-versions = ">=3"
files = [
{file = "nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:eedc36df9e88b682efe4309aa16b5b4e78c2407eac59e8c10a6a47535164369a"},
@@ -1857,7 +1948,7 @@ files = [
name = "nvidia-nvtx-cu12"
version = "12.6.77"
description = "NVIDIA Tools Extension"
-optional = false
+optional = true
python-versions = ">=3"
files = [
{file = "nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f44f8d86bb7d5629988d61c8d3ae61dddb2015dee142740536bc7481b022fe4b"},
@@ -1869,13 +1960,13 @@ files = [
[[package]]
name = "openai"
-version = "1.76.0"
+version = "1.83.0"
description = "The official Python library for the openai API"
-optional = false
+optional = true
python-versions = ">=3.8"
files = [
- {file = "openai-1.76.0-py3-none-any.whl", hash = "sha256:a712b50e78cf78e6d7b2a8f69c4978243517c2c36999756673e07a14ce37dc0a"},
- {file = "openai-1.76.0.tar.gz", hash = "sha256:fd2bfaf4608f48102d6b74f9e11c5ecaa058b60dad9c36e409c12477dfd91fb2"},
+ {file = "openai-1.83.0-py3-none-any.whl", hash = "sha256:d15ec58ba52537d4abc7b744890ecc4ab3cffb0fdaa8e5389830f6e1a2f7f128"},
+ {file = "openai-1.83.0.tar.gz", hash = "sha256:dfb421837962d9e8078929d8fc7e36e51c2a110b23a777a14e27f579d1afd6b6"},
]
[package.dependencies]
@@ -1897,7 +1988,7 @@ voice-helpers = ["numpy (>=2.0.2)", "sounddevice (>=0.5.1)"]
name = "opencv-python-headless"
version = "4.11.0.86"
description = "Wrapper package for OpenCV python bindings."
-optional = false
+optional = true
python-versions = ">=3.6"
files = [
{file = "opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798"},
@@ -1919,13 +2010,13 @@ numpy = [
[[package]]
name = "packaging"
-version = "24.2"
+version = "25.0"
description = "Core utilities for Python packages"
optional = false
python-versions = ">=3.8"
files = [
- {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
- {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
+ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"},
+ {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"},
]
[[package]]
@@ -2031,13 +2122,13 @@ xml = ["lxml (>=4.9.2)"]
[[package]]
name = "pandas-stubs"
-version = "2.2.3.250308"
+version = "2.2.3.250527"
description = "Type annotations for pandas"
optional = false
python-versions = ">=3.10"
files = [
- {file = "pandas_stubs-2.2.3.250308-py3-none-any.whl", hash = "sha256:a377edff3b61f8b268c82499fdbe7c00fdeed13235b8b71d6a1dc347aeddc74d"},
- {file = "pandas_stubs-2.2.3.250308.tar.gz", hash = "sha256:3a6e9daf161f00b85c83772ed3d5cff9522028f07a94817472c07b91f46710fd"},
+ {file = "pandas_stubs-2.2.3.250527-py3-none-any.whl", hash = "sha256:cd0a49a95b8c5f944e605be711042a4dd8550e2c559b43d70ba2c4b524b66163"},
+ {file = "pandas_stubs-2.2.3.250527.tar.gz", hash = "sha256:e2d694c4e72106055295ad143664e5c99e5815b07190d1ff85b73b13ff019e63"},
]
[package.dependencies]
@@ -2059,7 +2150,7 @@ files = [
name = "pdftext"
version = "0.6.2"
description = "Extract structured text from pdfs quickly"
-optional = false
+optional = true
python-versions = "<4.0,>=3.10"
files = [
{file = "pdftext-0.6.2-py3-none-any.whl", hash = "sha256:905d11e62d548e307933c25865a69c8e993947bb5b40b1535b0a2aa8f07a71d4"},
@@ -2076,7 +2167,7 @@ pypdfium2 = "4.30.0"
name = "pillow"
version = "10.4.0"
description = "Python Imaging Library (Fork)"
-optional = false
+optional = true
python-versions = ">=3.8"
files = [
{file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"},
@@ -2171,13 +2262,13 @@ xmp = ["defusedxml"]
[[package]]
name = "platformdirs"
-version = "4.3.7"
+version = "4.3.8"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
optional = false
python-versions = ">=3.9"
files = [
- {file = "platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94"},
- {file = "platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351"},
+ {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"},
+ {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"},
]
[package.extras]
@@ -2187,18 +2278,18 @@ type = ["mypy (>=1.14.1)"]
[[package]]
name = "pluggy"
-version = "1.5.0"
+version = "1.6.0"
description = "plugin and hook calling mechanisms for python"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
- {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
+ {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"},
+ {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"},
]
[package.extras]
dev = ["pre-commit", "tox"]
-testing = ["pytest", "pytest-benchmark"]
+testing = ["coverage", "pytest", "pytest-benchmark"]
[[package]]
name = "pre-commit"
@@ -2218,11 +2309,34 @@ nodeenv = ">=0.11.1"
pyyaml = ">=5.1"
virtualenv = ">=20.10.0"
+[[package]]
+name = "psutil"
+version = "7.0.0"
+description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7."
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"},
+ {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"},
+ {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"},
+ {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"},
+ {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"},
+ {file = "psutil-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17"},
+ {file = "psutil-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e"},
+ {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"},
+ {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"},
+ {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"},
+]
+
+[package.extras]
+dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"]
+test = ["pytest", "pytest-xdist", "setuptools"]
+
[[package]]
name = "pyasn1"
version = "0.6.1"
description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)"
-optional = false
+optional = true
python-versions = ">=3.8"
files = [
{file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"},
@@ -2233,7 +2347,7 @@ files = [
name = "pyasn1-modules"
version = "0.4.2"
description = "A collection of ASN.1-based protocols modules"
-optional = false
+optional = true
python-versions = ">=3.8"
files = [
{file = "pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a"},
@@ -2245,18 +2359,18 @@ pyasn1 = ">=0.6.1,<0.7.0"
[[package]]
name = "pydantic"
-version = "2.11.3"
+version = "2.11.5"
description = "Data validation using Python type hints"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
- {file = "pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f"},
- {file = "pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3"},
+ {file = "pydantic-2.11.5-py3-none-any.whl", hash = "sha256:f9c26ba06f9747749ca1e5c94d6a85cb84254577553c8785576fd38fa64dc0f7"},
+ {file = "pydantic-2.11.5.tar.gz", hash = "sha256:7f853db3d0ce78ce8bbb148c401c2cdd6431b3473c0cdff2755c7690952a7b7a"},
]
[package.dependencies]
annotated-types = ">=0.6.0"
-pydantic-core = "2.33.1"
+pydantic-core = "2.33.2"
typing-extensions = ">=4.12.2"
typing-inspection = ">=0.4.0"
@@ -2266,110 +2380,110 @@ timezone = ["tzdata"]
[[package]]
name = "pydantic-core"
-version = "2.33.1"
+version = "2.33.2"
description = "Core functionality for Pydantic validation and serialization"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
- {file = "pydantic_core-2.33.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26"},
- {file = "pydantic_core-2.33.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927"},
- {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5183e4f6a2d468787243ebcd70cf4098c247e60d73fb7d68d5bc1e1beaa0c4db"},
- {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:398a38d323f37714023be1e0285765f0a27243a8b1506b7b7de87b647b517e48"},
- {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d3776f0001b43acebfa86f8c64019c043b55cc5a6a2e313d728b5c95b46969"},
- {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c566dd9c5f63d22226409553531f89de0cac55397f2ab8d97d6f06cfce6d947e"},
- {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d5f3acc81452c56895e90643a625302bd6be351e7010664151cc55b7b97f89"},
- {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d3a07fadec2a13274a8d861d3d37c61e97a816beae717efccaa4b36dfcaadcde"},
- {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f99aeda58dce827f76963ee87a0ebe75e648c72ff9ba1174a253f6744f518f65"},
- {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:902dbc832141aa0ec374f4310f1e4e7febeebc3256f00dc359a9ac3f264a45dc"},
- {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fe44d56aa0b00d66640aa84a3cbe80b7a3ccdc6f0b1ca71090696a6d4777c091"},
- {file = "pydantic_core-2.33.1-cp310-cp310-win32.whl", hash = "sha256:ed3eb16d51257c763539bde21e011092f127a2202692afaeaccb50db55a31383"},
- {file = "pydantic_core-2.33.1-cp310-cp310-win_amd64.whl", hash = "sha256:694ad99a7f6718c1a498dc170ca430687a39894a60327f548e02a9c7ee4b6504"},
- {file = "pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24"},
- {file = "pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30"},
- {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595"},
- {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e"},
- {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a"},
- {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505"},
- {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f"},
- {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77"},
- {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961"},
- {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1"},
- {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c"},
- {file = "pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896"},
- {file = "pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83"},
- {file = "pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89"},
- {file = "pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8"},
- {file = "pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498"},
- {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939"},
- {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d"},
- {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e"},
- {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3"},
- {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d"},
- {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b"},
- {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39"},
- {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a"},
- {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db"},
- {file = "pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda"},
- {file = "pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4"},
- {file = "pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea"},
- {file = "pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a"},
- {file = "pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266"},
- {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3"},
- {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a"},
- {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516"},
- {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764"},
- {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d"},
- {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4"},
- {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde"},
- {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e"},
- {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd"},
- {file = "pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f"},
- {file = "pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40"},
- {file = "pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523"},
- {file = "pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d"},
- {file = "pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c"},
- {file = "pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18"},
- {file = "pydantic_core-2.33.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5ab77f45d33d264de66e1884fca158bc920cb5e27fd0764a72f72f5756ae8bdb"},
- {file = "pydantic_core-2.33.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7aaba1b4b03aaea7bb59e1b5856d734be011d3e6d98f5bcaa98cb30f375f2ad"},
- {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fb66263e9ba8fea2aa85e1e5578980d127fb37d7f2e292773e7bc3a38fb0c7b"},
- {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3f2648b9262607a7fb41d782cc263b48032ff7a03a835581abbf7a3bec62bcf5"},
- {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:723c5630c4259400818b4ad096735a829074601805d07f8cafc366d95786d331"},
- {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d100e3ae783d2167782391e0c1c7a20a31f55f8015f3293647544df3f9c67824"},
- {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177d50460bc976a0369920b6c744d927b0ecb8606fb56858ff542560251b19e5"},
- {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3edde68d1a1f9af1273b2fe798997b33f90308fb6d44d8550c89fc6a3647cf6"},
- {file = "pydantic_core-2.33.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a62c3c3ef6a7e2c45f7853b10b5bc4ddefd6ee3cd31024754a1a5842da7d598d"},
- {file = "pydantic_core-2.33.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:c91dbb0ab683fa0cd64a6e81907c8ff41d6497c346890e26b23de7ee55353f96"},
- {file = "pydantic_core-2.33.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f466e8bf0a62dc43e068c12166281c2eca72121dd2adc1040f3aa1e21ef8599"},
- {file = "pydantic_core-2.33.1-cp39-cp39-win32.whl", hash = "sha256:ab0277cedb698749caada82e5d099dc9fed3f906a30d4c382d1a21725777a1e5"},
- {file = "pydantic_core-2.33.1-cp39-cp39-win_amd64.whl", hash = "sha256:5773da0ee2d17136b1f1c6fbde543398d452a6ad2a7b54ea1033e2daa739b8d2"},
- {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c834f54f8f4640fd7e4b193f80eb25a0602bba9e19b3cd2fc7ffe8199f5ae02"},
- {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:049e0de24cf23766f12cc5cc71d8abc07d4a9deb9061b334b62093dedc7cb068"},
- {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a28239037b3d6f16916a4c831a5a0eadf856bdd6d2e92c10a0da3a59eadcf3e"},
- {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d3da303ab5f378a268fa7d45f37d7d85c3ec19769f28d2cc0c61826a8de21fe"},
- {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:25626fb37b3c543818c14821afe0fd3830bc327a43953bc88db924b68c5723f1"},
- {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3ab2d36e20fbfcce8f02d73c33a8a7362980cff717926bbae030b93ae46b56c7"},
- {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2f9284e11c751b003fd4215ad92d325d92c9cb19ee6729ebd87e3250072cdcde"},
- {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:048c01eee07d37cbd066fc512b9d8b5ea88ceeb4e629ab94b3e56965ad655add"},
- {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5ccd429694cf26af7997595d627dd2637e7932214486f55b8a357edaac9dae8c"},
- {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a"},
- {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc"},
- {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b"},
- {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe"},
- {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5"},
- {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761"},
- {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850"},
- {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544"},
- {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5"},
- {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7edbc454a29fc6aeae1e1eecba4f07b63b8d76e76a748532233c4c167b4cb9ea"},
- {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ad05b683963f69a1d5d2c2bdab1274a31221ca737dbbceaa32bcb67359453cdd"},
- {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df6a94bf9452c6da9b5d76ed229a5683d0306ccb91cca8e1eea883189780d568"},
- {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7965c13b3967909a09ecc91f21d09cfc4576bf78140b988904e94f130f188396"},
- {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3f1fdb790440a34f6ecf7679e1863b825cb5ffde858a9197f851168ed08371e5"},
- {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5277aec8d879f8d05168fdd17ae811dd313b8ff894aeeaf7cd34ad28b4d77e33"},
- {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8ab581d3530611897d863d1a649fb0644b860286b4718db919bfd51ece41f10b"},
- {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0483847fa9ad5e3412265c1bd72aad35235512d9ce9d27d81a56d935ef489672"},
- {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:de9e06abe3cc5ec6a2d5f75bc99b0bdca4f5c719a5b34026f8c57efbdecd2ee3"},
- {file = "pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"},
+ {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"},
+ {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"},
+ {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"},
+ {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"},
]
[package.dependencies]
@@ -2379,7 +2493,7 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
name = "pydantic-settings"
version = "2.9.1"
description = "Settings management using Pydantic"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
{file = "pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef"},
@@ -2414,13 +2528,13 @@ windows-terminal = ["colorama (>=0.4.6)"]
[[package]]
name = "pymdown-extensions"
-version = "10.14.3"
+version = "10.15"
description = "Extension pack for Python Markdown."
optional = false
python-versions = ">=3.8"
files = [
- {file = "pymdown_extensions-10.14.3-py3-none-any.whl", hash = "sha256:05e0bee73d64b9c71a4ae17c72abc2f700e8bc8403755a00580b49a4e9f189e9"},
- {file = "pymdown_extensions-10.14.3.tar.gz", hash = "sha256:41e576ce3f5d650be59e900e4ceff231e0aed2a88cf30acaee41e02f063a061b"},
+ {file = "pymdown_extensions-10.15-py3-none-any.whl", hash = "sha256:46e99bb272612b0de3b7e7caf6da8dd5f4ca5212c0b273feb9304e236c484e5f"},
+ {file = "pymdown_extensions-10.15.tar.gz", hash = "sha256:0e5994e32155f4b03504f939e501b981d306daf7ec2aa1cd2eb6bd300784f8f7"},
]
[package.dependencies]
@@ -2434,7 +2548,7 @@ extra = ["pygments (>=2.19.1)"]
name = "pypdfium2"
version = "4.30.0"
description = "Python bindings to PDFium"
-optional = false
+optional = true
python-versions = ">=3.6"
files = [
{file = "pypdfium2-4.30.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:b33ceded0b6ff5b2b93bc1fe0ad4b71aa6b7e7bd5875f1ca0cdfb6ba6ac01aab"},
@@ -2454,25 +2568,26 @@ files = [
[[package]]
name = "pytest"
-version = "8.3.5"
+version = "8.4.0"
description = "pytest: simple powerful testing with Python"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"},
- {file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"},
+ {file = "pytest-8.4.0-py3-none-any.whl", hash = "sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e"},
+ {file = "pytest-8.4.0.tar.gz", hash = "sha256:14d920b48472ea0dbf68e45b96cd1ffda4705f33307dcc86c676c1b5104838a6"},
]
[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
-iniconfig = "*"
-packaging = "*"
+colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""}
+exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""}
+iniconfig = ">=1"
+packaging = ">=20"
pluggy = ">=1.5,<2"
+pygments = ">=2.7.2"
tomli = {version = ">=1", markers = "python_version < \"3.11\""}
[package.extras]
-dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"]
[[package]]
name = "pytest-cov"
@@ -2494,13 +2609,13 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"]
[[package]]
name = "pytest-mock"
-version = "3.14.0"
+version = "3.14.1"
description = "Thin-wrapper around the mock package for easier use with pytest"
optional = false
python-versions = ">=3.8"
files = [
- {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"},
- {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"},
+ {file = "pytest_mock-3.14.1-py3-none-any.whl", hash = "sha256:178aefcd11307d874b4cd3100344e7e2d888d9791a6a1d9bfe90fbc1b74fd1d0"},
+ {file = "pytest_mock-3.14.1.tar.gz", hash = "sha256:159e9edac4c451ce77a5cdb9fc5d1100708d2dd4ba3c3df572f14097351af80e"},
]
[package.dependencies]
@@ -2509,6 +2624,27 @@ pytest = ">=6.2.5"
[package.extras]
dev = ["pre-commit", "pytest-asyncio", "tox"]
+[[package]]
+name = "pytest-xdist"
+version = "3.7.0"
+description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "pytest_xdist-3.7.0-py3-none-any.whl", hash = "sha256:7d3fbd255998265052435eb9daa4e99b62e6fb9cfb6efd1f858d4d8c0c7f0ca0"},
+ {file = "pytest_xdist-3.7.0.tar.gz", hash = "sha256:f9248c99a7c15b7d2f90715df93610353a485827bc06eefb6566d23f6400f126"},
+]
+
+[package.dependencies]
+execnet = ">=2.1"
+psutil = {version = ">=3.0", optional = true, markers = "extra == \"psutil\""}
+pytest = ">=7.0.0"
+
+[package.extras]
+psutil = ["psutil (>=3.0)"]
+setproctitle = ["setproctitle"]
+testing = ["filelock"]
+
[[package]]
name = "python-dateutil"
version = "2.9.0.post0"
@@ -2523,11 +2659,26 @@ files = [
[package.dependencies]
six = ">=1.5"
+[[package]]
+name = "python-docx"
+version = "1.1.2"
+description = "Create, read, and update Microsoft Word .docx files."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe"},
+ {file = "python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd"},
+]
+
+[package.dependencies]
+lxml = ">=3.1.0"
+typing-extensions = ">=4.9.0"
+
[[package]]
name = "python-dotenv"
version = "1.1.0"
description = "Read key-value pairs from a .env file and set them as environment variables"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
{file = "python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"},
@@ -2626,13 +2777,13 @@ files = [
[[package]]
name = "pyyaml-env-tag"
-version = "0.1"
-description = "A custom YAML tag for referencing environment variables in YAML files. "
+version = "1.1"
+description = "A custom YAML tag for referencing environment variables in YAML files."
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.9"
files = [
- {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"},
- {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"},
+ {file = "pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04"},
+ {file = "pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff"},
]
[package.dependencies]
@@ -2640,105 +2791,105 @@ pyyaml = "*"
[[package]]
name = "rapidfuzz"
-version = "3.12.2"
+version = "3.13.0"
description = "rapid fuzzy string matching"
optional = false
python-versions = ">=3.9"
files = [
- {file = "rapidfuzz-3.12.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b9a75e0385a861178adf59e86d6616cbd0d5adca7228dc9eeabf6f62cf5b0b1"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6906a7eb458731e3dd2495af1d0410e23a21a2a2b7ced535e6d5cd15cb69afc5"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4b3334a8958b689f292d5ce8a928140ac98919b51e084f04bf0c14276e4c6ba"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:85a54ce30345cff2c79cbcffa063f270ad1daedd0d0c3ff6e541d3c3ba4288cf"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acb63c5072c08058f8995404201a52fc4e1ecac105548a4d03c6c6934bda45a3"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5385398d390c6571f0f2a7837e6ddde0c8b912dac096dc8c87208ce9aaaa7570"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5032cbffa245b4beba0067f8ed17392ef2501b346ae3c1f1d14b950edf4b6115"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:195adbb384d89d6c55e2fd71e7fb262010f3196e459aa2f3f45f31dd7185fe72"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f43b773a4d4950606fb25568ecde5f25280daf8f97b87eb323e16ecd8177b328"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:55a43be0e0fa956a919043c19d19bd988991d15c59f179d413fe5145ed9deb43"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:71cf1ea16acdebe9e2fb62ee7a77f8f70e877bebcbb33b34e660af2eb6d341d9"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a3692d4ab36d44685f61326dca539975a4eda49b2a76f0a3df177d8a2c0de9d2"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-win32.whl", hash = "sha256:09227bd402caa4397ba1d6e239deea635703b042dd266a4092548661fb22b9c6"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-win_amd64.whl", hash = "sha256:0f05b7b95f9f87254b53fa92048367a8232c26cee7fc8665e4337268c3919def"},
- {file = "rapidfuzz-3.12.2-cp310-cp310-win_arm64.whl", hash = "sha256:6938738e00d9eb6e04097b3f565097e20b0c398f9c58959a2bc64f7f6be3d9da"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9c4d984621ae17404c58f8d06ed8b025e167e52c0e6a511dfec83c37e9220cd"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f9132c55d330f0a1d34ce6730a76805323a6250d97468a1ca766a883d6a9a25"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b343b6cb4b2c3dbc8d2d4c5ee915b6088e3b144ddf8305a57eaab16cf9fc74"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24081077b571ec4ee6d5d7ea0e49bc6830bf05b50c1005028523b9cd356209f3"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c988a4fc91856260355773bf9d32bebab2083d4c6df33fafeddf4330e5ae9139"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:780b4469ee21cf62b1b2e8ada042941fd2525e45d5fb6a6901a9798a0e41153c"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:edd84b0a323885493c893bad16098c5e3b3005d7caa995ae653da07373665d97"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efa22059c765b3d8778083805b199deaaf643db070f65426f87d274565ddf36a"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:095776b11bb45daf7c2973dd61cc472d7ea7f2eecfa454aef940b4675659b92f"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7e2574cf4aa86065600b664a1ac7b8b8499107d102ecde836aaaa403fc4f1784"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d5a3425a6c50fd8fbd991d8f085ddb504791dae6ef9cc3ab299fea2cb5374bef"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:97fb05e1ddb7b71a054040af588b0634214ee87cea87900d309fafc16fd272a4"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-win32.whl", hash = "sha256:b4c5a0413589aef936892fbfa94b7ff6f7dd09edf19b5a7b83896cc9d4e8c184"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-win_amd64.whl", hash = "sha256:58d9ae5cf9246d102db2a2558b67fe7e73c533e5d769099747921232d88b9be2"},
- {file = "rapidfuzz-3.12.2-cp311-cp311-win_arm64.whl", hash = "sha256:7635fe34246cd241c8e35eb83084e978b01b83d5ef7e5bf72a704c637f270017"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1d982a651253ffe8434d9934ff0c1089111d60502228464721a2a4587435e159"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02e6466caa0222d5233b1f05640873671cd99549a5c5ba4c29151634a1e56080"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e956b3f053e474abae69ac693a52742109d860ac2375fe88e9387d3277f4c96c"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2dee7d740a2d5418d4f964f39ab8d89923e6b945850db833e798a1969b19542a"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a057cdb0401e42c84b6516c9b1635f7aedd5e430c6e388bd5f6bcd1d6a0686bb"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dccf8d4fb5b86d39c581a59463c596b1d09df976da26ff04ae219604223d502f"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21d5b3793c6f5aecca595cd24164bf9d3c559e315ec684f912146fc4e769e367"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:46a616c0e13cff2de1761b011e0b14bb73b110182f009223f1453d505c9a975c"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:19fa5bc4301a1ee55400d4a38a8ecf9522b0391fc31e6da5f4d68513fe5c0026"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:544a47190a0d25971658a9365dba7095397b4ce3e897f7dd0a77ca2cf6fa984e"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f21af27c5e001f0ba1b88c36a0936437dfe034c452548d998891c21125eb640f"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b63170d9db00629b5b3f2862114d8d6ee19127eaba0eee43762d62a25817dbe0"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-win32.whl", hash = "sha256:6c7152d77b2eb6bfac7baa11f2a9c45fd5a2d848dbb310acd0953b3b789d95c9"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-win_amd64.whl", hash = "sha256:1a314d170ee272ac87579f25a6cf8d16a031e1f7a7b07663434b41a1473bc501"},
- {file = "rapidfuzz-3.12.2-cp312-cp312-win_arm64.whl", hash = "sha256:d41e8231326e94fd07c4d8f424f6bed08fead6f5e6688d1e6e787f1443ae7631"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:941f31038dba5d3dedcfcceba81d61570ad457c873a24ceb13f4f44fcb574260"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fe2dfc454ee51ba168a67b1e92b72aad251e45a074972cef13340bbad2fd9438"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78fafaf7f5a48ee35ccd7928339080a0136e27cf97396de45259eca1d331b714"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0c7989ff32c077bb8fd53253fd6ca569d1bfebc80b17557e60750e6909ba4fe"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96fa00bc105caa34b6cd93dca14a29243a3a7f0c336e4dcd36348d38511e15ac"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bccfb30c668620c5bc3490f2dc7d7da1cca0ead5a9da8b755e2e02e2ef0dff14"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f9b0adc3d894beb51f5022f64717b6114a6fabaca83d77e93ac7675911c8cc5"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:32691aa59577f42864d5535cb6225d0f47e2c7bff59cf4556e5171e96af68cc1"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:758b10380ad34c1f51753a070d7bb278001b5e6fcf544121c6df93170952d705"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:50a9c54c0147b468363119132d514c5024fbad1ed8af12bd8bd411b0119f9208"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e3ceb87c11d2d0fbe8559bb795b0c0604b84cfc8bb7b8720b5c16e9e31e00f41"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f7c9a003002434889255ff5676ca0f8934a478065ab5e702f75dc42639505bba"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-win32.whl", hash = "sha256:cf165a76870cd875567941cf861dfd361a0a6e6a56b936c5d30042ddc9def090"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-win_amd64.whl", hash = "sha256:55bcc003541f5f16ec0a73bf6de758161973f9e8d75161954380738dd147f9f2"},
- {file = "rapidfuzz-3.12.2-cp313-cp313-win_arm64.whl", hash = "sha256:69f6ecdf1452139f2b947d0c169a605de578efdb72cbb2373cb0a94edca1fd34"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c852cd8bed1516a64fd6e2d4c6f270d4356196ee03fda2af1e5a9e13c34643"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42e7f747b55529a6d0d1588695d71025e884ab48664dca54b840413dea4588d8"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a749fd2690f24ef256b264a781487746bbb95344364fe8fe356f0eef7ef206ba"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a11e1d036170bbafa43a9e63d8c309273564ec5bdfc5439062f439d1a16965a"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dfb337f1832c1231e3d5621bd0ebebb854e46036aedae3e6a49c1fc08f16f249"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e88c6e68fca301722fa3ab7fd3ca46998012c14ada577bc1e2c2fc04f2067ca6"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17e1a3a8b4b5125cfb63a6990459b25b87ea769bdaf90d05bb143f8febef076a"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9f8177b24ccc0a843e85932b1088c5e467a7dd7a181c13f84c684b796bea815"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6c506bdc2f304051592c0d3b0e82eed309248ec10cdf802f13220251358375ea"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:30bf15c1ecec2798b713d551df17f23401a3e3653ad9ed4e83ad1c2b06e86100"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:bd9a67cfc83e8453ef17ddd1c2c4ce4a74d448a197764efb54c29f29fb41f611"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7a6eaec2ef658dd650c6eb9b36dff7a361ebd7d8bea990ce9d639b911673b2cb"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-win32.whl", hash = "sha256:d7701769f110332cde45c41759cb2a497de8d2dca55e4c519a46aed5fbb19d1a"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-win_amd64.whl", hash = "sha256:296bf0fd4f678488670e262c87a3e4f91900b942d73ae38caa42a417e53643b1"},
- {file = "rapidfuzz-3.12.2-cp39-cp39-win_arm64.whl", hash = "sha256:7957f5d768de14f6b2715303ccdf224b78416738ee95a028a2965c95f73afbfb"},
- {file = "rapidfuzz-3.12.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5fd3ce849b27d063755829cda27a9dab6dbd63be3801f2a40c60ec563a4c90f"},
- {file = "rapidfuzz-3.12.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:54e53662d71ed660c83c5109127c8e30b9e607884b7c45d2aff7929bbbd00589"},
- {file = "rapidfuzz-3.12.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b9e43cf2213e524f3309d329f1ad8dbf658db004ed44f6ae1cd2919aa997da5"},
- {file = "rapidfuzz-3.12.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29ca445e320e5a8df3bd1d75b4fa4ecfa7c681942b9ac65b55168070a1a1960e"},
- {file = "rapidfuzz-3.12.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83eb7ef732c2f8533c6b5fbe69858a722c218acc3e1fc190ab6924a8af7e7e0e"},
- {file = "rapidfuzz-3.12.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:648adc2dd2cf873efc23befcc6e75754e204a409dfa77efd0fea30d08f22ef9d"},
- {file = "rapidfuzz-3.12.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b1e6f48e1ffa0749261ee23a1c6462bdd0be5eac83093f4711de17a42ae78ad"},
- {file = "rapidfuzz-3.12.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:1ae9ded463f2ca4ba1eb762913c5f14c23d2e120739a62b7f4cc102eab32dc90"},
- {file = "rapidfuzz-3.12.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dda45f47b559be72ecbce45c7f71dc7c97b9772630ab0f3286d97d2c3025ab71"},
- {file = "rapidfuzz-3.12.2-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3745c6443890265513a3c8777f2de4cb897aeb906a406f97741019be8ad5bcc"},
- {file = "rapidfuzz-3.12.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36d3ef4f047ed1bc96fa29289f9e67a637ddca5e4f4d3dc7cb7f50eb33ec1664"},
- {file = "rapidfuzz-3.12.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:54bb69ebe5ca0bd7527357e348f16a4c0c52fe0c2fcc8a041010467dcb8385f7"},
- {file = "rapidfuzz-3.12.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3f2ddd5b99b254039a8c82be5749d4d75943f62eb2c2918acf6ffd586852834f"},
- {file = "rapidfuzz-3.12.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:8117dab9b26a1aaffab59b4e30f80ac4d55e61ad4139a637c149365960933bee"},
- {file = "rapidfuzz-3.12.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40c0f16d62d6553527de3dab2fb69709c4383430ea44bce8fb4711ed4cbc6ae3"},
- {file = "rapidfuzz-3.12.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f177e1eb6e4f5261a89c475e21bce7a99064a8f217d2336fb897408f46f0ceaf"},
- {file = "rapidfuzz-3.12.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df0cecc2852fcb078ed1b4482fac4fc2c2e7787f3edda8920d9a4c0f51b1c95"},
- {file = "rapidfuzz-3.12.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b3c4df0321df6f8f0b61afbaa2ced9622750ee1e619128db57a18533d139820"},
- {file = "rapidfuzz-3.12.2.tar.gz", hash = "sha256:b0ba1ccc22fff782e7152a3d3d0caca44ec4e32dc48ba01c560b8593965b5aa3"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aafc42a1dc5e1beeba52cd83baa41372228d6d8266f6d803c16dbabbcc156255"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:85c9a131a44a95f9cac2eb6e65531db014e09d89c4f18c7b1fa54979cb9ff1f3"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d7cec4242d30dd521ef91c0df872e14449d1dffc2a6990ede33943b0dae56c3"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e297c09972698c95649e89121e3550cee761ca3640cd005e24aaa2619175464e"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef0f5f03f61b0e5a57b1df7beafd83df993fd5811a09871bad6038d08e526d0d"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8cf5f7cd6e4d5eb272baf6a54e182b2c237548d048e2882258336533f3f02b7"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9256218ac8f1a957806ec2fb9a6ddfc6c32ea937c0429e88cf16362a20ed8602"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1bdd2e6d0c5f9706ef7595773a81ca2b40f3b33fd7f9840b726fb00c6c4eb2e"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5280be8fd7e2bee5822e254fe0a5763aa0ad57054b85a32a3d9970e9b09bbcbf"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd742c03885db1fce798a1cd87a20f47f144ccf26d75d52feb6f2bae3d57af05"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5435fcac94c9ecf0504bf88a8a60c55482c32e18e108d6079a0089c47f3f8cf6"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:93a755266856599be4ab6346273f192acde3102d7aa0735e2f48b456397a041f"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-win32.whl", hash = "sha256:3abe6a4e8eb4cfc4cda04dd650a2dc6d2934cbdeda5def7e6fd1c20f6e7d2a0b"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:e8ddb58961401da7d6f55f185512c0d6bd24f529a637078d41dd8ffa5a49c107"},
+ {file = "rapidfuzz-3.13.0-cp310-cp310-win_arm64.whl", hash = "sha256:c523620d14ebd03a8d473c89e05fa1ae152821920c3ff78b839218ff69e19ca3"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d395a5cad0c09c7f096433e5fd4224d83b53298d53499945a9b0e5a971a84f3a"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7b3eda607a019169f7187328a8d1648fb9a90265087f6903d7ee3a8eee01805"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98e0bfa602e1942d542de077baf15d658bd9d5dcfe9b762aff791724c1c38b70"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bef86df6d59667d9655905b02770a0c776d2853971c0773767d5ef8077acd624"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fedd316c165beed6307bf754dee54d3faca2c47e1f3bcbd67595001dfa11e969"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5158da7f2ec02a930be13bac53bb5903527c073c90ee37804090614cab83c29e"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b6f913ee4618ddb6d6f3e387b76e8ec2fc5efee313a128809fbd44e65c2bbb2"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d25fdbce6459ccbbbf23b4b044f56fbd1158b97ac50994eaae2a1c0baae78301"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25343ccc589a4579fbde832e6a1e27258bfdd7f2eb0f28cb836d6694ab8591fc"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a9ad1f37894e3ffb76bbab76256e8a8b789657183870be11aa64e306bb5228fd"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5dc71ef23845bb6b62d194c39a97bb30ff171389c9812d83030c1199f319098c"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b7f4c65facdb94f44be759bbd9b6dda1fa54d0d6169cdf1a209a5ab97d311a75"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-win32.whl", hash = "sha256:b5104b62711565e0ff6deab2a8f5dbf1fbe333c5155abe26d2cfd6f1849b6c87"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:9093cdeb926deb32a4887ebe6910f57fbcdbc9fbfa52252c10b56ef2efb0289f"},
+ {file = "rapidfuzz-3.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:f70f646751b6aa9d05be1fb40372f006cc89d6aad54e9d79ae97bd1f5fce5203"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a1a6a906ba62f2556372282b1ef37b26bca67e3d2ea957277cfcefc6275cca7"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fd0975e015b05c79a97f38883a11236f5a24cca83aa992bd2558ceaa5652b26"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d4e13593d298c50c4f94ce453f757b4b398af3fa0fd2fde693c3e51195b7f69"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed6f416bda1c9133000009d84d9409823eb2358df0950231cc936e4bf784eb97"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1dc82b6ed01acb536b94a43996a94471a218f4d89f3fdd9185ab496de4b2a981"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9d824de871daa6e443b39ff495a884931970d567eb0dfa213d234337343835f"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d18228a2390375cf45726ce1af9d36ff3dc1f11dce9775eae1f1b13ac6ec50f"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5fe634c9482ec5d4a6692afb8c45d370ae86755e5f57aa6c50bfe4ca2bdd87"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:694eb531889f71022b2be86f625a4209c4049e74be9ca836919b9e395d5e33b3"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:11b47b40650e06147dee5e51a9c9ad73bb7b86968b6f7d30e503b9f8dd1292db"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:98b8107ff14f5af0243f27d236bcc6e1ef8e7e3b3c25df114e91e3a99572da73"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b836f486dba0aceb2551e838ff3f514a38ee72b015364f739e526d720fdb823a"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-win32.whl", hash = "sha256:4671ee300d1818d7bdfd8fa0608580d7778ba701817216f0c17fb29e6b972514"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e"},
+ {file = "rapidfuzz-3.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:65cc97c2fc2c2fe23586599686f3b1ceeedeca8e598cfcc1b7e56dc8ca7e2aa7"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:09e908064d3684c541d312bd4c7b05acb99a2c764f6231bd507d4b4b65226c23"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:57c390336cb50d5d3bfb0cfe1467478a15733703af61f6dffb14b1cd312a6fae"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0da54aa8547b3c2c188db3d1c7eb4d1bb6dd80baa8cdaeaec3d1da3346ec9caa"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df8e8c21e67afb9d7fbe18f42c6111fe155e801ab103c81109a61312927cc611"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:461fd13250a2adf8e90ca9a0e1e166515cbcaa5e9c3b1f37545cbbeff9e77f6b"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2b3dd5d206a12deca16870acc0d6e5036abeb70e3cad6549c294eff15591527"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1343d745fbf4688e412d8f398c6e6d6f269db99a54456873f232ba2e7aeb4939"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b1b065f370d54551dcc785c6f9eeb5bd517ae14c983d2784c064b3aa525896df"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:11b125d8edd67e767b2295eac6eb9afe0b1cdc82ea3d4b9257da4b8e06077798"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c33f9c841630b2bb7e69a3fb5c84a854075bb812c47620978bddc591f764da3d"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ae4574cb66cf1e85d32bb7e9ec45af5409c5b3970b7ceb8dea90168024127566"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e05752418b24bbd411841b256344c26f57da1148c5509e34ea39c7eb5099ab72"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-win32.whl", hash = "sha256:0e1d08cb884805a543f2de1f6744069495ef527e279e05370dd7c83416af83f8"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264"},
+ {file = "rapidfuzz-3.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:3f32f15bacd1838c929b35c84b43618481e1b3d7a61b5ed2db0291b70ae88b53"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc64da907114d7a18b5e589057e3acaf2fec723d31c49e13fedf043592a3f6a7"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4d9d7f84c8e992a8dbe5a3fdbea73d733da39bf464e62c912ac3ceba9c0cff93"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a79a2f07786a2070669b4b8e45bd96a01c788e7a3c218f531f3947878e0f956"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f338e71c45b69a482de8b11bf4a029993230760120c8c6e7c9b71760b6825a1"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb40ca8ddfcd4edd07b0713a860be32bdf632687f656963bcbce84cea04b8d8"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48719f7dcf62dfb181063b60ee2d0a39d327fa8ad81b05e3e510680c44e1c078"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9327a4577f65fc3fb712e79f78233815b8a1c94433d0c2c9f6bc5953018b3565"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:200030dfc0a1d5d6ac18e993c5097c870c97c41574e67f227300a1fb74457b1d"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cc269e74cad6043cb8a46d0ce580031ab642b5930562c2bb79aa7fbf9c858d26"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:e62779c6371bd2b21dbd1fdce89eaec2d93fd98179d36f61130b489f62294a92"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f4797f821dc5d7c2b6fc818b89f8a3f37bcc900dd9e4369e6ebf1e525efce5db"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d21f188f6fe4fbf422e647ae9d5a68671d00218e187f91859c963d0738ccd88c"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-win32.whl", hash = "sha256:45dd4628dd9c21acc5c97627dad0bb791764feea81436fb6e0a06eef4c6dceaa"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:624a108122039af89ddda1a2b7ab2a11abe60c1521956f142f5d11bcd42ef138"},
+ {file = "rapidfuzz-3.13.0-cp39-cp39-win_arm64.whl", hash = "sha256:435071fd07a085ecbf4d28702a66fd2e676a03369ee497cc38bcb69a46bc77e2"},
+ {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe5790a36d33a5d0a6a1f802aa42ecae282bf29ac6f7506d8e12510847b82a45"},
+ {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cdb33ee9f8a8e4742c6b268fa6bd739024f34651a06b26913381b1413ebe7590"},
+ {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c99b76b93f7b495eee7dcb0d6a38fb3ce91e72e99d9f78faa5664a881cb2b7d"},
+ {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6af42f2ede8b596a6aaf6d49fdee3066ca578f4856b85ab5c1e2145de367a12d"},
+ {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c0efa73afbc5b265aca0d8a467ae2a3f40d6854cbe1481cb442a62b7bf23c99"},
+ {file = "rapidfuzz-3.13.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7ac21489de962a4e2fc1e8f0b0da4aa1adc6ab9512fd845563fecb4b4c52093a"},
+ {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1ba007f4d35a45ee68656b2eb83b8715e11d0f90e5b9f02d615a8a321ff00c27"},
+ {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d7a217310429b43be95b3b8ad7f8fc41aba341109dc91e978cd7c703f928c58f"},
+ {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:558bf526bcd777de32b7885790a95a9548ffdcce68f704a81207be4a286c1095"},
+ {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:202a87760f5145140d56153b193a797ae9338f7939eb16652dd7ff96f8faf64c"},
+ {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcccc08f671646ccb1e413c773bb92e7bba789e3a1796fd49d23c12539fe2e4"},
+ {file = "rapidfuzz-3.13.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:1f219f1e3c3194d7a7de222f54450ce12bc907862ff9a8962d83061c1f923c86"},
+ {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ccbd0e7ea1a216315f63ffdc7cd09c55f57851afc8fe59a74184cb7316c0598b"},
+ {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a50856f49a4016ef56edd10caabdaf3608993f9faf1e05c3c7f4beeac46bd12a"},
+ {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fd05336db4d0b8348d7eaaf6fa3c517b11a56abaa5e89470ce1714e73e4aca7"},
+ {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:573ad267eb9b3f6e9b04febce5de55d8538a87c56c64bf8fd2599a48dc9d8b77"},
+ {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30fd1451f87ccb6c2f9d18f6caa483116bbb57b5a55d04d3ddbd7b86f5b14998"},
+ {file = "rapidfuzz-3.13.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6dd36d4916cf57ddb05286ed40b09d034ca5d4bca85c17be0cb6a21290597d9"},
+ {file = "rapidfuzz-3.13.0.tar.gz", hash = "sha256:d2eaf3839e52cbcc0accbe9817a67b4b0fcf70aaeb229cfddc1c28061f9ce5d8"},
]
[package.extras]
@@ -2886,121 +3037,135 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
[[package]]
name = "rpds-py"
-version = "0.23.1"
+version = "0.25.1"
description = "Python bindings to Rust's persistent data structures (rpds)"
optional = false
python-versions = ">=3.9"
files = [
- {file = "rpds_py-0.23.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2a54027554ce9b129fc3d633c92fa33b30de9f08bc61b32c053dc9b537266fed"},
- {file = "rpds_py-0.23.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5ef909a37e9738d146519657a1aab4584018746a18f71c692f2f22168ece40c"},
- {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ee9d6f0b38efb22ad94c3b68ffebe4c47865cdf4b17f6806d6c674e1feb4246"},
- {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7356a6da0562190558c4fcc14f0281db191cdf4cb96e7604c06acfcee96df15"},
- {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9441af1d25aed96901f97ad83d5c3e35e6cd21a25ca5e4916c82d7dd0490a4fa"},
- {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d8abf7896a91fb97e7977d1aadfcc2c80415d6dc2f1d0fca5b8d0df247248f3"},
- {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b08027489ba8fedde72ddd233a5ea411b85a6ed78175f40285bd401bde7466d"},
- {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fee513135b5a58f3bb6d89e48326cd5aa308e4bcdf2f7d59f67c861ada482bf8"},
- {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:35d5631ce0af26318dba0ae0ac941c534453e42f569011585cb323b7774502a5"},
- {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a20cb698c4a59c534c6701b1c24a968ff2768b18ea2991f886bd8985ce17a89f"},
- {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e9c206a1abc27e0588cf8b7c8246e51f1a16a103734f7750830a1ccb63f557a"},
- {file = "rpds_py-0.23.1-cp310-cp310-win32.whl", hash = "sha256:d9f75a06ecc68f159d5d7603b734e1ff6daa9497a929150f794013aa9f6e3f12"},
- {file = "rpds_py-0.23.1-cp310-cp310-win_amd64.whl", hash = "sha256:f35eff113ad430b5272bbfc18ba111c66ff525828f24898b4e146eb479a2cdda"},
- {file = "rpds_py-0.23.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b79f5ced71efd70414a9a80bbbfaa7160da307723166f09b69773153bf17c590"},
- {file = "rpds_py-0.23.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c9e799dac1ffbe7b10c1fd42fe4cd51371a549c6e108249bde9cd1200e8f59b4"},
- {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721f9c4011b443b6e84505fc00cc7aadc9d1743f1c988e4c89353e19c4a968ee"},
- {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f88626e3f5e57432e6191cd0c5d6d6b319b635e70b40be2ffba713053e5147dd"},
- {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:285019078537949cecd0190f3690a0b0125ff743d6a53dfeb7a4e6787af154f5"},
- {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b92f5654157de1379c509b15acec9d12ecf6e3bc1996571b6cb82a4302060447"},
- {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e768267cbe051dd8d1c5305ba690bb153204a09bf2e3de3ae530de955f5b5580"},
- {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c5334a71f7dc1160382d45997e29f2637c02f8a26af41073189d79b95d3321f1"},
- {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6adb81564af0cd428910f83fa7da46ce9ad47c56c0b22b50872bc4515d91966"},
- {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cafa48f2133d4daa028473ede7d81cd1b9f9e6925e9e4003ebdf77010ee02f35"},
- {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fced9fd4a07a1ded1bac7e961ddd9753dd5d8b755ba8e05acba54a21f5f1522"},
- {file = "rpds_py-0.23.1-cp311-cp311-win32.whl", hash = "sha256:243241c95174b5fb7204c04595852fe3943cc41f47aa14c3828bc18cd9d3b2d6"},
- {file = "rpds_py-0.23.1-cp311-cp311-win_amd64.whl", hash = "sha256:11dd60b2ffddba85715d8a66bb39b95ddbe389ad2cfcf42c833f1bcde0878eaf"},
- {file = "rpds_py-0.23.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3902df19540e9af4cc0c3ae75974c65d2c156b9257e91f5101a51f99136d834c"},
- {file = "rpds_py-0.23.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66f8d2a17e5838dd6fb9be6baaba8e75ae2f5fa6b6b755d597184bfcd3cb0eba"},
- {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:112b8774b0b4ee22368fec42749b94366bd9b536f8f74c3d4175d4395f5cbd31"},
- {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e0df046f2266e8586cf09d00588302a32923eb6386ced0ca5c9deade6af9a149"},
- {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3288930b947cbebe767f84cf618d2cbe0b13be476e749da0e6a009f986248c"},
- {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce473a2351c018b06dd8d30d5da8ab5a0831056cc53b2006e2a8028172c37ce5"},
- {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d550d7e9e7d8676b183b37d65b5cd8de13676a738973d330b59dc8312df9c5dc"},
- {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e14f86b871ea74c3fddc9a40e947d6a5d09def5adc2076ee61fb910a9014fb35"},
- {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf5be5ba34e19be579ae873da515a2836a2166d8d7ee43be6ff909eda42b72b"},
- {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7031d493c4465dbc8d40bd6cafefef4bd472b17db0ab94c53e7909ee781b9ef"},
- {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:55ff4151cfd4bc635e51cfb1c59ac9f7196b256b12e3a57deb9e5742e65941ad"},
- {file = "rpds_py-0.23.1-cp312-cp312-win32.whl", hash = "sha256:a9d3b728f5a5873d84cba997b9d617c6090ca5721caaa691f3b1a78c60adc057"},
- {file = "rpds_py-0.23.1-cp312-cp312-win_amd64.whl", hash = "sha256:b03a8d50b137ee758e4c73638b10747b7c39988eb8e6cd11abb7084266455165"},
- {file = "rpds_py-0.23.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:4caafd1a22e5eaa3732acb7672a497123354bef79a9d7ceed43387d25025e935"},
- {file = "rpds_py-0.23.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:178f8a60fc24511c0eb756af741c476b87b610dba83270fce1e5a430204566a4"},
- {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c632419c3870507ca20a37c8f8f5352317aca097639e524ad129f58c125c61c6"},
- {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:698a79d295626ee292d1730bc2ef6e70a3ab135b1d79ada8fde3ed0047b65a10"},
- {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271fa2184cf28bdded86bb6217c8e08d3a169fe0bbe9be5e8d96e8476b707122"},
- {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b91cceb5add79ee563bd1f70b30896bd63bc5f78a11c1f00a1e931729ca4f1f4"},
- {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a6cb95074777f1ecda2ca4fa7717caa9ee6e534f42b7575a8f0d4cb0c24013"},
- {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:50fb62f8d8364978478b12d5f03bf028c6bc2af04082479299139dc26edf4c64"},
- {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8f7e90b948dc9dcfff8003f1ea3af08b29c062f681c05fd798e36daa3f7e3e8"},
- {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5b98b6c953e5c2bda51ab4d5b4f172617d462eebc7f4bfdc7c7e6b423f6da957"},
- {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2893d778d4671ee627bac4037a075168b2673c57186fb1a57e993465dbd79a93"},
- {file = "rpds_py-0.23.1-cp313-cp313-win32.whl", hash = "sha256:2cfa07c346a7ad07019c33fb9a63cf3acb1f5363c33bc73014e20d9fe8b01cdd"},
- {file = "rpds_py-0.23.1-cp313-cp313-win_amd64.whl", hash = "sha256:3aaf141d39f45322e44fc2c742e4b8b4098ead5317e5f884770c8df0c332da70"},
- {file = "rpds_py-0.23.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:759462b2d0aa5a04be5b3e37fb8183615f47014ae6b116e17036b131985cb731"},
- {file = "rpds_py-0.23.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3e9212f52074fc9d72cf242a84063787ab8e21e0950d4d6709886fb62bcb91d5"},
- {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e9f3a3ac919406bc0414bbbd76c6af99253c507150191ea79fab42fdb35982a"},
- {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c04ca91dda8a61584165825907f5c967ca09e9c65fe8966ee753a3f2b019fe1e"},
- {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab923167cfd945abb9b51a407407cf19f5bee35001221f2911dc85ffd35ff4f"},
- {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed6f011bedca8585787e5082cce081bac3d30f54520097b2411351b3574e1219"},
- {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959bb9928c5c999aba4a3f5a6799d571ddc2c59ff49917ecf55be2bbb4e3722"},
- {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ed7de3c86721b4e83ac440751329ec6a1102229aa18163f84c75b06b525ad7e"},
- {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5fb89edee2fa237584e532fbf78f0ddd1e49a47c7c8cfa153ab4849dc72a35e6"},
- {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7e5413d2e2d86025e73f05510ad23dad5950ab8417b7fc6beaad99be8077138b"},
- {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d31ed4987d72aabdf521eddfb6a72988703c091cfc0064330b9e5f8d6a042ff5"},
- {file = "rpds_py-0.23.1-cp313-cp313t-win32.whl", hash = "sha256:f3429fb8e15b20961efca8c8b21432623d85db2228cc73fe22756c6637aa39e7"},
- {file = "rpds_py-0.23.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d6f6512a90bd5cd9030a6237f5346f046c6f0e40af98657568fa45695d4de59d"},
- {file = "rpds_py-0.23.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:09cd7dbcb673eb60518231e02874df66ec1296c01a4fcd733875755c02014b19"},
- {file = "rpds_py-0.23.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c6760211eee3a76316cf328f5a8bd695b47b1626d21c8a27fb3b2473a884d597"},
- {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e680c1518733b73c994361e4b06441b92e973ef7d9449feec72e8ee4f713da"},
- {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae28144c1daa61366205d32abd8c90372790ff79fc60c1a8ad7fd3c8553a600e"},
- {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c698d123ce5d8f2d0cd17f73336615f6a2e3bdcedac07a1291bb4d8e7d82a05a"},
- {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98b257ae1e83f81fb947a363a274c4eb66640212516becaff7bef09a5dceacaa"},
- {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c9ff044eb07c8468594d12602291c635da292308c8c619244e30698e7fc455a"},
- {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7938c7b0599a05246d704b3f5e01be91a93b411d0d6cc62275f025293b8a11ce"},
- {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e9cb79ecedfc156c0692257ac7ed415243b6c35dd969baa461a6888fc79f2f07"},
- {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7b77e07233925bd33fc0022b8537774423e4c6680b6436316c5075e79b6384f4"},
- {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a970bfaf130c29a679b1d0a6e0f867483cea455ab1535fb427566a475078f27f"},
- {file = "rpds_py-0.23.1-cp39-cp39-win32.whl", hash = "sha256:4233df01a250b3984465faed12ad472f035b7cd5240ea3f7c76b7a7016084495"},
- {file = "rpds_py-0.23.1-cp39-cp39-win_amd64.whl", hash = "sha256:c617d7453a80e29d9973b926983b1e700a9377dbe021faa36041c78537d7b08c"},
- {file = "rpds_py-0.23.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c1f8afa346ccd59e4e5630d5abb67aba6a9812fddf764fd7eb11f382a345f8cc"},
- {file = "rpds_py-0.23.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fad784a31869747df4ac968a351e070c06ca377549e4ace94775aaa3ab33ee06"},
- {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5a96fcac2f18e5a0a23a75cd27ce2656c66c11c127b0318e508aab436b77428"},
- {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e77febf227a1dc3220159355dba68faa13f8dca9335d97504abf428469fb18b"},
- {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26bb3e8de93443d55e2e748e9fd87deb5f8075ca7bc0502cfc8be8687d69a2ec"},
- {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db7707dde9143a67b8812c7e66aeb2d843fe33cc8e374170f4d2c50bd8f2472d"},
- {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eedaaccc9bb66581d4ae7c50e15856e335e57ef2734dbc5fd8ba3e2a4ab3cb6"},
- {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28358c54fffadf0ae893f6c1050e8f8853e45df22483b7fff2f6ab6152f5d8bf"},
- {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:633462ef7e61d839171bf206551d5ab42b30b71cac8f10a64a662536e057fdef"},
- {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a98f510d86f689fcb486dc59e6e363af04151e5260ad1bdddb5625c10f1e95f8"},
- {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e0397dd0b3955c61ef9b22838144aa4bef6f0796ba5cc8edfc64d468b93798b4"},
- {file = "rpds_py-0.23.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:75307599f0d25bf6937248e5ac4e3bde5ea72ae6618623b86146ccc7845ed00b"},
- {file = "rpds_py-0.23.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3614d280bf7aab0d3721b5ce0e73434acb90a2c993121b6e81a1c15c665298ac"},
- {file = "rpds_py-0.23.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e5963ea87f88bddf7edd59644a35a0feecf75f8985430124c253612d4f7d27ae"},
- {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad76f44f70aac3a54ceb1813ca630c53415da3a24fd93c570b2dfb4856591017"},
- {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c6ae11e6e93728d86aafc51ced98b1658a0080a7dd9417d24bfb955bb09c3c2"},
- {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc869af5cba24d45fb0399b0cfdbcefcf6910bf4dee5d74036a57cf5264b3ff4"},
- {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c76b32eb2ab650a29e423525e84eb197c45504b1c1e6e17b6cc91fcfeb1a4b1d"},
- {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4263320ed887ed843f85beba67f8b2d1483b5947f2dc73a8b068924558bfeace"},
- {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f9682a8f71acdf59fd554b82b1c12f517118ee72c0f3944eda461606dfe7eb9"},
- {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:754fba3084b70162a6b91efceee8a3f06b19e43dac3f71841662053c0584209a"},
- {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:a1c66e71ecfd2a4acf0e4bd75e7a3605afa8f9b28a3b497e4ba962719df2be57"},
- {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8d67beb6002441faef8251c45e24994de32c4c8686f7356a1f601ad7c466f7c3"},
- {file = "rpds_py-0.23.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a1e17d8dc8e57d8e0fd21f8f0f0a5211b3fa258b2e444c2053471ef93fe25a00"},
- {file = "rpds_py-0.23.1.tar.gz", hash = "sha256:7f3240dcfa14d198dba24b8b9cb3b108c06b68d45b7babd9eefc1038fdf7e707"},
+ {file = "rpds_py-0.25.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f4ad628b5174d5315761b67f212774a32f5bad5e61396d38108bd801c0a8f5d9"},
+ {file = "rpds_py-0.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8c742af695f7525e559c16f1562cf2323db0e3f0fbdcabdf6865b095256b2d40"},
+ {file = "rpds_py-0.25.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:605ffe7769e24b1800b4d024d24034405d9404f0bc2f55b6db3362cd34145a6f"},
+ {file = "rpds_py-0.25.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ccc6f3ddef93243538be76f8e47045b4aad7a66a212cd3a0f23e34469473d36b"},
+ {file = "rpds_py-0.25.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f70316f760174ca04492b5ab01be631a8ae30cadab1d1081035136ba12738cfa"},
+ {file = "rpds_py-0.25.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1dafef8df605fdb46edcc0bf1573dea0d6d7b01ba87f85cd04dc855b2b4479e"},
+ {file = "rpds_py-0.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0701942049095741a8aeb298a31b203e735d1c61f4423511d2b1a41dcd8a16da"},
+ {file = "rpds_py-0.25.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e87798852ae0b37c88babb7f7bbbb3e3fecc562a1c340195b44c7e24d403e380"},
+ {file = "rpds_py-0.25.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3bcce0edc1488906c2d4c75c94c70a0417e83920dd4c88fec1078c94843a6ce9"},
+ {file = "rpds_py-0.25.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e2f6a2347d3440ae789505693a02836383426249d5293541cd712e07e7aecf54"},
+ {file = "rpds_py-0.25.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4fd52d3455a0aa997734f3835cbc4c9f32571345143960e7d7ebfe7b5fbfa3b2"},
+ {file = "rpds_py-0.25.1-cp310-cp310-win32.whl", hash = "sha256:3f0b1798cae2bbbc9b9db44ee068c556d4737911ad53a4e5093d09d04b3bbc24"},
+ {file = "rpds_py-0.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:3ebd879ab996537fc510a2be58c59915b5dd63bccb06d1ef514fee787e05984a"},
+ {file = "rpds_py-0.25.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5f048bbf18b1f9120685c6d6bb70cc1a52c8cc11bdd04e643d28d3be0baf666d"},
+ {file = "rpds_py-0.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fbb0dbba559959fcb5d0735a0f87cdbca9e95dac87982e9b95c0f8f7ad10255"},
+ {file = "rpds_py-0.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4ca54b9cf9d80b4016a67a0193ebe0bcf29f6b0a96f09db942087e294d3d4c2"},
+ {file = "rpds_py-0.25.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ee3e26eb83d39b886d2cb6e06ea701bba82ef30a0de044d34626ede51ec98b0"},
+ {file = "rpds_py-0.25.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89706d0683c73a26f76a5315d893c051324d771196ae8b13e6ffa1ffaf5e574f"},
+ {file = "rpds_py-0.25.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2013ee878c76269c7b557a9a9c042335d732e89d482606990b70a839635feb7"},
+ {file = "rpds_py-0.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45e484db65e5380804afbec784522de84fa95e6bb92ef1bd3325d33d13efaebd"},
+ {file = "rpds_py-0.25.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:48d64155d02127c249695abb87d39f0faf410733428d499867606be138161d65"},
+ {file = "rpds_py-0.25.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:048893e902132fd6548a2e661fb38bf4896a89eea95ac5816cf443524a85556f"},
+ {file = "rpds_py-0.25.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0317177b1e8691ab5879f4f33f4b6dc55ad3b344399e23df2e499de7b10a548d"},
+ {file = "rpds_py-0.25.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bffcf57826d77a4151962bf1701374e0fc87f536e56ec46f1abdd6a903354042"},
+ {file = "rpds_py-0.25.1-cp311-cp311-win32.whl", hash = "sha256:cda776f1967cb304816173b30994faaf2fd5bcb37e73118a47964a02c348e1bc"},
+ {file = "rpds_py-0.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:dc3c1ff0abc91444cd20ec643d0f805df9a3661fcacf9c95000329f3ddf268a4"},
+ {file = "rpds_py-0.25.1-cp311-cp311-win_arm64.whl", hash = "sha256:5a3ddb74b0985c4387719fc536faced33cadf2172769540c62e2a94b7b9be1c4"},
+ {file = "rpds_py-0.25.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5ffe453cde61f73fea9430223c81d29e2fbf412a6073951102146c84e19e34c"},
+ {file = "rpds_py-0.25.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:115874ae5e2fdcfc16b2aedc95b5eef4aebe91b28e7e21951eda8a5dc0d3461b"},
+ {file = "rpds_py-0.25.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a714bf6e5e81b0e570d01f56e0c89c6375101b8463999ead3a93a5d2a4af91fa"},
+ {file = "rpds_py-0.25.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35634369325906bcd01577da4c19e3b9541a15e99f31e91a02d010816b49bfda"},
+ {file = "rpds_py-0.25.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4cb2b3ddc16710548801c6fcc0cfcdeeff9dafbc983f77265877793f2660309"},
+ {file = "rpds_py-0.25.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ceca1cf097ed77e1a51f1dbc8d174d10cb5931c188a4505ff9f3e119dfe519b"},
+ {file = "rpds_py-0.25.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2cd1a4b0c2b8c5e31ffff50d09f39906fe351389ba143c195566056c13a7ea"},
+ {file = "rpds_py-0.25.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1de336a4b164c9188cb23f3703adb74a7623ab32d20090d0e9bf499a2203ad65"},
+ {file = "rpds_py-0.25.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9fca84a15333e925dd59ce01da0ffe2ffe0d6e5d29a9eeba2148916d1824948c"},
+ {file = "rpds_py-0.25.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88ec04afe0c59fa64e2f6ea0dd9657e04fc83e38de90f6de201954b4d4eb59bd"},
+ {file = "rpds_py-0.25.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8bd2f19e312ce3e1d2c635618e8a8d8132892bb746a7cf74780a489f0f6cdcb"},
+ {file = "rpds_py-0.25.1-cp312-cp312-win32.whl", hash = "sha256:e5e2f7280d8d0d3ef06f3ec1b4fd598d386cc6f0721e54f09109a8132182fbfe"},
+ {file = "rpds_py-0.25.1-cp312-cp312-win_amd64.whl", hash = "sha256:db58483f71c5db67d643857404da360dce3573031586034b7d59f245144cc192"},
+ {file = "rpds_py-0.25.1-cp312-cp312-win_arm64.whl", hash = "sha256:6d50841c425d16faf3206ddbba44c21aa3310a0cebc3c1cdfc3e3f4f9f6f5728"},
+ {file = "rpds_py-0.25.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:659d87430a8c8c704d52d094f5ba6fa72ef13b4d385b7e542a08fc240cb4a559"},
+ {file = "rpds_py-0.25.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68f6f060f0bbdfb0245267da014d3a6da9be127fe3e8cc4a68c6f833f8a23bb1"},
+ {file = "rpds_py-0.25.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083a9513a33e0b92cf6e7a6366036c6bb43ea595332c1ab5c8ae329e4bcc0a9c"},
+ {file = "rpds_py-0.25.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:816568614ecb22b18a010c7a12559c19f6fe993526af88e95a76d5a60b8b75fb"},
+ {file = "rpds_py-0.25.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c6564c0947a7f52e4792983f8e6cf9bac140438ebf81f527a21d944f2fd0a40"},
+ {file = "rpds_py-0.25.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c4a128527fe415d73cf1f70a9a688d06130d5810be69f3b553bf7b45e8acf79"},
+ {file = "rpds_py-0.25.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e1d7a4978ed554f095430b89ecc23f42014a50ac385eb0c4d163ce213c325"},
+ {file = "rpds_py-0.25.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d74ec9bc0e2feb81d3f16946b005748119c0f52a153f6db6a29e8cd68636f295"},
+ {file = "rpds_py-0.25.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3af5b4cc10fa41e5bc64e5c198a1b2d2864337f8fcbb9a67e747e34002ce812b"},
+ {file = "rpds_py-0.25.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:79dc317a5f1c51fd9c6a0c4f48209c6b8526d0524a6904fc1076476e79b00f98"},
+ {file = "rpds_py-0.25.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1521031351865e0181bc585147624d66b3b00a84109b57fcb7a779c3ec3772cd"},
+ {file = "rpds_py-0.25.1-cp313-cp313-win32.whl", hash = "sha256:5d473be2b13600b93a5675d78f59e63b51b1ba2d0476893415dfbb5477e65b31"},
+ {file = "rpds_py-0.25.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7b74e92a3b212390bdce1d93da9f6488c3878c1d434c5e751cbc202c5e09500"},
+ {file = "rpds_py-0.25.1-cp313-cp313-win_arm64.whl", hash = "sha256:dd326a81afe332ede08eb39ab75b301d5676802cdffd3a8f287a5f0b694dc3f5"},
+ {file = "rpds_py-0.25.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:a58d1ed49a94d4183483a3ce0af22f20318d4a1434acee255d683ad90bf78129"},
+ {file = "rpds_py-0.25.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f251bf23deb8332823aef1da169d5d89fa84c89f67bdfb566c49dea1fccfd50d"},
+ {file = "rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dbd586bfa270c1103ece2109314dd423df1fa3d9719928b5d09e4840cec0d72"},
+ {file = "rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d273f136e912aa101a9274c3145dcbddbe4bac560e77e6d5b3c9f6e0ed06d34"},
+ {file = "rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:666fa7b1bd0a3810a7f18f6d3a25ccd8866291fbbc3c9b912b917a6715874bb9"},
+ {file = "rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:921954d7fbf3fccc7de8f717799304b14b6d9a45bbeec5a8d7408ccbf531faf5"},
+ {file = "rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3d86373ff19ca0441ebeb696ef64cb58b8b5cbacffcda5a0ec2f3911732a194"},
+ {file = "rpds_py-0.25.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c8980cde3bb8575e7c956a530f2c217c1d6aac453474bf3ea0f9c89868b531b6"},
+ {file = "rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8eb8c84ecea987a2523e057c0d950bcb3f789696c0499290b8d7b3107a719d78"},
+ {file = "rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e43a005671a9ed5a650f3bc39e4dbccd6d4326b24fb5ea8be5f3a43a6f576c72"},
+ {file = "rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:58f77c60956501a4a627749a6dcb78dac522f249dd96b5c9f1c6af29bfacfb66"},
+ {file = "rpds_py-0.25.1-cp313-cp313t-win32.whl", hash = "sha256:2cb9e5b5e26fc02c8a4345048cd9998c2aca7c2712bd1b36da0c72ee969a3523"},
+ {file = "rpds_py-0.25.1-cp313-cp313t-win_amd64.whl", hash = "sha256:401ca1c4a20cc0510d3435d89c069fe0a9ae2ee6495135ac46bdd49ec0495763"},
+ {file = "rpds_py-0.25.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ce4c8e485a3c59593f1a6f683cf0ea5ab1c1dc94d11eea5619e4fb5228b40fbd"},
+ {file = "rpds_py-0.25.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d8222acdb51a22929c3b2ddb236b69c59c72af4019d2cba961e2f9add9b6e634"},
+ {file = "rpds_py-0.25.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4593c4eae9b27d22df41cde518b4b9e4464d139e4322e2127daa9b5b981b76be"},
+ {file = "rpds_py-0.25.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd035756830c712b64725a76327ce80e82ed12ebab361d3a1cdc0f51ea21acb0"},
+ {file = "rpds_py-0.25.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:114a07e85f32b125404f28f2ed0ba431685151c037a26032b213c882f26eb908"},
+ {file = "rpds_py-0.25.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dec21e02e6cc932538b5203d3a8bd6aa1480c98c4914cb88eea064ecdbc6396a"},
+ {file = "rpds_py-0.25.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09eab132f41bf792c7a0ea1578e55df3f3e7f61888e340779b06050a9a3f16e9"},
+ {file = "rpds_py-0.25.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c98f126c4fc697b84c423e387337d5b07e4a61e9feac494362a59fd7a2d9ed80"},
+ {file = "rpds_py-0.25.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0e6a327af8ebf6baba1c10fadd04964c1965d375d318f4435d5f3f9651550f4a"},
+ {file = "rpds_py-0.25.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:bc120d1132cff853ff617754196d0ac0ae63befe7c8498bd67731ba368abe451"},
+ {file = "rpds_py-0.25.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:140f61d9bed7839446bdd44852e30195c8e520f81329b4201ceead4d64eb3a9f"},
+ {file = "rpds_py-0.25.1-cp39-cp39-win32.whl", hash = "sha256:9c006f3aadeda131b438c3092124bd196b66312f0caa5823ef09585a669cf449"},
+ {file = "rpds_py-0.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:a61d0b2c7c9a0ae45732a77844917b427ff16ad5464b4d4f5e4adb955f582890"},
+ {file = "rpds_py-0.25.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b24bf3cd93d5b6ecfbedec73b15f143596c88ee249fa98cefa9a9dc9d92c6f28"},
+ {file = "rpds_py-0.25.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:0eb90e94f43e5085623932b68840b6f379f26db7b5c2e6bcef3179bd83c9330f"},
+ {file = "rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d50e4864498a9ab639d6d8854b25e80642bd362ff104312d9770b05d66e5fb13"},
+ {file = "rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c9409b47ba0650544b0bb3c188243b83654dfe55dcc173a86832314e1a6a35d"},
+ {file = "rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:796ad874c89127c91970652a4ee8b00d56368b7e00d3477f4415fe78164c8000"},
+ {file = "rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85608eb70a659bf4c1142b2781083d4b7c0c4e2c90eff11856a9754e965b2540"},
+ {file = "rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4feb9211d15d9160bc85fa72fed46432cdc143eb9cf6d5ca377335a921ac37b"},
+ {file = "rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ccfa689b9246c48947d31dd9d8b16d89a0ecc8e0e26ea5253068efb6c542b76e"},
+ {file = "rpds_py-0.25.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3c5b317ecbd8226887994852e85de562f7177add602514d4ac40f87de3ae45a8"},
+ {file = "rpds_py-0.25.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:454601988aab2c6e8fd49e7634c65476b2b919647626208e376afcd22019eeb8"},
+ {file = "rpds_py-0.25.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:1c0c434a53714358532d13539272db75a5ed9df75a4a090a753ac7173ec14e11"},
+ {file = "rpds_py-0.25.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f73ce1512e04fbe2bc97836e89830d6b4314c171587a99688082d090f934d20a"},
+ {file = "rpds_py-0.25.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ee86d81551ec68a5c25373c5643d343150cc54672b5e9a0cafc93c1870a53954"},
+ {file = "rpds_py-0.25.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89c24300cd4a8e4a51e55c31a8ff3918e6651b241ee8876a42cc2b2a078533ba"},
+ {file = "rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:771c16060ff4e79584dc48902a91ba79fd93eade3aa3a12d6d2a4aadaf7d542b"},
+ {file = "rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:785ffacd0ee61c3e60bdfde93baa6d7c10d86f15655bd706c89da08068dc5038"},
+ {file = "rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a40046a529cc15cef88ac5ab589f83f739e2d332cb4d7399072242400ed68c9"},
+ {file = "rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85fc223d9c76cabe5d0bff82214459189720dc135db45f9f66aa7cffbf9ff6c1"},
+ {file = "rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0be9965f93c222fb9b4cc254235b3b2b215796c03ef5ee64f995b1b69af0762"},
+ {file = "rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8378fa4a940f3fb509c081e06cb7f7f2adae8cf46ef258b0e0ed7519facd573e"},
+ {file = "rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:33358883a4490287e67a2c391dfaea4d9359860281db3292b6886bf0be3d8692"},
+ {file = "rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1d1fadd539298e70cac2f2cb36f5b8a65f742b9b9f1014dd4ea1f7785e2470bf"},
+ {file = "rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9a46c2fb2545e21181445515960006e85d22025bd2fe6db23e76daec6eb689fe"},
+ {file = "rpds_py-0.25.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:50f2c501a89c9a5f4e454b126193c5495b9fb441a75b298c60591d8a2eb92e1b"},
+ {file = "rpds_py-0.25.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d779b325cc8238227c47fbc53964c8cc9a941d5dbae87aa007a1f08f2f77b23"},
+ {file = "rpds_py-0.25.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:036ded36bedb727beeabc16dc1dad7cb154b3fa444e936a03b67a86dc6a5066e"},
+ {file = "rpds_py-0.25.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:245550f5a1ac98504147cba96ffec8fabc22b610742e9150138e5d60774686d7"},
+ {file = "rpds_py-0.25.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff7c23ba0a88cb7b104281a99476cccadf29de2a0ef5ce864959a52675b1ca83"},
+ {file = "rpds_py-0.25.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e37caa8cdb3b7cf24786451a0bdb853f6347b8b92005eeb64225ae1db54d1c2b"},
+ {file = "rpds_py-0.25.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2f48ab00181600ee266a095fe815134eb456163f7d6699f525dee471f312cf"},
+ {file = "rpds_py-0.25.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e5fc7484fa7dce57e25063b0ec9638ff02a908304f861d81ea49273e43838c1"},
+ {file = "rpds_py-0.25.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d3c10228d6cf6fe2b63d2e7985e94f6916fa46940df46b70449e9ff9297bd3d1"},
+ {file = "rpds_py-0.25.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:5d9e40f32745db28c1ef7aad23f6fc458dc1e29945bd6781060f0d15628b8ddf"},
+ {file = "rpds_py-0.25.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:35a8d1a24b5936b35c5003313bc177403d8bdef0f8b24f28b1c4a255f94ea992"},
+ {file = "rpds_py-0.25.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6099263f526efff9cf3883dfef505518730f7a7a93049b1d90d42e50a22b4793"},
+ {file = "rpds_py-0.25.1.tar.gz", hash = "sha256:8960b6dac09b62dac26e75d7e2c4a22efb835d827a7278c34f72b2b84fa160e3"},
]
[[package]]
name = "rsa"
version = "4.9.1"
description = "Pure-Python RSA implementation"
-optional = false
+optional = true
python-versions = "<4,>=3.6"
files = [
{file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"},
@@ -3012,36 +3177,36 @@ pyasn1 = ">=0.1.3"
[[package]]
name = "ruff"
-version = "0.11.10"
+version = "0.11.12"
description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false
python-versions = ">=3.7"
files = [
- {file = "ruff-0.11.10-py3-none-linux_armv6l.whl", hash = "sha256:859a7bfa7bc8888abbea31ef8a2b411714e6a80f0d173c2a82f9041ed6b50f58"},
- {file = "ruff-0.11.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:968220a57e09ea5e4fd48ed1c646419961a0570727c7e069842edd018ee8afed"},
- {file = "ruff-0.11.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1067245bad978e7aa7b22f67113ecc6eb241dca0d9b696144256c3a879663bca"},
- {file = "ruff-0.11.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4854fd09c7aed5b1590e996a81aeff0c9ff51378b084eb5a0b9cd9518e6cff2"},
- {file = "ruff-0.11.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b4564e9f99168c0f9195a0fd5fa5928004b33b377137f978055e40008a082c5"},
- {file = "ruff-0.11.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b6a9cc5b62c03cc1fea0044ed8576379dbaf751d5503d718c973d5418483641"},
- {file = "ruff-0.11.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:607ecbb6f03e44c9e0a93aedacb17b4eb4f3563d00e8b474298a201622677947"},
- {file = "ruff-0.11.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b3a522fa389402cd2137df9ddefe848f727250535c70dafa840badffb56b7a4"},
- {file = "ruff-0.11.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f071b0deed7e9245d5820dac235cbdd4ef99d7b12ff04c330a241ad3534319f"},
- {file = "ruff-0.11.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a60e3a0a617eafba1f2e4186d827759d65348fa53708ca547e384db28406a0b"},
- {file = "ruff-0.11.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:da8ec977eaa4b7bf75470fb575bea2cb41a0e07c7ea9d5a0a97d13dbca697bf2"},
- {file = "ruff-0.11.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ddf8967e08227d1bd95cc0851ef80d2ad9c7c0c5aab1eba31db49cf0a7b99523"},
- {file = "ruff-0.11.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5a94acf798a82db188f6f36575d80609072b032105d114b0f98661e1679c9125"},
- {file = "ruff-0.11.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3afead355f1d16d95630df28d4ba17fb2cb9c8dfac8d21ced14984121f639bad"},
- {file = "ruff-0.11.10-py3-none-win32.whl", hash = "sha256:dc061a98d32a97211af7e7f3fa1d4ca2fcf919fb96c28f39551f35fc55bdbc19"},
- {file = "ruff-0.11.10-py3-none-win_amd64.whl", hash = "sha256:5cc725fbb4d25b0f185cb42df07ab6b76c4489b4bfb740a175f3a59c70e8a224"},
- {file = "ruff-0.11.10-py3-none-win_arm64.whl", hash = "sha256:ef69637b35fb8b210743926778d0e45e1bffa850a7c61e428c6b971549b5f5d1"},
- {file = "ruff-0.11.10.tar.gz", hash = "sha256:d522fb204b4959909ecac47da02830daec102eeb100fb50ea9554818d47a5fa6"},
+ {file = "ruff-0.11.12-py3-none-linux_armv6l.whl", hash = "sha256:c7680aa2f0d4c4f43353d1e72123955c7a2159b8646cd43402de6d4a3a25d7cc"},
+ {file = "ruff-0.11.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2cad64843da9f134565c20bcc430642de897b8ea02e2e79e6e02a76b8dcad7c3"},
+ {file = "ruff-0.11.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9b6886b524a1c659cee1758140138455d3c029783d1b9e643f3624a5ee0cb0aa"},
+ {file = "ruff-0.11.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc3a3690aad6e86c1958d3ec3c38c4594b6ecec75c1f531e84160bd827b2012"},
+ {file = "ruff-0.11.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f97fdbc2549f456c65b3b0048560d44ddd540db1f27c778a938371424b49fe4a"},
+ {file = "ruff-0.11.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74adf84960236961090e2d1348c1a67d940fd12e811a33fb3d107df61eef8fc7"},
+ {file = "ruff-0.11.12-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b56697e5b8bcf1d61293ccfe63873aba08fdbcbbba839fc046ec5926bdb25a3a"},
+ {file = "ruff-0.11.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d47afa45e7b0eaf5e5969c6b39cbd108be83910b5c74626247e366fd7a36a13"},
+ {file = "ruff-0.11.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bf9603fe1bf949de8b09a2da896f05c01ed7a187f4a386cdba6760e7f61be"},
+ {file = "ruff-0.11.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08033320e979df3b20dba567c62f69c45e01df708b0f9c83912d7abd3e0801cd"},
+ {file = "ruff-0.11.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:929b7706584f5bfd61d67d5070f399057d07c70585fa8c4491d78ada452d3bef"},
+ {file = "ruff-0.11.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7de4a73205dc5756b8e09ee3ed67c38312dce1aa28972b93150f5751199981b5"},
+ {file = "ruff-0.11.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2635c2a90ac1b8ca9e93b70af59dfd1dd2026a40e2d6eebaa3efb0465dd9cf02"},
+ {file = "ruff-0.11.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d05d6a78a89166f03f03a198ecc9d18779076ad0eec476819467acb401028c0c"},
+ {file = "ruff-0.11.12-py3-none-win32.whl", hash = "sha256:f5a07f49767c4be4772d161bfc049c1f242db0cfe1bd976e0f0886732a4765d6"},
+ {file = "ruff-0.11.12-py3-none-win_amd64.whl", hash = "sha256:5a4d9f8030d8c3a45df201d7fb3ed38d0219bccd7955268e863ee4a115fa0832"},
+ {file = "ruff-0.11.12-py3-none-win_arm64.whl", hash = "sha256:65194e37853158d368e333ba282217941029a28ea90913c67e558c611d04daa5"},
+ {file = "ruff-0.11.12.tar.gz", hash = "sha256:43cf7f69c7d7c7d7513b9d59c5d8cafd704e05944f978614aa9faff6ac202603"},
]
[[package]]
name = "safetensors"
version = "0.5.3"
description = ""
-optional = false
+optional = true
python-versions = ">=3.7"
files = [
{file = "safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073"},
@@ -3078,7 +3243,7 @@ torch = ["safetensors[numpy]", "torch (>=1.10)"]
name = "scikit-learn"
version = "1.6.1"
description = "A set of python modules for machine learning and data mining"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
{file = "scikit_learn-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d056391530ccd1e501056160e3c9673b4da4805eb67eb2bdf4e983e1f9c9204e"},
@@ -3130,57 +3295,57 @@ tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (
[[package]]
name = "scipy"
-version = "1.15.2"
+version = "1.15.3"
description = "Fundamental algorithms for scientific computing in Python"
-optional = false
+optional = true
python-versions = ">=3.10"
files = [
- {file = "scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9"},
- {file = "scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5"},
- {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ecf797d2d798cf7c838c6d98321061eb3e72a74710e6c40540f0e8087e3b499e"},
- {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:9b18aa747da280664642997e65aab1dd19d0c3d17068a04b3fe34e2559196cb9"},
- {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87994da02e73549dfecaed9e09a4f9d58a045a053865679aeb8d6d43747d4df3"},
- {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69ea6e56d00977f355c0f84eba69877b6df084516c602d93a33812aa04d90a3d"},
- {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:888307125ea0c4466287191e5606a2c910963405ce9671448ff9c81c53f85f58"},
- {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9412f5e408b397ff5641080ed1e798623dbe1ec0d78e72c9eca8992976fa65aa"},
- {file = "scipy-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:b5e025e903b4f166ea03b109bb241355b9c42c279ea694d8864d033727205e65"},
- {file = "scipy-1.15.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:92233b2df6938147be6fa8824b8136f29a18f016ecde986666be5f4d686a91a4"},
- {file = "scipy-1.15.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:62ca1ff3eb513e09ed17a5736929429189adf16d2d740f44e53270cc800ecff1"},
- {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4c6676490ad76d1c2894d77f976144b41bd1a4052107902238047fb6a473e971"},
- {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8bf5cb4a25046ac61d38f8d3c3426ec11ebc350246a4642f2f315fe95bda655"},
- {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a8e34cf4c188b6dd004654f88586d78f95639e48a25dfae9c5e34a6dc34547e"},
- {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28a0d2c2075946346e4408b211240764759e0fabaeb08d871639b5f3b1aca8a0"},
- {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42dabaaa798e987c425ed76062794e93a243be8f0f20fff6e7a89f4d61cb3d40"},
- {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f5e296ec63c5da6ba6fa0343ea73fd51b8b3e1a300b0a8cae3ed4b1122c7462"},
- {file = "scipy-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:597a0c7008b21c035831c39927406c6181bcf8f60a73f36219b69d010aa04737"},
- {file = "scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd"},
- {file = "scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301"},
- {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93"},
- {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20"},
- {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e"},
- {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8"},
- {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11"},
- {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53"},
- {file = "scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded"},
- {file = "scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf"},
- {file = "scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37"},
- {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d"},
- {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb"},
- {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27"},
- {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0"},
- {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32"},
- {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d"},
- {file = "scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f"},
- {file = "scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9"},
- {file = "scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f"},
- {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6"},
- {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af"},
- {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274"},
- {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776"},
- {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828"},
- {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28"},
- {file = "scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db"},
- {file = "scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec"},
+ {file = "scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c"},
+ {file = "scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253"},
+ {file = "scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f"},
+ {file = "scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92"},
+ {file = "scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82"},
+ {file = "scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40"},
+ {file = "scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e"},
+ {file = "scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c"},
+ {file = "scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13"},
+ {file = "scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b"},
+ {file = "scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba"},
+ {file = "scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65"},
+ {file = "scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1"},
+ {file = "scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889"},
+ {file = "scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982"},
+ {file = "scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9"},
+ {file = "scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594"},
+ {file = "scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb"},
+ {file = "scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019"},
+ {file = "scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6"},
+ {file = "scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477"},
+ {file = "scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c"},
+ {file = "scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45"},
+ {file = "scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49"},
+ {file = "scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e"},
+ {file = "scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539"},
+ {file = "scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed"},
+ {file = "scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759"},
+ {file = "scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62"},
+ {file = "scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb"},
+ {file = "scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730"},
+ {file = "scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825"},
+ {file = "scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7"},
+ {file = "scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11"},
+ {file = "scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126"},
+ {file = "scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163"},
+ {file = "scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8"},
+ {file = "scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5"},
+ {file = "scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e"},
+ {file = "scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb"},
+ {file = "scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723"},
+ {file = "scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb"},
+ {file = "scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4"},
+ {file = "scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5"},
+ {file = "scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca"},
+ {file = "scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf"},
]
[package.dependencies]
@@ -3188,18 +3353,18 @@ numpy = ">=1.23.5,<2.5"
[package.extras]
dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"]
-doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"]
+doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"]
test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
[[package]]
name = "setuptools"
-version = "80.0.0"
+version = "80.9.0"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
- {file = "setuptools-80.0.0-py3-none-any.whl", hash = "sha256:a38f898dcd6e5380f4da4381a87ec90bd0a7eec23d204a5552e80ee3cab6bd27"},
- {file = "setuptools-80.0.0.tar.gz", hash = "sha256:c40a5b3729d58dd749c0f08f1a07d134fb8a0a3d7f87dc33e7c5e1f762138650"},
+ {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"},
+ {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"},
]
[package.extras]
@@ -3226,7 +3391,7 @@ files = [
name = "sniffio"
version = "1.3.1"
description = "Sniff out which async library your code is running under"
-optional = false
+optional = true
python-versions = ">=3.7"
files = [
{file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
@@ -3235,44 +3400,46 @@ files = [
[[package]]
name = "soupsieve"
-version = "2.6"
+version = "2.7"
description = "A modern CSS selector implementation for Beautiful Soup."
optional = false
python-versions = ">=3.8"
files = [
- {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"},
- {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"},
+ {file = "soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4"},
+ {file = "soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a"},
]
[[package]]
name = "surya-ocr"
-version = "0.13.1"
+version = "0.14.5"
description = "OCR, layout, reading order, and table recognition in 90+ languages"
-optional = false
+optional = true
python-versions = "<4.0,>=3.10"
files = [
- {file = "surya_ocr-0.13.1-py3-none-any.whl", hash = "sha256:2704a97f5de625bc747eddf87874635cb8be164c4c9373207a022648325f009d"},
- {file = "surya_ocr-0.13.1.tar.gz", hash = "sha256:af4004448eb8798aeddd4aa709c2f4d3795a3ec7bf12252595b481a65f799a52"},
+ {file = "surya_ocr-0.14.5-py3-none-any.whl", hash = "sha256:3293fdcc1f1a6e83b177479d9d71d51359e3028a4b7ada47094069b08fe652be"},
+ {file = "surya_ocr-0.14.5.tar.gz", hash = "sha256:1609ec6d9ab84003e7cde93f0cba4edefb052439faffddeff0832b0f36e49b00"},
]
[package.dependencies]
click = ">=8.1.8,<9.0.0"
+einops = ">=0.8.1,<0.9.0"
filetype = ">=1.2.0,<2.0.0"
opencv-python-headless = ">=4.11.0.86,<5.0.0.0"
pillow = ">=10.2.0,<11.0.0"
platformdirs = ">=4.3.6,<5.0.0"
+pre-commit = ">=4.2.0,<5.0.0"
pydantic = ">=2.5.3,<3.0.0"
pydantic-settings = ">=2.1.0,<3.0.0"
pypdfium2 = "4.30.0"
python-dotenv = ">=1.0.0,<2.0.0"
-torch = ">=2.5.1,<3.0.0"
-transformers = ">=4.41.0,<5.0.0"
+torch = ">=2.7.0,<3.0.0"
+transformers = ">=4.51.2,<5.0.0"
[[package]]
name = "sympy"
version = "1.14.0"
description = "Computer algebra system (CAS) in Python"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
{file = "sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5"},
@@ -3289,7 +3456,7 @@ dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"]
name = "threadpoolctl"
version = "3.6.0"
description = "threadpoolctl"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
{file = "threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb"},
@@ -3300,7 +3467,7 @@ files = [
name = "tokenizers"
version = "0.21.1"
description = ""
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
{file = "tokenizers-0.21.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e78e413e9e668ad790a29456e677d9d3aa50a9ad311a40905d6861ba7692cf41"},
@@ -3373,7 +3540,7 @@ files = [
name = "torch"
version = "2.7.0"
description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration"
-optional = false
+optional = true
python-versions = ">=3.9.0"
files = [
{file = "torch-2.7.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c9afea41b11e1a1ab1b258a5c31afbd646d6319042bfe4f231b408034b51128b"},
@@ -3453,13 +3620,13 @@ telegram = ["requests"]
[[package]]
name = "transformers"
-version = "4.51.3"
+version = "4.52.4"
description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow"
-optional = false
+optional = true
python-versions = ">=3.9.0"
files = [
- {file = "transformers-4.51.3-py3-none-any.whl", hash = "sha256:fd3279633ceb2b777013234bbf0b4f5c2d23c4626b05497691f00cfda55e8a83"},
- {file = "transformers-4.51.3.tar.gz", hash = "sha256:e292fcab3990c6defe6328f0f7d2004283ca81a7a07b2de9a46d67fd81ea1409"},
+ {file = "transformers-4.52.4-py3-none-any.whl", hash = "sha256:203f5c19416d5877e36e88633943761719538a25d9775977a24fe77a1e5adfc7"},
+ {file = "transformers-4.52.4.tar.gz", hash = "sha256:aff3764441c1adc192a08dba49740d3cbbcb72d850586075aed6bd89b98203e6"},
]
[package.dependencies]
@@ -3476,22 +3643,21 @@ tqdm = ">=4.27"
[package.extras]
accelerate = ["accelerate (>=0.26.0)"]
-agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=2.0)"]
-all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "codecarbon (>=2.8.1)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "kernels (>=0.3.2,<0.4)", "librosa", "num2words", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "torchaudio", "torchvision"]
+all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "codecarbon (>=2.8.1)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "kernels (>=0.4.4,<0.5)", "librosa", "num2words", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.1,<2.7)", "torchaudio", "torchvision"]
audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"]
benchmark = ["optimum-benchmark (>=0.3.0)"]
codecarbon = ["codecarbon (>=2.8.1)"]
deepspeed = ["accelerate (>=0.26.0)", "deepspeed (>=0.9.3)"]
-deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.26.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"]
-dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "kernels (>=0.3.2,<0.4)", "libcst", "librosa", "nltk (<=3.8.1)", "num2words", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"]
-dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.21,<0.22)", "urllib3 (<2.0.0)"]
-dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "kernels (>=0.3.2,<0.4)", "libcst", "librosa", "nltk (<=3.8.1)", "num2words", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"]
+deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.26.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"]
+dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "kernels (>=0.4.4,<0.5)", "libcst", "librosa", "nltk (<=3.8.1)", "num2words", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.1,<2.7)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"]
+dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.21,<0.22)", "urllib3 (<2.0.0)"]
+dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "kernels (>=0.4.4,<0.5)", "libcst", "librosa", "nltk (<=3.8.1)", "num2words", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.1,<2.7)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"]
flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"]
flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"]
ftfy = ["ftfy"]
hf-xet = ["hf-xet"]
-hub-kernels = ["kernels (>=0.3.2,<0.4)"]
-integrations = ["kernels (>=0.3.2,<0.4)", "optuna", "ray[tune] (>=2.7.0)", "sigopt"]
+hub-kernels = ["kernels (>=0.4.4,<0.5)"]
+integrations = ["kernels (>=0.4.4,<0.5)", "optuna", "ray[tune] (>=2.7.0)", "sigopt"]
ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"]
modelcreation = ["cookiecutter (==1.7.3)"]
natten = ["natten (>=0.14.6,<0.15.0)"]
@@ -3509,17 +3675,17 @@ serving = ["fastapi", "pydantic", "starlette", "uvicorn"]
sigopt = ["sigopt"]
sklearn = ["scikit-learn"]
speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"]
-testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"]
+testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"]
tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"]
tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"]
tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"]
tiktoken = ["blobfile", "tiktoken"]
timm = ["timm (<=1.0.11)"]
tokenizers = ["tokenizers (>=0.21,<0.22)"]
-torch = ["accelerate (>=0.26.0)", "torch (>=2.0)"]
+torch = ["accelerate (>=0.26.0)", "torch (>=2.1,<2.7)"]
torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"]
torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"]
-torchhub = ["filelock", "huggingface-hub (>=0.30.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "tqdm (>=4.27)"]
+torchhub = ["filelock", "huggingface-hub (>=0.30.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.21,<0.22)", "torch (>=2.1,<2.7)", "tqdm (>=4.27)"]
video = ["av"]
vision = ["Pillow (>=10.0.1,<=15.0)"]
@@ -3527,7 +3693,7 @@ vision = ["Pillow (>=10.0.1,<=15.0)"]
name = "triton"
version = "3.3.0"
description = "A language and compiler for custom Deep Learning operations"
-optional = false
+optional = true
python-versions = "*"
files = [
{file = "triton-3.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fad99beafc860501d7fcc1fb7045d9496cbe2c882b1674640304949165a916e7"},
@@ -3562,25 +3728,24 @@ types-html5lib = "*"
[[package]]
name = "types-html5lib"
-version = "1.1.11.20241018"
+version = "1.1.11.20250516"
description = "Typing stubs for html5lib"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "types-html5lib-1.1.11.20241018.tar.gz", hash = "sha256:98042555ff78d9e3a51c77c918b1041acbb7eb6c405408d8a9e150ff5beccafa"},
- {file = "types_html5lib-1.1.11.20241018-py3-none-any.whl", hash = "sha256:3f1e064d9ed2c289001ae6392c84c93833abb0816165c6ff0abfc304a779f403"},
+ {file = "types_html5lib-1.1.11.20250516-py3-none-any.whl", hash = "sha256:5e407b14b1bd2b9b1107cbd1e2e19d4a0c46d60febd231c7ab7313d7405663c1"},
+ {file = "types_html5lib-1.1.11.20250516.tar.gz", hash = "sha256:65043a6718c97f7d52567cc0cdf41efbfc33b1f92c6c0c5e19f60a7ec69ae720"},
]
[[package]]
name = "types-jsonschema"
-version = "4.23.0.20250516"
+version = "4.24.0.20250528"
description = "Typing stubs for jsonschema"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
files = [
- {file = "types_jsonschema-4.23.0.20250516-py3-none-any.whl", hash = "sha256:e7d0dd7db7e59e63c26e3230e26ffc64c4704cc5170dc21270b366a35ead1618"},
- {file = "types_jsonschema-4.23.0.20250516.tar.gz", hash = "sha256:9ace09d9d35c4390a7251ccd7d833b92ccc189d24d1b347f26212afce361117e"},
+ {file = "types_jsonschema-4.24.0.20250528-py3-none-any.whl", hash = "sha256:6a906b5ff73ac11c8d1e0b6c30a9693e1e4e1ab56c56c932b3a7e081b86d187b"},
+ {file = "types_jsonschema-4.24.0.20250528.tar.gz", hash = "sha256:7e28c64e0ae7980eeb158105b20663fc6a6b8f81d5f86ea6614aa0014417bd1e"},
]
[package.dependencies]
@@ -3588,13 +3753,24 @@ referencing = "*"
[[package]]
name = "types-pytz"
-version = "2025.2.0.20250326"
+version = "2025.2.0.20250516"
description = "Typing stubs for pytz"
optional = false
python-versions = ">=3.9"
files = [
- {file = "types_pytz-2025.2.0.20250326-py3-none-any.whl", hash = "sha256:3c397fd1b845cd2b3adc9398607764ced9e578a98a5d1fbb4a9bc9253edfb162"},
- {file = "types_pytz-2025.2.0.20250326.tar.gz", hash = "sha256:deda02de24f527066fc8d6a19e284ab3f3ae716a42b4adb6b40e75e408c08d36"},
+ {file = "types_pytz-2025.2.0.20250516-py3-none-any.whl", hash = "sha256:e0e0c8a57e2791c19f718ed99ab2ba623856b11620cb6b637e5f62ce285a7451"},
+ {file = "types_pytz-2025.2.0.20250516.tar.gz", hash = "sha256:e1216306f8c0d5da6dafd6492e72eb080c9a166171fa80dd7a1990fd8be7a7b3"},
+]
+
+[[package]]
+name = "types-pywin32"
+version = "310.0.0.20250516"
+description = "Typing stubs for pywin32"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "types_pywin32-310.0.0.20250516-py3-none-any.whl", hash = "sha256:f9ef83a1ec3e5aae2b0e24c5f55ab41272b5dfeaabb9a0451d33684c9545e41a"},
+ {file = "types_pywin32-310.0.0.20250516.tar.gz", hash = "sha256:91e5bfc033f65c9efb443722eff8101e31d690dd9a540fa77525590d3da9cc9d"},
]
[[package]]
@@ -3610,13 +3786,13 @@ files = [
[[package]]
name = "types-requests"
-version = "2.32.0.20250306"
+version = "2.32.0.20250602"
description = "Typing stubs for requests"
optional = false
python-versions = ">=3.9"
files = [
- {file = "types_requests-2.32.0.20250306-py3-none-any.whl", hash = "sha256:25f2cbb5c8710b2022f8bbee7b2b66f319ef14aeea2f35d80f18c9dbf3b60a0b"},
- {file = "types_requests-2.32.0.20250306.tar.gz", hash = "sha256:0962352694ec5b2f95fda877ee60a159abdf84a0fc6fdace599f20acb41a03d1"},
+ {file = "types_requests-2.32.0.20250602-py3-none-any.whl", hash = "sha256:f4f335f87779b47ce10b8b8597b409130299f6971ead27fead4fe7ba6ea3e726"},
+ {file = "types_requests-2.32.0.20250602.tar.gz", hash = "sha256:ee603aeefec42051195ae62ca7667cd909a2f8128fdf8aad9e8a5219ecfab3bf"},
]
[package.dependencies]
@@ -3638,24 +3814,39 @@ types-requests = "*"
[[package]]
name = "typing-extensions"
-version = "4.12.2"
-description = "Backported and Experimental Type Hints for Python 3.8+"
+version = "4.14.0"
+description = "Backported and Experimental Type Hints for Python 3.9+"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
- {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
+ {file = "typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af"},
+ {file = "typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4"},
]
+[[package]]
+name = "typing-inspect"
+version = "0.9.0"
+description = "Runtime inspection utilities for typing module."
+optional = false
+python-versions = "*"
+files = [
+ {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"},
+ {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"},
+]
+
+[package.dependencies]
+mypy-extensions = ">=0.3.0"
+typing-extensions = ">=3.7.4"
+
[[package]]
name = "typing-inspection"
-version = "0.4.0"
+version = "0.4.1"
description = "Runtime typing introspection tools"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
- {file = "typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f"},
- {file = "typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122"},
+ {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"},
+ {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"},
]
[package.dependencies]
@@ -3674,13 +3865,13 @@ files = [
[[package]]
name = "urllib3"
-version = "2.3.0"
+version = "2.4.0"
description = "HTTP library with thread-safe connection pooling, file post, and more."
optional = false
python-versions = ">=3.9"
files = [
- {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
- {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
+ {file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"},
+ {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"},
]
[package.extras]
@@ -3691,13 +3882,13 @@ zstd = ["zstandard (>=0.18.0)"]
[[package]]
name = "virtualenv"
-version = "20.29.3"
+version = "20.31.2"
description = "Virtual Python Environment builder"
optional = false
python-versions = ">=3.8"
files = [
- {file = "virtualenv-20.29.3-py3-none-any.whl", hash = "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170"},
- {file = "virtualenv-20.29.3.tar.gz", hash = "sha256:95e39403fcf3940ac45bc717597dba16110b74506131845d9b687d5e73d947ac"},
+ {file = "virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11"},
+ {file = "virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af"},
]
[package.dependencies]
@@ -3755,7 +3946,7 @@ watchmedo = ["PyYAML (>=3.10)"]
name = "wcwidth"
version = "0.2.13"
description = "Measures the displayed width of unicode strings in a terminal"
-optional = false
+optional = true
python-versions = "*"
files = [
{file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"},
@@ -3766,7 +3957,7 @@ files = [
name = "websockets"
version = "15.0.1"
description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
-optional = false
+optional = true
python-versions = ">=3.9"
files = [
{file = "websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b"},
@@ -3840,7 +4031,10 @@ files = [
{file = "websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee"},
]
+[extras]
+pdf = ["marker-pdf"]
+
[metadata]
lock-version = "2.0"
python-versions = ">=3.10,<4"
-content-hash = "e056cd80a80d198aebb03f56524339ba094d9202dbbc242031681883e9272f19"
+content-hash = "f4976b8b0abcf0b958b2e4014a3642ae4c7e550214dbcf74fa8ab68443d895a9"
diff --git a/pyproject.toml b/pyproject.toml
index 9229a3e5..8599a014 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -35,9 +35,12 @@ nltk = "^3.9.1"
fuzzywuzzy = {extras = ["speedup"], version = "^0.18.0"}
lxml = "^5.3.0"
pandas = "^2.2.3"
-marker-pdf = "^1.6.2"
-lxml-stubs = "^0.5.1"
-pandas-stubs = "^2.2.3.250308"
+python-docx = "^1.1.2"
+marker-pdf = { version = "^1.6.2", optional = true }
+dataclasses-json = "^0.6.7"
+
+[tool.poetry.extras]
+pdf = ["marker-pdf"]
[tool.poetry.group.dev.dependencies]
pytest = "^8.3.2"
@@ -51,6 +54,10 @@ types-beautifulsoup4 = "^4.12.0.20250204"
types-regex = "^2024.11.6.20250318"
types-tqdm = "^4.67.0.20250319"
types-jsonschema = "^4.23.0.20241208"
+types-pywin32 = "^310.0.0.20250516"
+lxml-stubs = "^0.5.1"
+pandas-stubs = "^2.2.3.250308"
+pytest-xdist = {extras = ["psutil"], version = "^3.6.1"}
[tool.poetry.group.docs.dependencies]
mkdocs = "^1.6.0"
@@ -81,7 +88,7 @@ module = ["nltk.*", "fuzzywuzzy.*", "bioc.*", "marker.*"]
ignore_missing_imports = true
[tool.pytest.ini_options]
-addopts = "-v -p no:warnings --cov=autocorpus --cov-report=html --doctest-modules --ignore=docs/ --ignore=site/"
+addopts = "-v -p no:warnings -n auto --cov=autocorpus --cov-branch --cov-report=xml --cov-report=html --doctest-modules --ignore=docs/ --ignore=site/"
[tool.ruff]
target-version = "py310"
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 00000000..f95b1211
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1 @@
+"""Tests for Auto-CORPus."""
diff --git a/tests/bioc/test_collection.py b/tests/bioc/test_collection.py
index 052c67bd..ed1c59e7 100644
--- a/tests/bioc/test_collection.py
+++ b/tests/bioc/test_collection.py
@@ -1,5 +1,6 @@
"""Unit tests for the BioCCollection class and its methods for serialization and deserialization."""
+import json
import xml.etree.ElementTree as ET
from autocorpus.ac_bioc import (
@@ -21,12 +22,14 @@ def test_to_dict(sample_collection):
def test_to_json_matches_to_dict(sample_collection):
"""Test that the JSON representation of the collection matches its dictionary representation."""
collection = sample_collection
- assert collection.to_json() == collection.to_dict()
+ json_as_dict = json.loads(collection.to_json())
+ dict_repr = collection.to_dict()
+ assert json_as_dict == dict_repr
def test_from_json(sample_collection):
"""Test creating a BioCCollection from JSON data."""
- json_data = sample_collection.to_dict()
+ json_data = sample_collection.to_json()
c = BioCCollection.from_json(json_data)
assert c.source == "test_source"
diff --git a/tests/bioc/test_document.py b/tests/bioc/test_document.py
index e6002b2d..5d662d3e 100644
--- a/tests/bioc/test_document.py
+++ b/tests/bioc/test_document.py
@@ -3,6 +3,7 @@
Including serialization to/from dictionaries, JSON, and XML.
"""
+import json
import xml.etree.ElementTree as ET
import pytest
@@ -46,7 +47,10 @@ def test_to_dict(sample_document):
def test_to_json_matches_to_dict(sample_document):
"""Test that the to_json method produces the same output as to_dict."""
- assert sample_document.to_json() == sample_document.to_dict()
+ document = sample_document
+ json_as_dict = json.loads(document.to_json())
+ dict_repr = document.to_dict()
+ assert json_as_dict == dict_repr
def test_from_dict():
diff --git a/tests/conftest.py b/tests/conftest.py
index 02d682ae..26b3568e 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -15,11 +15,13 @@
BioCRelation,
)
+DATA_PATH = Path(__file__).parent / "data"
+
@pytest.fixture
def data_path() -> Path:
"""The path to the folder containing test data files."""
- return Path(__file__).parent / "data"
+ return DATA_PATH
@pytest.fixture
@@ -44,6 +46,11 @@ def sample_collection() -> BioCCollection:
BioCPassage(
text="Hello",
offset=0,
+ infons={
+ "section_title_1": "Abstract",
+ "iao_name_1": "textual abstract section",
+ "iao_id_1": "IAO:0000315",
+ },
annotations=[
BioCAnnotation(
id="a1",
@@ -87,6 +94,12 @@ def pytest_addoption(parser):
default=False,
help="Skip tests that are unable to run in CI on macOS",
)
+ parser.addoption(
+ "--skip-ci-windows",
+ action="store_true",
+ default=False,
+ help="Skip tests that are unable to run in CI on Windows",
+ )
def pytest_configure(config):
@@ -94,16 +107,26 @@ def pytest_configure(config):
config.addinivalue_line(
"markers", "skip_ci_macos: mark test as unable to run in CI on MacOS"
)
+ config.addinivalue_line(
+ "markers", "skip_ci_windows: mark test as unable to run in CI on Windows"
+ )
def pytest_collection_modifyitems(config, items):
"""Fixture to modify test collection based on command line options."""
- if not config.getoption("--skip-ci-macos"):
- # `--skip-ci-macos` not given in cli: this is not a CI run
+ if not config.getoption("--skip-ci-macos") and not config.getoption(
+ "--skip-ci-windows"
+ ):
+ # `--skip-ci-macos` or `--skip-ci-windows` not given in cli: this is not a CI run
return
skip_ci_macos = pytest.mark.skipif(
sys.platform == "darwin", reason="Uses too much memory in CI on MacOS"
)
+ skip_ci_windows = pytest.mark.skipif(
+ sys.platform == "win32", reason="Requires Microsoft Word on Windows"
+ )
for item in items:
if "skip_ci_macos" in item.keywords:
item.add_marker(skip_ci_macos)
+ if "skip_ci_windows" in item.keywords:
+ item.add_marker(skip_ci_windows)
diff --git a/tests/data/README.md b/tests/data/README.md
new file mode 100644
index 00000000..2876787d
--- /dev/null
+++ b/tests/data/README.md
@@ -0,0 +1,72 @@
+# Test data for Auto-CORPus
+
+This folder contains data for regression tests. It is divided into public and private, depending on whether the files' licences permit redistribution.
+
+## Private data
+
+The private data is only available to members of the [omicsNLP organisation], though you can still run the other regression tests without it.
+
+[omicsNLP organisation]: https://github.com/omicsNLP
+
+### Downloading the data
+
+The data is housed in a [git submodule]. To download the data, run:
+
+```sh
+git submodule update --init
+```
+
+[git submodule]: https://git-scm.com/book/en/v2/Git-Tools-Submodules
+
+### Adding new test data
+
+Data must be committed to the `main` branch of the [Auto-CORPus-private-test-data] repository and pushed, so that it is available to other developers and the GitHub runners. (You can do this directly from the submodule directory.) The data should be structured as described in the section below.
+
+Once you have updated the private test data repository, you will also need to update the commit that the submodule points to in the main repository (this one) before making a pull request:
+
+```sh
+# Update submodule
+cd tests/data/private
+git checkout main
+git pull
+
+# Make commit in main repo
+cd ../../..
+git add tests/data/private
+git commit -m "Obtain new private data"
+```
+
+[Auto-CORPus-private-test-data]: https://github.com/omicsNLP/Auto-CORPus-private-test-data
+
+## Structure of data
+
+The `public` and `private` subfolders are each structured in the same way.
+
+Currently only data for HTML tests is provided and it is in a folder called `html`. Within that folder, there are subfolders whose names **must** correspond to a [`DefaultConfig`] (e.g. `LEGACY_PMC`). The subfolders contain the test data (i.e. HTML files) along with the expected output files (i.e. `*_bioc.json`, `*_abbreviations.json` and, optionally, `*_tables.json`). If you add new test data, you must add the corresponding output files at the same time.
+
+For example, at the time of writing, the structure of `tests/data` looks like this:
+
+```txt
+tests/data/
+├── private
+│ └── html
+│ └── PMC
+│ ├── PMC10071775_abbreviations.json
+│ ├── PMC10071775_bioc.json
+│ ├── PMC10071775.html
+│ (...)
+└── public
+ └── html
+ ├── LEGACY_PMC
+ │ ├── PMC8885717_abbreviations.json
+ │ ├── PMC8885717_bioc.json
+ │ ├── PMC8885717.html
+ │ └── PMC8885717_tables.json
+ └── PMC
+ ├── PMC8885717_abbreviations.json
+ ├── PMC8885717_bioc.json
+ ├── PMC8885717.html
+ └── PMC8885717_tables.json
+```
+
+[`DefaultConfig`]: https://omicsnlp.github.io/Auto-CORPus/reference/autocorpus/configs/default_config/#autocorpus.configs.default_config.DefaultConfig
\ No newline at end of file
diff --git a/tests/data/Supplementary/PDF/Expected Output/tp-10-08-2123-coif.pdf_bioc.json b/tests/data/Supplementary/PDF/Expected Output/tp-10-08-2123-coif.pdf_bioc.json
index 8f5113b6..e283b9e9 100644
--- a/tests/data/Supplementary/PDF/Expected Output/tp-10-08-2123-coif.pdf_bioc.json
+++ b/tests/data/Supplementary/PDF/Expected Output/tp-10-08-2123-coif.pdf_bioc.json
@@ -1,8 +1,7 @@
{
"source": "Auto-CORPus (supplementary)",
- "date": "20250516",
+ "date": "20250521",
"key": "autocorpus_supplementary.key",
- "version": "1.0",
"infons": {},
"documents": [
{
@@ -18,7 +17,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 27,
@@ -28,7 +28,8 @@
},
"text": "### **Instructions**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 47,
@@ -38,7 +39,8 @@
},
"text": " ",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 48,
@@ -48,7 +50,8 @@
},
"text": "> **The purpose of this form is to provide readers of your manuscript with information about your other interests that could influence how they receive and understand your work. The form is designed to be completed electronically and stored electronically. It contains programming that allows appropriate data display. Each author should submit a separate form and is responsible for the accuracy and completeness of the submitted information. The form is in six parts.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 519,
@@ -58,7 +61,8 @@
},
"text": "#### **Identifying information. 1.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 555,
@@ -68,7 +72,8 @@
},
"text": "#### **The work under consideration for publication. 2.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 612,
@@ -78,7 +83,8 @@
},
"text": "This section asks for information about the work that you have submitted for publication. The time frame for this reporting is that of the work itself, from the initial conception and planning to the present. The requested information is about resources that you received, either directly or indirectly (via your institution), to enable you to complete the work. Checking \"No\" means that you did the work without receiving any financial support from any third party -- that is, the work was supported by funds from the same institution that pays your salary and that institution did not receive third-party funds with which to pay you. If you or your institution received funds from a third party to support the work, such as a government granting agency, charitable foundation or commercial sponsor, check \"Yes\".",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 1425,
@@ -88,7 +94,8 @@
},
"text": "#### **Relevant financial activities outside the submitted work. 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 1494,
@@ -98,7 +105,8 @@
},
"text": "This section asks about your financial relationships with entities in the bio-medical arena that could be perceived to influence, or that give the appearance of potentially influencing, what you wrote in the submitted work. You should disclose interactions with ANY entity that could be considered broadly relevant to the work. For example, if your article is about testing an epidermal growth factor receptor (EGFR) antagonist in lung cancer, you should report all associations with entities pursuing diagnostic or therapeutic strategies in cancer in general, not just in the area of EGFR or lung cancer.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 2099,
@@ -108,7 +116,8 @@
},
"text": "Report all sources of revenue paid (or promised to be paid) directly to you or your institution on your behalf over the 36 months prior to submission of the work. This should include all monies from sources with relevance to the submitted work, not just monies from the entity that sponsored the research. Please note that your interactions with the work's sponsor that are outside the submitted work should also be listed here. If there is any question, it is usually better to disclose a relationship than not to do so.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 2620,
@@ -118,7 +127,8 @@
},
"text": " For grants you have received for work outside the submitted work, you should disclose support ONLY from entities that could be perceived to be affected financially by the published work, such as drug companies, or foundations supported by entities that could be perceived to have a financial stake in the outcome. Public funding sources, such as government agencies, charitable foundations or academic institutions, need not be disclosed. For example, if a government agency sponsored a study in which you have been involved and drugs were provided by a pharmaceutical company, you need only list the pharmaceutical company.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 3245,
@@ -128,7 +138,8 @@
},
"text": "#### **Intellectual Property. 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 3279,
@@ -138,7 +149,8 @@
},
"text": "This section asks about patents and copyrights, whether pending, issued, licensed and/or receiving royalties.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 3388,
@@ -148,7 +160,8 @@
},
"text": "#### **Relationships not covered above. 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 3432,
@@ -158,7 +171,8 @@
},
"text": "Use this section to report other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 3634,
@@ -168,7 +182,8 @@
},
"text": "### **Definitions.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 3654,
@@ -178,7 +193,8 @@
},
"text": "**Entity:** government agency, foundation, commercial sponsor, academic institution, etc.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 3743,
@@ -188,7 +204,8 @@
},
"text": "**Grant:** A grant from an entity, generally [but not always] paid to your organization",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 3830,
@@ -198,7 +215,8 @@
},
"text": "**Personal Fees:** Monies paid to you for services rendered, generally honoraria, royalties, or fees for consulting , lectures, speakers bureaus, expert testimony, employment, or other affiliations",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 4027,
@@ -208,7 +226,8 @@
},
"text": "**Non-Financial Support:** Examples include drugs/equipment supplied by the entity, travel paid by the entity, writing assistance, administrative support, etc**.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 4190,
@@ -218,7 +237,8 @@
},
"text": "**Other:** Anything not covered under the previous three boxes **Pending:** The patent has been filed but not issued **Issued:** The patent has been issued by the agency **Licensed:** The patent has been licensed to an entity, whether earning royalties or not",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 4449,
@@ -228,7 +248,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 4476,
@@ -238,7 +259,8 @@
},
"text": "Did you or your institution **at any time** receive payment or services from a third party (government, commercial, private foundation, etc.) for any aspect of the submitted work (including but not limited to grants, data monitoring board, study design, manuscript preparation, statistical analysis, etc.)?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 4782,
@@ -248,7 +270,8 @@
},
"text": "# **Relevant financial activities outside the submitted work. Section 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 4856,
@@ -258,7 +281,8 @@
},
"text": "Place a check in the appropriate boxes in the table to indicate whether you have financial relationships (regardless of amount of compensation) with entities as described in the instructions. Use one line for each entity; add as many lines as you need by clicking the \"Add +\" box. You should report relationships that were **present during the 36 months prior to publication**.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 5233,
@@ -268,7 +292,8 @@
},
"text": "# **Intellectual Property -- Patents & Copyrights Section 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 5295,
@@ -278,7 +303,8 @@
},
"text": "Do you have any patents, whether planned, pending or issued, broadly relevant to the work? Yes \u2714 No",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 5394,
@@ -288,7 +314,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 5421,
@@ -298,7 +325,8 @@
},
"text": "## **Relationships not covered above Section 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 5470,
@@ -308,7 +336,8 @@
},
"text": "Are there other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 5655,
@@ -318,7 +347,8 @@
},
"text": "Yes, the following relationships/conditions/circumstances are present (explain below):",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 5741,
@@ -328,7 +358,8 @@
},
"text": "\u2714 No other relationships/conditions/circumstances that present a potential conflict of interest",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 5836,
@@ -338,7 +369,8 @@
},
"text": "At the time of manuscript acceptance, journals will ask authors to confirm and, if necessary, update their disclosure statements. On occasion, journals may ask authors to disclose further information about reported relationships.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 6065,
@@ -348,7 +380,8 @@
},
"text": "## **Disclosure Statement Section 6.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 6103,
@@ -358,7 +391,8 @@
},
"text": "Based on the above disclosures, this form will automatically generate a disclosure statement, which will appear in the box below.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 6232,
@@ -368,7 +402,8 @@
},
"text": "Dr. Zong has nothing to disclose.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 6265,
@@ -378,7 +413,8 @@
},
"text": "### **Evaluation and Feedback**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 6296,
@@ -388,7 +424,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 6323,
@@ -398,7 +435,8 @@
},
"text": "### **Instructions**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 6343,
@@ -408,7 +446,8 @@
},
"text": " ",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 6344,
@@ -418,7 +457,8 @@
},
"text": "> **The purpose of this form is to provide readers of your manuscript with information about your other interests that could influence how they receive and understand your work. The form is designed to be completed electronically and stored electronically. It contains programming that allows appropriate data display. Each author should submit a separate form and is responsible for the accuracy and completeness of the submitted information. The form is in six parts.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 6815,
@@ -428,7 +468,8 @@
},
"text": "#### **Identifying information. 1.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 6851,
@@ -438,7 +479,8 @@
},
"text": "#### **The work under consideration for publication. 2.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 6908,
@@ -448,7 +490,8 @@
},
"text": "This section asks for information about the work that you have submitted for publication. The time frame for this reporting is that of the work itself, from the initial conception and planning to the present. The requested information is about resources that you received, either directly or indirectly (via your institution), to enable you to complete the work. Checking \"No\" means that you did the work without receiving any financial support from any third party -- that is, the work was supported by funds from the same institution that pays your salary and that institution did not receive third-party funds with which to pay you. If you or your institution received funds from a third party to support the work, such as a government granting agency, charitable foundation or commercial sponsor, check \"Yes\".",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 7721,
@@ -458,7 +501,8 @@
},
"text": "#### **Relevant financial activities outside the submitted work. 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 7790,
@@ -468,7 +512,8 @@
},
"text": "This section asks about your financial relationships with entities in the bio-medical arena that could be perceived to influence, or that give the appearance of potentially influencing, what you wrote in the submitted work. You should disclose interactions with ANY entity that could be considered broadly relevant to the work. For example, if your article is about testing an epidermal growth factor receptor (EGFR) antagonist in lung cancer, you should report all associations with entities pursuing diagnostic or therapeutic strategies in cancer in general, not just in the area of EGFR or lung cancer.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 8395,
@@ -478,7 +523,8 @@
},
"text": "Report all sources of revenue paid (or promised to be paid) directly to you or your institution on your behalf over the 36 months prior to submission of the work. This should include all monies from sources with relevance to the submitted work, not just monies from the entity that sponsored the research. Please note that your interactions with the work's sponsor that are outside the submitted work should also be listed here. If there is any question, it is usually better to disclose a relationship than not to do so.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 8916,
@@ -488,7 +534,8 @@
},
"text": " For grants you have received for work outside the submitted work, you should disclose support ONLY from entities that could be perceived to be affected financially by the published work, such as drug companies, or foundations supported by entities that could be perceived to have a financial stake in the outcome. Public funding sources, such as government agencies, charitable foundations or academic institutions, need not be disclosed. For example, if a government agency sponsored a study in which you have been involved and drugs were provided by a pharmaceutical company, you need only list the pharmaceutical company.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 9541,
@@ -498,7 +545,8 @@
},
"text": "#### **Intellectual Property. 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 9575,
@@ -508,7 +556,8 @@
},
"text": "This section asks about patents and copyrights, whether pending, issued, licensed and/or receiving royalties.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 9684,
@@ -518,7 +567,8 @@
},
"text": "#### **Relationships not covered above. 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 9728,
@@ -528,7 +578,8 @@
},
"text": "Use this section to report other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 9930,
@@ -538,7 +589,8 @@
},
"text": "### **Definitions.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 9950,
@@ -548,7 +600,8 @@
},
"text": "**Entity:** government agency, foundation, commercial sponsor, academic institution, etc.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 10039,
@@ -558,7 +611,8 @@
},
"text": "**Grant:** A grant from an entity, generally [but not always] paid to your organization",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 10126,
@@ -568,7 +622,8 @@
},
"text": "**Personal Fees:** Monies paid to you for services rendered, generally honoraria, royalties, or fees for consulting , lectures, speakers bureaus, expert testimony, employment, or other affiliations",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 10323,
@@ -578,7 +633,8 @@
},
"text": "**Non-Financial Support:** Examples include drugs/equipment supplied by the entity, travel paid by the entity, writing assistance, administrative support, etc**.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 10486,
@@ -588,7 +644,8 @@
},
"text": "**Other:** Anything not covered under the previous three boxes **Pending:** The patent has been filed but not issued **Issued:** The patent has been issued by the agency **Licensed:** The patent has been licensed to an entity, whether earning royalties or not",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 10745,
@@ -598,7 +655,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 10772,
@@ -608,7 +666,8 @@
},
"text": "## **The Work Under Consideration for Publication Section 2.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 10834,
@@ -618,7 +677,8 @@
},
"text": "Did you or your institution **at any time** receive payment or services from a third party (government, commercial, private foundation, etc.) for any aspect of the submitted work (including but not limited to grants, data monitoring board, study design, manuscript preparation, statistical analysis, etc.)?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 11140,
@@ -628,7 +688,8 @@
},
"text": "## **Relevant financial activities outside the submitted work. Section 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 11215,
@@ -638,7 +699,8 @@
},
"text": "Place a check in the appropriate boxes in the table to indicate whether you have financial relationships (regardless of amount of compensation) with entities as described in the instructions. Use one line for each entity; add as many lines as you need by clicking the \"Add +\" box. You should report relationships that were **present during the 36 months prior to publication**.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 11592,
@@ -648,7 +710,8 @@
},
"text": "# **Intellectual Property -- Patents & Copyrights Section 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 11654,
@@ -658,7 +721,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 11681,
@@ -668,7 +732,8 @@
},
"text": "## **Relationships not covered above Section 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 11730,
@@ -678,7 +743,8 @@
},
"text": "Are there other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 11915,
@@ -688,7 +754,8 @@
},
"text": "Yes, the following relationships/conditions/circumstances are present (explain below):",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 12001,
@@ -698,7 +765,8 @@
},
"text": "\u2714 No other relationships/conditions/circumstances that present a potential conflict of interest",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 12096,
@@ -708,7 +776,8 @@
},
"text": "At the time of manuscript acceptance, journals will ask authors to confirm and, if necessary, update their disclosure statements. On occasion, journals may ask authors to disclose further information about reported relationships.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 12325,
@@ -718,7 +787,8 @@
},
"text": "## **Disclosure Statement Section 6.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 12363,
@@ -728,7 +798,8 @@
},
"text": "Based on the above disclosures, this form will automatically generate a disclosure statement, which will appear in the box below.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 12492,
@@ -738,7 +809,8 @@
},
"text": "Dr. Liu has nothing to disclose.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 12524,
@@ -748,7 +820,8 @@
},
"text": "### **Evaluation and Feedback**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 12555,
@@ -758,7 +831,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 12582,
@@ -768,7 +842,8 @@
},
"text": "### **Instructions**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 12602,
@@ -778,7 +853,8 @@
},
"text": " ",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 12603,
@@ -788,7 +864,8 @@
},
"text": "> **The purpose of this form is to provide readers of your manuscript with information about your other interests that could influence how they receive and understand your work. The form is designed to be completed electronically and stored electronically. It contains programming that allows appropriate data display. Each author should submit a separate form and is responsible for the accuracy and completeness of the submitted information. The form is in six parts.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 13074,
@@ -798,7 +875,8 @@
},
"text": "#### **Identifying information. 1.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 13110,
@@ -808,7 +886,8 @@
},
"text": "#### **The work under consideration for publication. 2.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 13167,
@@ -818,7 +897,8 @@
},
"text": "This section asks for information about the work that you have submitted for publication. The time frame for this reporting is that of the work itself, from the initial conception and planning to the present. The requested information is about resources that you received, either directly or indirectly (via your institution), to enable you to complete the work. Checking \"No\" means that you did the work without receiving any financial support from any third party -- that is, the work was supported by funds from the same institution that pays your salary and that institution did not receive third-party funds with which to pay you. If you or your institution received funds from a third party to support the work, such as a government granting agency, charitable foundation or commercial sponsor, check \"Yes\".",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 13980,
@@ -828,7 +908,8 @@
},
"text": "#### **Relevant financial activities outside the submitted work. 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 14049,
@@ -838,7 +919,8 @@
},
"text": "This section asks about your financial relationships with entities in the bio-medical arena that could be perceived to influence, or that give the appearance of potentially influencing, what you wrote in the submitted work. You should disclose interactions with ANY entity that could be considered broadly relevant to the work. For example, if your article is about testing an epidermal growth factor receptor (EGFR) antagonist in lung cancer, you should report all associations with entities pursuing diagnostic or therapeutic strategies in cancer in general, not just in the area of EGFR or lung cancer.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 14654,
@@ -848,7 +930,8 @@
},
"text": "Report all sources of revenue paid (or promised to be paid) directly to you or your institution on your behalf over the 36 months prior to submission of the work. This should include all monies from sources with relevance to the submitted work, not just monies from the entity that sponsored the research. Please note that your interactions with the work's sponsor that are outside the submitted work should also be listed here. If there is any question, it is usually better to disclose a relationship than not to do so.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 15175,
@@ -858,7 +941,8 @@
},
"text": " For grants you have received for work outside the submitted work, you should disclose support ONLY from entities that could be perceived to be affected financially by the published work, such as drug companies, or foundations supported by entities that could be perceived to have a financial stake in the outcome. Public funding sources, such as government agencies, charitable foundations or academic institutions, need not be disclosed. For example, if a government agency sponsored a study in which you have been involved and drugs were provided by a pharmaceutical company, you need only list the pharmaceutical company.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 15800,
@@ -868,7 +952,8 @@
},
"text": "#### **Intellectual Property. 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 15834,
@@ -878,7 +963,8 @@
},
"text": "This section asks about patents and copyrights, whether pending, issued, licensed and/or receiving royalties.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 15943,
@@ -888,7 +974,8 @@
},
"text": "#### **Relationships not covered above. 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 15987,
@@ -898,7 +985,8 @@
},
"text": "Use this section to report other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 16189,
@@ -908,7 +996,8 @@
},
"text": "### **Definitions.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 16209,
@@ -918,7 +1007,8 @@
},
"text": "**Entity:** government agency, foundation, commercial sponsor, academic institution, etc.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 16298,
@@ -928,7 +1018,8 @@
},
"text": "**Grant:** A grant from an entity, generally [but not always] paid to your organization",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 16385,
@@ -938,7 +1029,8 @@
},
"text": "**Personal Fees:** Monies paid to you for services rendered, generally honoraria, royalties, or fees for consulting , lectures, speakers bureaus, expert testimony, employment, or other affiliations",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 16582,
@@ -948,7 +1040,8 @@
},
"text": "**Non-Financial Support:** Examples include drugs/equipment supplied by the entity, travel paid by the entity, writing assistance, administrative support, etc**.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 16745,
@@ -958,7 +1051,8 @@
},
"text": "**Other:** Anything not covered under the previous three boxes **Pending:** The patent has been filed but not issued **Issued:** The patent has been issued by the agency **Licensed:** The patent has been licensed to an entity, whether earning royalties or not",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 17004,
@@ -968,7 +1062,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 17031,
@@ -978,7 +1073,8 @@
},
"text": "Did you or your institution **at any time** receive payment or services from a third party (government, commercial, private foundation, etc.) for any aspect of the submitted work (including but not limited to grants, data monitoring board, study design, manuscript preparation, statistical analysis, etc.)?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 17337,
@@ -988,7 +1084,8 @@
},
"text": "# **Relevant financial activities outside the submitted work. Section 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 17411,
@@ -998,7 +1095,8 @@
},
"text": "Place a check in the appropriate boxes in the table to indicate whether you have financial relationships (regardless of amount of compensation) with entities as described in the instructions. Use one line for each entity; add as many lines as you need by clicking the \"Add +\" box. You should report relationships that were **present during the 36 months prior to publication**.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 17788,
@@ -1008,7 +1106,8 @@
},
"text": "# **Intellectual Property -- Patents & Copyrights Section 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 17850,
@@ -1018,7 +1117,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 17877,
@@ -1028,7 +1128,8 @@
},
"text": "## **Relationships not covered above Section 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 17926,
@@ -1038,7 +1139,8 @@
},
"text": "Are there other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 18111,
@@ -1048,7 +1150,8 @@
},
"text": "Yes, the following relationships/conditions/circumstances are present (explain below):",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 18197,
@@ -1058,7 +1161,8 @@
},
"text": "\u2714 No other relationships/conditions/circumstances that present a potential conflict of interest",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 18292,
@@ -1068,7 +1172,8 @@
},
"text": "At the time of manuscript acceptance, journals will ask authors to confirm and, if necessary, update their disclosure statements. On occasion, journals may ask authors to disclose further information about reported relationships.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 18521,
@@ -1078,7 +1183,8 @@
},
"text": "## **Disclosure Statement Section 6.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 18559,
@@ -1088,7 +1194,8 @@
},
"text": "Based on the above disclosures, this form will automatically generate a disclosure statement, which will appear in the box below.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 18688,
@@ -1098,7 +1205,8 @@
},
"text": "Dr. Hou has nothing to disclose.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 18720,
@@ -1108,7 +1216,8 @@
},
"text": "### **Evaluation and Feedback**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 18751,
@@ -1118,7 +1227,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 18778,
@@ -1128,7 +1238,8 @@
},
"text": "### **Instructions**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 18798,
@@ -1138,7 +1249,8 @@
},
"text": " ",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 18799,
@@ -1148,7 +1260,8 @@
},
"text": "> **The purpose of this form is to provide readers of your manuscript with information about your other interests that could influence how they receive and understand your work. The form is designed to be completed electronically and stored electronically. It contains programming that allows appropriate data display. Each author should submit a separate form and is responsible for the accuracy and completeness of the submitted information. The form is in six parts.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 19270,
@@ -1158,7 +1271,8 @@
},
"text": "#### **Identifying information. 1.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 19306,
@@ -1168,7 +1282,8 @@
},
"text": "#### **The work under consideration for publication. 2.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 19363,
@@ -1178,7 +1293,8 @@
},
"text": "This section asks for information about the work that you have submitted for publication. The time frame for this reporting is that of the work itself, from the initial conception and planning to the present. The requested information is about resources that you received, either directly or indirectly (via your institution), to enable you to complete the work. Checking \"No\" means that you did the work without receiving any financial support from any third party -- that is, the work was supported by funds from the same institution that pays your salary and that institution did not receive third-party funds with which to pay you. If you or your institution received funds from a third party to support the work, such as a government granting agency, charitable foundation or commercial sponsor, check \"Yes\".",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 20176,
@@ -1188,7 +1304,8 @@
},
"text": "#### **Relevant financial activities outside the submitted work. 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 20245,
@@ -1198,7 +1315,8 @@
},
"text": "This section asks about your financial relationships with entities in the bio-medical arena that could be perceived to influence, or that give the appearance of potentially influencing, what you wrote in the submitted work. You should disclose interactions with ANY entity that could be considered broadly relevant to the work. For example, if your article is about testing an epidermal growth factor receptor (EGFR) antagonist in lung cancer, you should report all associations with entities pursuing diagnostic or therapeutic strategies in cancer in general, not just in the area of EGFR or lung cancer.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 20850,
@@ -1208,7 +1326,8 @@
},
"text": "Report all sources of revenue paid (or promised to be paid) directly to you or your institution on your behalf over the 36 months prior to submission of the work. This should include all monies from sources with relevance to the submitted work, not just monies from the entity that sponsored the research. Please note that your interactions with the work's sponsor that are outside the submitted work should also be listed here. If there is any question, it is usually better to disclose a relationship than not to do so.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 21371,
@@ -1218,7 +1337,8 @@
},
"text": " For grants you have received for work outside the submitted work, you should disclose support ONLY from entities that could be perceived to be affected financially by the published work, such as drug companies, or foundations supported by entities that could be perceived to have a financial stake in the outcome. Public funding sources, such as government agencies, charitable foundations or academic institutions, need not be disclosed. For example, if a government agency sponsored a study in which you have been involved and drugs were provided by a pharmaceutical company, you need only list the pharmaceutical company.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 21996,
@@ -1228,7 +1348,8 @@
},
"text": "#### **Intellectual Property. 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 22030,
@@ -1238,7 +1359,8 @@
},
"text": "This section asks about patents and copyrights, whether pending, issued, licensed and/or receiving royalties.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 22139,
@@ -1248,7 +1370,8 @@
},
"text": "#### **Relationships not covered above. 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 22183,
@@ -1258,7 +1381,8 @@
},
"text": "Use this section to report other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 22385,
@@ -1268,7 +1392,8 @@
},
"text": "### **Definitions.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 22405,
@@ -1278,7 +1403,8 @@
},
"text": "**Entity:** government agency, foundation, commercial sponsor, academic institution, etc.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 22494,
@@ -1288,7 +1414,8 @@
},
"text": "**Grant:** A grant from an entity, generally [but not always] paid to your organization",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 22581,
@@ -1298,7 +1425,8 @@
},
"text": "**Personal Fees:** Monies paid to you for services rendered, generally honoraria, royalties, or fees for consulting , lectures, speakers bureaus, expert testimony, employment, or other affiliations",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 22778,
@@ -1308,7 +1436,8 @@
},
"text": "**Non-Financial Support:** Examples include drugs/equipment supplied by the entity, travel paid by the entity, writing assistance, administrative support, etc**.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 22941,
@@ -1318,7 +1447,8 @@
},
"text": "**Other:** Anything not covered under the previous three boxes **Pending:** The patent has been filed but not issued **Issued:** The patent has been issued by the agency **Licensed:** The patent has been licensed to an entity, whether earning royalties or not",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 23200,
@@ -1328,7 +1458,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 23228,
@@ -1338,7 +1469,8 @@
},
"text": "Did you or your institution **at any time** receive payment or services from a third party (government, commercial, private foundation, etc.) for any aspect of the submitted work (including but not limited to grants, data monitoring board, study design, manuscript preparation, statistical analysis, etc.)?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 23534,
@@ -1348,7 +1480,8 @@
},
"text": "# **Relevant financial activities outside the submitted work. Section 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 23608,
@@ -1358,7 +1491,8 @@
},
"text": "Place a check in the appropriate boxes in the table to indicate whether you have financial relationships (regardless of amount of compensation) with entities as described in the instructions. Use one line for each entity; add as many lines as you need by clicking the \"Add +\" box. You should report relationships that were **present during the 36 months prior to publication**.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 23985,
@@ -1368,7 +1502,8 @@
},
"text": "# **Intellectual Property -- Patents & Copyrights Section 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 24047,
@@ -1378,7 +1513,8 @@
},
"text": "Do you have any patents, whether planned, pending or issued, broadly relevant to the work? Yes \u2714 No",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 24146,
@@ -1388,7 +1524,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 24174,
@@ -1398,7 +1535,8 @@
},
"text": "## **Relationships not covered above Section 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 24223,
@@ -1408,7 +1546,8 @@
},
"text": "Are there other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 24408,
@@ -1418,7 +1557,8 @@
},
"text": "Yes, the following relationships/conditions/circumstances are present (explain below):",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 24494,
@@ -1428,7 +1568,8 @@
},
"text": "\u2714 No other relationships/conditions/circumstances that present a potential conflict of interest",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 24589,
@@ -1438,7 +1579,8 @@
},
"text": "At the time of manuscript acceptance, journals will ask authors to confirm and, if necessary, update their disclosure statements. On occasion, journals may ask authors to disclose further information about reported relationships.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 24818,
@@ -1448,7 +1590,8 @@
},
"text": "## **Disclosure Statement Section 6.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 24856,
@@ -1458,7 +1601,8 @@
},
"text": "Based on the above disclosures, this form will automatically generate a disclosure statement, which will appear in the box below.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 24985,
@@ -1468,7 +1612,8 @@
},
"text": "Dr. Zhang has nothing to disclose.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 25019,
@@ -1478,7 +1623,8 @@
},
"text": "### **Evaluation and Feedback**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 25050,
@@ -1488,7 +1634,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 25078,
@@ -1498,7 +1645,8 @@
},
"text": "### **Instructions**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 25098,
@@ -1508,7 +1656,8 @@
},
"text": " ",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 25099,
@@ -1518,7 +1667,8 @@
},
"text": "> **The purpose of this form is to provide readers of your manuscript with information about your other interests that could influence how they receive and understand your work. The form is designed to be completed electronically and stored electronically. It contains programming that allows appropriate data display. Each author should submit a separate form and is responsible for the accuracy and completeness of the submitted information. The form is in six parts.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 25570,
@@ -1528,7 +1678,8 @@
},
"text": "#### **Identifying information. 1.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 25606,
@@ -1538,7 +1689,8 @@
},
"text": "#### **The work under consideration for publication. 2.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 25663,
@@ -1548,7 +1700,8 @@
},
"text": "This section asks for information about the work that you have submitted for publication. The time frame for this reporting is that of the work itself, from the initial conception and planning to the present. The requested information is about resources that you received, either directly or indirectly (via your institution), to enable you to complete the work. Checking \"No\" means that you did the work without receiving any financial support from any third party -- that is, the work was supported by funds from the same institution that pays your salary and that institution did not receive third-party funds with which to pay you. If you or your institution received funds from a third party to support the work, such as a government granting agency, charitable foundation or commercial sponsor, check \"Yes\".",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 26476,
@@ -1558,7 +1711,8 @@
},
"text": "#### **Relevant financial activities outside the submitted work. 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 26545,
@@ -1568,7 +1722,8 @@
},
"text": "This section asks about your financial relationships with entities in the bio-medical arena that could be perceived to influence, or that give the appearance of potentially influencing, what you wrote in the submitted work. You should disclose interactions with ANY entity that could be considered broadly relevant to the work. For example, if your article is about testing an epidermal growth factor receptor (EGFR) antagonist in lung cancer, you should report all associations with entities pursuing diagnostic or therapeutic strategies in cancer in general, not just in the area of EGFR or lung cancer.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 27150,
@@ -1578,7 +1733,8 @@
},
"text": "Report all sources of revenue paid (or promised to be paid) directly to you or your institution on your behalf over the 36 months prior to submission of the work. This should include all monies from sources with relevance to the submitted work, not just monies from the entity that sponsored the research. Please note that your interactions with the work's sponsor that are outside the submitted work should also be listed here. If there is any question, it is usually better to disclose a relationship than not to do so.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 27671,
@@ -1588,7 +1744,8 @@
},
"text": " For grants you have received for work outside the submitted work, you should disclose support ONLY from entities that could be perceived to be affected financially by the published work, such as drug companies, or foundations supported by entities that could be perceived to have a financial stake in the outcome. Public funding sources, such as government agencies, charitable foundations or academic institutions, need not be disclosed. For example, if a government agency sponsored a study in which you have been involved and drugs were provided by a pharmaceutical company, you need only list the pharmaceutical company.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 28296,
@@ -1598,7 +1755,8 @@
},
"text": "#### **Intellectual Property. 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 28330,
@@ -1608,7 +1766,8 @@
},
"text": "This section asks about patents and copyrights, whether pending, issued, licensed and/or receiving royalties.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 28439,
@@ -1618,7 +1777,8 @@
},
"text": "#### **Relationships not covered above. 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 28483,
@@ -1628,7 +1788,8 @@
},
"text": "Use this section to report other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 28685,
@@ -1638,7 +1799,8 @@
},
"text": "### **Definitions.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 28705,
@@ -1648,7 +1810,8 @@
},
"text": "**Entity:** government agency, foundation, commercial sponsor, academic institution, etc.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 28794,
@@ -1658,7 +1821,8 @@
},
"text": "**Grant:** A grant from an entity, generally [but not always] paid to your organization",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 28881,
@@ -1668,7 +1832,8 @@
},
"text": "**Personal Fees:** Monies paid to you for services rendered, generally honoraria, royalties, or fees for consulting , lectures, speakers bureaus, expert testimony, employment, or other affiliations",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 29078,
@@ -1678,7 +1843,8 @@
},
"text": "**Non-Financial Support:** Examples include drugs/equipment supplied by the entity, travel paid by the entity, writing assistance, administrative support, etc**.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 29241,
@@ -1688,7 +1854,8 @@
},
"text": "**Other:** Anything not covered under the previous three boxes **Pending:** The patent has been filed but not issued **Issued:** The patent has been issued by the agency **Licensed:** The patent has been licensed to an entity, whether earning royalties or not",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 29500,
@@ -1698,7 +1865,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 29528,
@@ -1708,7 +1876,8 @@
},
"text": "Did you or your institution **at any time** receive payment or services from a third party (government, commercial, private foundation, etc.) for any aspect of the submitted work (including but not limited to grants, data monitoring board, study design, manuscript preparation, statistical analysis, etc.)?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 29834,
@@ -1718,7 +1887,8 @@
},
"text": "# **Relevant financial activities outside the submitted work. Section 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 29908,
@@ -1728,7 +1898,8 @@
},
"text": "Place a check in the appropriate boxes in the table to indicate whether you have financial relationships (regardless of amount of compensation) with entities as described in the instructions. Use one line for each entity; add as many lines as you need by clicking the \"Add +\" box. You should report relationships that were **present during the 36 months prior to publication**.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 30285,
@@ -1738,7 +1909,8 @@
},
"text": "# **Intellectual Property -- Patents & Copyrights Section 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 30347,
@@ -1748,7 +1920,8 @@
},
"text": "Do you have any patents, whether planned, pending or issued, broadly relevant to the work? Yes \u2714 No",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 30446,
@@ -1758,7 +1931,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 30474,
@@ -1768,7 +1942,8 @@
},
"text": "## **Relationships not covered above Section 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 30523,
@@ -1778,7 +1953,8 @@
},
"text": "Are there other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 30708,
@@ -1788,7 +1964,8 @@
},
"text": "Yes, the following relationships/conditions/circumstances are present (explain below):",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 30794,
@@ -1798,7 +1975,8 @@
},
"text": "\u2714 No other relationships/conditions/circumstances that present a potential conflict of interest",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 30889,
@@ -1808,7 +1986,8 @@
},
"text": "At the time of manuscript acceptance, journals will ask authors to confirm and, if necessary, update their disclosure statements. On occasion, journals may ask authors to disclose further information about reported relationships.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 31118,
@@ -1818,7 +1997,8 @@
},
"text": "## **Disclosure Statement Section 6.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 31156,
@@ -1828,7 +2008,8 @@
},
"text": "Based on the above disclosures, this form will automatically generate a disclosure statement, which will appear in the box below.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 31285,
@@ -1838,7 +2019,8 @@
},
"text": "Dr. Jiang has nothing to disclose.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 31319,
@@ -1848,7 +2030,8 @@
},
"text": "### **Evaluation and Feedback**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 31350,
@@ -1858,7 +2041,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 31378,
@@ -1868,7 +2052,8 @@
},
"text": "### **Instructions**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 31398,
@@ -1878,7 +2063,8 @@
},
"text": " ",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 31399,
@@ -1888,7 +2074,8 @@
},
"text": "> **The purpose of this form is to provide readers of your manuscript with information about your other interests that could influence how they receive and understand your work. The form is designed to be completed electronically and stored electronically. It contains programming that allows appropriate data display. Each author should submit a separate form and is responsible for the accuracy and completeness of the submitted information. The form is in six parts.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 31870,
@@ -1898,7 +2085,8 @@
},
"text": "#### **Identifying information. 1.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 31906,
@@ -1908,7 +2096,8 @@
},
"text": "#### **The work under consideration for publication. 2.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 31963,
@@ -1918,7 +2107,8 @@
},
"text": "This section asks for information about the work that you have submitted for publication. The time frame for this reporting is that of the work itself, from the initial conception and planning to the present. The requested information is about resources that you received, either directly or indirectly (via your institution), to enable you to complete the work. Checking \"No\" means that you did the work without receiving any financial support from any third party -- that is, the work was supported by funds from the same institution that pays your salary and that institution did not receive third-party funds with which to pay you. If you or your institution received funds from a third party to support the work, such as a government granting agency, charitable foundation or commercial sponsor, check \"Yes\".",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 32776,
@@ -1928,7 +2118,8 @@
},
"text": "#### **Relevant financial activities outside the submitted work. 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 32845,
@@ -1938,7 +2129,8 @@
},
"text": "This section asks about your financial relationships with entities in the bio-medical arena that could be perceived to influence, or that give the appearance of potentially influencing, what you wrote in the submitted work. You should disclose interactions with ANY entity that could be considered broadly relevant to the work. For example, if your article is about testing an epidermal growth factor receptor (EGFR) antagonist in lung cancer, you should report all associations with entities pursuing diagnostic or therapeutic strategies in cancer in general, not just in the area of EGFR or lung cancer.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 33450,
@@ -1948,7 +2140,8 @@
},
"text": "Report all sources of revenue paid (or promised to be paid) directly to you or your institution on your behalf over the 36 months prior to submission of the work. This should include all monies from sources with relevance to the submitted work, not just monies from the entity that sponsored the research. Please note that your interactions with the work's sponsor that are outside the submitted work should also be listed here. If there is any question, it is usually better to disclose a relationship than not to do so.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 33971,
@@ -1958,7 +2151,8 @@
},
"text": " For grants you have received for work outside the submitted work, you should disclose support ONLY from entities that could be perceived to be affected financially by the published work, such as drug companies, or foundations supported by entities that could be perceived to have a financial stake in the outcome. Public funding sources, such as government agencies, charitable foundations or academic institutions, need not be disclosed. For example, if a government agency sponsored a study in which you have been involved and drugs were provided by a pharmaceutical company, you need only list the pharmaceutical company.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 34596,
@@ -1968,7 +2162,8 @@
},
"text": "#### **Intellectual Property. 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 34630,
@@ -1978,7 +2173,8 @@
},
"text": "This section asks about patents and copyrights, whether pending, issued, licensed and/or receiving royalties.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 34739,
@@ -1988,7 +2184,8 @@
},
"text": "#### **Relationships not covered above. 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 34783,
@@ -1998,7 +2195,8 @@
},
"text": "Use this section to report other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 34985,
@@ -2008,7 +2206,8 @@
},
"text": "### **Definitions.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 35005,
@@ -2018,7 +2217,8 @@
},
"text": "**Entity:** government agency, foundation, commercial sponsor, academic institution, etc.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 35094,
@@ -2028,7 +2228,8 @@
},
"text": "**Grant:** A grant from an entity, generally [but not always] paid to your organization",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 35181,
@@ -2038,7 +2239,8 @@
},
"text": "**Personal Fees:** Monies paid to you for services rendered, generally honoraria, royalties, or fees for consulting , lectures, speakers bureaus, expert testimony, employment, or other affiliations",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 35378,
@@ -2048,7 +2250,8 @@
},
"text": "**Non-Financial Support:** Examples include drugs/equipment supplied by the entity, travel paid by the entity, writing assistance, administrative support, etc**.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 35541,
@@ -2058,7 +2261,8 @@
},
"text": "**Other:** Anything not covered under the previous three boxes **Pending:** The patent has been filed but not issued **Issued:** The patent has been issued by the agency **Licensed:** The patent has been licensed to an entity, whether earning royalties or not",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 35800,
@@ -2068,7 +2272,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 35828,
@@ -2078,7 +2283,8 @@
},
"text": "Did you or your institution **at any time** receive payment or services from a third party (government, commercial, private foundation, etc.) for any aspect of the submitted work (including but not limited to grants, data monitoring board, study design, manuscript preparation, statistical analysis, etc.)?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 36134,
@@ -2088,7 +2294,8 @@
},
"text": "# **Relevant financial activities outside the submitted work. Section 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 36208,
@@ -2098,7 +2305,8 @@
},
"text": "Place a check in the appropriate boxes in the table to indicate whether you have financial relationships (regardless of amount of compensation) with entities as described in the instructions. Use one line for each entity; add as many lines as you need by clicking the \"Add +\" box. You should report relationships that were **present during the 36 months prior to publication**.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 36585,
@@ -2108,7 +2316,8 @@
},
"text": "# **Intellectual Property -- Patents & Copyrights Section 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 36647,
@@ -2118,7 +2327,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 36675,
@@ -2128,7 +2338,8 @@
},
"text": "## **Relationships not covered above Section 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 36724,
@@ -2138,7 +2349,8 @@
},
"text": "Are there other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 36909,
@@ -2148,7 +2360,8 @@
},
"text": "Yes, the following relationships/conditions/circumstances are present (explain below):",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 36995,
@@ -2158,7 +2371,8 @@
},
"text": "\u2714 No other relationships/conditions/circumstances that present a potential conflict of interest",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 37090,
@@ -2168,7 +2382,8 @@
},
"text": "At the time of manuscript acceptance, journals will ask authors to confirm and, if necessary, update their disclosure statements. On occasion, journals may ask authors to disclose further information about reported relationships.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 37319,
@@ -2178,7 +2393,8 @@
},
"text": "## **Disclosure Statement Section 6.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 37357,
@@ -2188,7 +2404,8 @@
},
"text": "Based on the above disclosures, this form will automatically generate a disclosure statement, which will appear in the box below.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 37486,
@@ -2198,7 +2415,8 @@
},
"text": "Dr. Sun has nothing to disclose.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 37518,
@@ -2208,7 +2426,8 @@
},
"text": "### **Evaluation and Feedback**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 37549,
@@ -2218,7 +2437,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 37577,
@@ -2228,7 +2448,8 @@
},
"text": "### **Instructions**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 37597,
@@ -2238,7 +2459,8 @@
},
"text": " ",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 37598,
@@ -2248,7 +2470,8 @@
},
"text": "> **The purpose of this form is to provide readers of your manuscript with information about your other interests that could influence how they receive and understand your work. The form is designed to be completed electronically and stored electronically. It contains programming that allows appropriate data display. Each author should submit a separate form and is responsible for the accuracy and completeness of the submitted information. The form is in six parts.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 38069,
@@ -2258,7 +2481,8 @@
},
"text": "#### **Identifying information. 1.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 38105,
@@ -2268,7 +2492,8 @@
},
"text": "#### **The work under consideration for publication. 2.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 38162,
@@ -2278,7 +2503,8 @@
},
"text": "This section asks for information about the work that you have submitted for publication. The time frame for this reporting is that of the work itself, from the initial conception and planning to the present. The requested information is about resources that you received, either directly or indirectly (via your institution), to enable you to complete the work. Checking \"No\" means that you did the work without receiving any financial support from any third party -- that is, the work was supported by funds from the same institution that pays your salary and that institution did not receive third-party funds with which to pay you. If you or your institution received funds from a third party to support the work, such as a government granting agency, charitable foundation or commercial sponsor, check \"Yes\".",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 38975,
@@ -2288,7 +2514,8 @@
},
"text": "#### **Relevant financial activities outside the submitted work. 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 39044,
@@ -2298,7 +2525,8 @@
},
"text": "This section asks about your financial relationships with entities in the bio-medical arena that could be perceived to influence, or that give the appearance of potentially influencing, what you wrote in the submitted work. You should disclose interactions with ANY entity that could be considered broadly relevant to the work. For example, if your article is about testing an epidermal growth factor receptor (EGFR) antagonist in lung cancer, you should report all associations with entities pursuing diagnostic or therapeutic strategies in cancer in general, not just in the area of EGFR or lung cancer.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 39649,
@@ -2308,7 +2536,8 @@
},
"text": "Report all sources of revenue paid (or promised to be paid) directly to you or your institution on your behalf over the 36 months prior to submission of the work. This should include all monies from sources with relevance to the submitted work, not just monies from the entity that sponsored the research. Please note that your interactions with the work's sponsor that are outside the submitted work should also be listed here. If there is any question, it is usually better to disclose a relationship than not to do so.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 40170,
@@ -2318,7 +2547,8 @@
},
"text": " For grants you have received for work outside the submitted work, you should disclose support ONLY from entities that could be perceived to be affected financially by the published work, such as drug companies, or foundations supported by entities that could be perceived to have a financial stake in the outcome. Public funding sources, such as government agencies, charitable foundations or academic institutions, need not be disclosed. For example, if a government agency sponsored a study in which you have been involved and drugs were provided by a pharmaceutical company, you need only list the pharmaceutical company.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 40795,
@@ -2328,7 +2558,8 @@
},
"text": "#### **Intellectual Property. 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 40829,
@@ -2338,7 +2569,8 @@
},
"text": "This section asks about patents and copyrights, whether pending, issued, licensed and/or receiving royalties.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 40938,
@@ -2348,7 +2580,8 @@
},
"text": "#### **Relationships not covered above. 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 40982,
@@ -2358,7 +2591,8 @@
},
"text": "Use this section to report other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 41184,
@@ -2368,7 +2602,8 @@
},
"text": "### **Definitions.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 41204,
@@ -2378,7 +2613,8 @@
},
"text": "**Entity:** government agency, foundation, commercial sponsor, academic institution, etc.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 41293,
@@ -2388,7 +2624,8 @@
},
"text": "**Grant:** A grant from an entity, generally [but not always] paid to your organization",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 41380,
@@ -2398,7 +2635,8 @@
},
"text": "**Personal Fees:** Monies paid to you for services rendered, generally honoraria, royalties, or fees for consulting , lectures, speakers bureaus, expert testimony, employment, or other affiliations",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 41577,
@@ -2408,7 +2646,8 @@
},
"text": "**Non-Financial Support:** Examples include drugs/equipment supplied by the entity, travel paid by the entity, writing assistance, administrative support, etc**.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 41740,
@@ -2418,7 +2657,8 @@
},
"text": "**Other:** Anything not covered under the previous three boxes **Pending:** The patent has been filed but not issued **Issued:** The patent has been issued by the agency **Licensed:** The patent has been licensed to an entity, whether earning royalties or not",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 41999,
@@ -2428,7 +2668,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 42027,
@@ -2438,7 +2679,8 @@
},
"text": "Did you or your institution **at any time** receive payment or services from a third party (government, commercial, private foundation, etc.) for any aspect of the submitted work (including but not limited to grants, data monitoring board, study design, manuscript preparation,",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 42304,
@@ -2448,7 +2690,8 @@
},
"text": "statistical analysis, etc.)? Are there any relevant conflicts of interest? Yes \u2714 No",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 42387,
@@ -2458,7 +2701,8 @@
},
"text": "# **Relevant financial activities outside the submitted work. Section 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 42461,
@@ -2468,7 +2712,8 @@
},
"text": "Place a check in the appropriate boxes in the table to indicate whether you have financial relationships (regardless of amount of compensation) with entities as described in the instructions. Use one line for each entity; add as many lines as you need by clicking the \"Add +\" box. You should report relationships that were **present during the 36 months prior to publication**.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 42838,
@@ -2478,7 +2723,8 @@
},
"text": "Are there any relevant conflicts of interest? Yes \u2714 No",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 42892,
@@ -2488,7 +2734,8 @@
},
"text": "# **Intellectual Property -- Patents & Copyrights Section 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 42954,
@@ -2498,7 +2745,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 42982,
@@ -2508,7 +2756,8 @@
},
"text": "## **Relationships not covered above Section 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 43031,
@@ -2518,7 +2767,8 @@
},
"text": "Are there other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 43216,
@@ -2528,7 +2778,8 @@
},
"text": "Yes, the following relationships/conditions/circumstances are present (explain below):",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 43302,
@@ -2538,7 +2789,8 @@
},
"text": "\u2714 No other relationships/conditions/circumstances that present a potential conflict of interest",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 43397,
@@ -2548,7 +2800,8 @@
},
"text": "At the time of manuscript acceptance, journals will ask authors to confirm and, if necessary, update their disclosure statements. On occasion, journals may ask authors to disclose further information about reported relationships.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 43626,
@@ -2558,7 +2811,8 @@
},
"text": "## **Disclosure Statement Section 6.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 43664,
@@ -2568,7 +2822,8 @@
},
"text": "Based on the above disclosures, this form will automatically generate a disclosure statement, which will appear in the box below.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 43793,
@@ -2578,7 +2833,8 @@
},
"text": "Dr. Xie has nothing to disclose.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 43825,
@@ -2588,7 +2844,8 @@
},
"text": "### **Evaluation and Feedback**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 43856,
@@ -2598,7 +2855,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 43884,
@@ -2608,7 +2866,8 @@
},
"text": "### **Instructions**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 43904,
@@ -2618,7 +2877,8 @@
},
"text": " ",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 43905,
@@ -2628,7 +2888,8 @@
},
"text": "> **The purpose of this form is to provide readers of your manuscript with information about your other interests that could influence how they receive and understand your work. The form is designed to be completed electronically and stored electronically. It contains programming that allows appropriate data display. Each author should submit a separate form and is responsible for the accuracy and completeness of the submitted information. The form is in six parts.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 44376,
@@ -2638,7 +2899,8 @@
},
"text": "#### **Identifying information. 1.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 44412,
@@ -2648,7 +2910,8 @@
},
"text": "#### **The work under consideration for publication. 2.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 44469,
@@ -2658,7 +2921,8 @@
},
"text": "This section asks for information about the work that you have submitted for publication. The time frame for this reporting is that of the work itself, from the initial conception and planning to the present. The requested information is about resources that you received, either directly or indirectly (via your institution), to enable you to complete the work. Checking \"No\" means that you did the work without receiving any financial support from any third party -- that is, the work was supported by funds from the same institution that pays your salary and that institution did not receive third-party funds with which to pay you. If you or your institution received funds from a third party to support the work, such as a government granting agency, charitable foundation or commercial sponsor, check \"Yes\".",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 45282,
@@ -2668,7 +2932,8 @@
},
"text": "#### **Relevant financial activities outside the submitted work. 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 45351,
@@ -2678,7 +2943,8 @@
},
"text": "This section asks about your financial relationships with entities in the bio-medical arena that could be perceived to influence, or that give the appearance of potentially influencing, what you wrote in the submitted work. You should disclose interactions with ANY entity that could be considered broadly relevant to the work. For example, if your article is about testing an epidermal growth factor receptor (EGFR) antagonist in lung cancer, you should report all associations with entities pursuing diagnostic or therapeutic strategies in cancer in general, not just in the area of EGFR or lung cancer.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 45956,
@@ -2688,7 +2954,8 @@
},
"text": "Report all sources of revenue paid (or promised to be paid) directly to you or your institution on your behalf over the 36 months prior to submission of the work. This should include all monies from sources with relevance to the submitted work, not just monies from the entity that sponsored the research. Please note that your interactions with the work's sponsor that are outside the submitted work should also be listed here. If there is any question, it is usually better to disclose a relationship than not to do so.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 46477,
@@ -2698,7 +2965,8 @@
},
"text": " For grants you have received for work outside the submitted work, you should disclose support ONLY from entities that could be perceived to be affected financially by the published work, such as drug companies, or foundations supported by entities that could be perceived to have a financial stake in the outcome. Public funding sources, such as government agencies, charitable foundations or academic institutions, need not be disclosed. For example, if a government agency sponsored a study in which you have been involved and drugs were provided by a pharmaceutical company, you need only list the pharmaceutical company.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 47102,
@@ -2708,7 +2976,8 @@
},
"text": "#### **Intellectual Property. 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 47136,
@@ -2718,7 +2987,8 @@
},
"text": "This section asks about patents and copyrights, whether pending, issued, licensed and/or receiving royalties.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 47245,
@@ -2728,7 +2998,8 @@
},
"text": "#### **Relationships not covered above. 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 47289,
@@ -2738,7 +3009,8 @@
},
"text": "Use this section to report other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 47491,
@@ -2748,7 +3020,8 @@
},
"text": "### **Definitions.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 47511,
@@ -2758,7 +3031,8 @@
},
"text": "**Entity:** government agency, foundation, commercial sponsor, academic institution, etc.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 47600,
@@ -2768,7 +3042,8 @@
},
"text": "**Grant:** A grant from an entity, generally [but not always] paid to your organization",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 47687,
@@ -2778,7 +3053,8 @@
},
"text": "**Personal Fees:** Monies paid to you for services rendered, generally honoraria, royalties, or fees for consulting , lectures, speakers bureaus, expert testimony, employment, or other affiliations",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 47884,
@@ -2788,7 +3064,8 @@
},
"text": "**Non-Financial Support:** Examples include drugs/equipment supplied by the entity, travel paid by the entity, writing assistance, administrative support, etc**.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 48047,
@@ -2798,7 +3075,8 @@
},
"text": "**Other:** Anything not covered under the previous three boxes **Pending:** The patent has been filed but not issued **Issued:** The patent has been issued by the agency **Licensed:** The patent has been licensed to an entity, whether earning royalties or not",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 48306,
@@ -2808,7 +3086,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 48334,
@@ -2818,7 +3097,8 @@
},
"text": "Did you or your institution **at any time** receive payment or services from a third party (government, commercial, private foundation, etc.) for any aspect of the submitted work (including but not limited to grants, data monitoring board, study design, manuscript preparation,",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 48611,
@@ -2828,7 +3108,8 @@
},
"text": "statistical analysis, etc.)? Are there any relevant conflicts of interest? Yes \u2714 No",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 48694,
@@ -2838,7 +3119,8 @@
},
"text": "# **Relevant financial activities outside the submitted work. Section 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 48768,
@@ -2848,7 +3130,8 @@
},
"text": "Place a check in the appropriate boxes in the table to indicate whether you have financial relationships (regardless of amount of compensation) with entities as described in the instructions. Use one line for each entity; add as many lines as you need by clicking the \"Add +\" box. You should report relationships that were **present during the 36 months prior to publication**.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 49145,
@@ -2858,7 +3141,8 @@
},
"text": "Are there any relevant conflicts of interest? Yes \u2714 No",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 49199,
@@ -2868,7 +3152,8 @@
},
"text": "# **Intellectual Property -- Patents & Copyrights Section 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 49261,
@@ -2878,7 +3163,8 @@
},
"text": "Do you have any patents, whether planned, pending or issued, broadly relevant to the work? Yes \u2714 No",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 49360,
@@ -2888,7 +3174,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 49388,
@@ -2898,7 +3185,8 @@
},
"text": "## **Relationships not covered above Section 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 49437,
@@ -2908,7 +3196,8 @@
},
"text": "Are there other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 49622,
@@ -2918,7 +3207,8 @@
},
"text": "Yes, the following relationships/conditions/circumstances are present (explain below):",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 49708,
@@ -2928,7 +3218,8 @@
},
"text": "\u2714 No other relationships/conditions/circumstances that present a potential conflict of interest",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 49803,
@@ -2938,7 +3229,8 @@
},
"text": "At the time of manuscript acceptance, journals will ask authors to confirm and, if necessary, update their disclosure statements. On occasion, journals may ask authors to disclose further information about reported relationships.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 50032,
@@ -2948,7 +3240,8 @@
},
"text": "## **Disclosure Statement Section 6.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 50070,
@@ -2958,7 +3251,8 @@
},
"text": "Based on the above disclosures, this form will automatically generate a disclosure statement, which will appear in the box below.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 50199,
@@ -2968,7 +3262,8 @@
},
"text": "Dr. Xiao has nothing to disclose.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 50232,
@@ -2978,7 +3273,8 @@
},
"text": "### **Evaluation and Feedback**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 50263,
@@ -2988,7 +3284,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 50291,
@@ -2998,7 +3295,8 @@
},
"text": "### **Instructions**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 50311,
@@ -3008,7 +3306,8 @@
},
"text": " ",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 50312,
@@ -3018,7 +3317,8 @@
},
"text": "> **The purpose of this form is to provide readers of your manuscript with information about your other interests that could influence how they receive and understand your work. The form is designed to be completed electronically and stored electronically. It contains programming that allows appropriate data display. Each author should submit a separate form and is responsible for the accuracy and completeness of the submitted information. The form is in six parts.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 50783,
@@ -3028,7 +3328,8 @@
},
"text": "#### **Identifying information. 1.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 50819,
@@ -3038,7 +3339,8 @@
},
"text": "#### **The work under consideration for publication. 2.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 50876,
@@ -3048,7 +3350,8 @@
},
"text": "This section asks for information about the work that you have submitted for publication. The time frame for this reporting is that of the work itself, from the initial conception and planning to the present. The requested information is about resources that you received, either directly or indirectly (via your institution), to enable you to complete the work. Checking \"No\" means that you did the work without receiving any financial support from any third party -- that is, the work was supported by funds from the same institution that pays your salary and that institution did not receive third-party funds with which to pay you. If you or your institution received funds from a third party to support the work, such as a government granting agency, charitable foundation or commercial sponsor, check \"Yes\".",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 51689,
@@ -3058,7 +3361,8 @@
},
"text": "#### **Relevant financial activities outside the submitted work. 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 51758,
@@ -3068,7 +3372,8 @@
},
"text": "This section asks about your financial relationships with entities in the bio-medical arena that could be perceived to influence, or that give the appearance of potentially influencing, what you wrote in the submitted work. You should disclose interactions with ANY entity that could be considered broadly relevant to the work. For example, if your article is about testing an epidermal growth factor receptor (EGFR) antagonist in lung cancer, you should report all associations with entities pursuing diagnostic or therapeutic strategies in cancer in general, not just in the area of EGFR or lung cancer.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 52363,
@@ -3078,7 +3383,8 @@
},
"text": "Report all sources of revenue paid (or promised to be paid) directly to you or your institution on your behalf over the 36 months prior to submission of the work. This should include all monies from sources with relevance to the submitted work, not just monies from the entity that sponsored the research. Please note that your interactions with the work's sponsor that are outside the submitted work should also be listed here. If there is any question, it is usually better to disclose a relationship than not to do so.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 52884,
@@ -3088,7 +3394,8 @@
},
"text": " For grants you have received for work outside the submitted work, you should disclose support ONLY from entities that could be perceived to be affected financially by the published work, such as drug companies, or foundations supported by entities that could be perceived to have a financial stake in the outcome. Public funding sources, such as government agencies, charitable foundations or academic institutions, need not be disclosed. For example, if a government agency sponsored a study in which you have been involved and drugs were provided by a pharmaceutical company, you need only list the pharmaceutical company.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 53509,
@@ -3098,7 +3405,8 @@
},
"text": "#### **Intellectual Property. 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 53543,
@@ -3108,7 +3416,8 @@
},
"text": "This section asks about patents and copyrights, whether pending, issued, licensed and/or receiving royalties.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 53652,
@@ -3118,7 +3427,8 @@
},
"text": "#### **Relationships not covered above. 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 53696,
@@ -3128,7 +3438,8 @@
},
"text": "Use this section to report other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 53898,
@@ -3138,7 +3449,8 @@
},
"text": "### **Definitions.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 53918,
@@ -3148,7 +3460,8 @@
},
"text": "**Entity:** government agency, foundation, commercial sponsor, academic institution, etc.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 54007,
@@ -3158,7 +3471,8 @@
},
"text": "**Grant:** A grant from an entity, generally [but not always] paid to your organization",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 54094,
@@ -3168,7 +3482,8 @@
},
"text": "**Personal Fees:** Monies paid to you for services rendered, generally honoraria, royalties, or fees for consulting , lectures, speakers bureaus, expert testimony, employment, or other affiliations",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 54291,
@@ -3178,7 +3493,8 @@
},
"text": "**Non-Financial Support:** Examples include drugs/equipment supplied by the entity, travel paid by the entity, writing assistance, administrative support, etc**.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 54454,
@@ -3188,7 +3504,8 @@
},
"text": "**Other:** Anything not covered under the previous three boxes **Pending:** The patent has been filed but not issued **Issued:** The patent has been issued by the agency **Licensed:** The patent has been licensed to an entity, whether earning royalties or not",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 54713,
@@ -3198,7 +3515,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 54741,
@@ -3208,7 +3526,8 @@
},
"text": "Did you or your institution **at any time** receive payment or services from a third party (government, commercial, private foundation, etc.) for any aspect of the submitted work (including but not limited to grants, data monitoring board, study design, manuscript preparation, statistical analysis, etc.)?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 55047,
@@ -3218,7 +3537,8 @@
},
"text": "# **Relevant financial activities outside the submitted work. Section 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 55121,
@@ -3228,7 +3548,8 @@
},
"text": "Place a check in the appropriate boxes in the table to indicate whether you have financial relationships (regardless of amount of compensation) with entities as described in the instructions. Use one line for each entity; add as many lines as you need by clicking the \"Add +\" box. You should report relationships that were **present during the 36 months prior to publication**.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 55498,
@@ -3238,7 +3559,8 @@
},
"text": "# **Intellectual Property -- Patents & Copyrights Section 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 55560,
@@ -3248,7 +3570,8 @@
},
"text": "Do you have any patents, whether planned, pending or issued, broadly relevant to the work? Yes \u2714 No",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 55659,
@@ -3258,7 +3581,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 55687,
@@ -3268,7 +3592,8 @@
},
"text": "## **Relationships not covered above Section 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 55736,
@@ -3278,7 +3603,8 @@
},
"text": "Are there other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 55921,
@@ -3288,7 +3614,8 @@
},
"text": "Yes, the following relationships/conditions/circumstances are present (explain below):",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 56007,
@@ -3298,7 +3625,8 @@
},
"text": "\u2714 No other relationships/conditions/circumstances that present a potential conflict of interest",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 56102,
@@ -3308,7 +3636,8 @@
},
"text": "At the time of manuscript acceptance, journals will ask authors to confirm and, if necessary, update their disclosure statements. On occasion, journals may ask authors to disclose further information about reported relationships.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 56331,
@@ -3318,7 +3647,8 @@
},
"text": "## **Disclosure Statement Section 6.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 56369,
@@ -3328,7 +3658,8 @@
},
"text": "Based on the above disclosures, this form will automatically generate a disclosure statement, which will appear in the box below.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 56498,
@@ -3338,7 +3669,8 @@
},
"text": "Dr. Zhang has nothing to disclose.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 56532,
@@ -3348,7 +3680,8 @@
},
"text": "### **Evaluation and Feedback**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 56563,
@@ -3358,7 +3691,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 56591,
@@ -3368,7 +3702,8 @@
},
"text": "### **Instructions**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 56611,
@@ -3378,7 +3713,8 @@
},
"text": " ",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 56612,
@@ -3388,7 +3724,8 @@
},
"text": "> **The purpose of this form is to provide readers of your manuscript with information about your other interests that could influence how they receive and understand your work. The form is designed to be completed electronically and stored electronically. It contains programming that allows appropriate data display. Each author should submit a separate form and is responsible for the accuracy and completeness of the submitted information. The form is in six parts.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 57083,
@@ -3398,7 +3735,8 @@
},
"text": "#### **Identifying information. 1.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 57119,
@@ -3408,7 +3746,8 @@
},
"text": "#### **The work under consideration for publication. 2.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 57176,
@@ -3418,7 +3757,8 @@
},
"text": "This section asks for information about the work that you have submitted for publication. The time frame for this reporting is that of the work itself, from the initial conception and planning to the present. The requested information is about resources that you received, either directly or indirectly (via your institution), to enable you to complete the work. Checking \"No\" means that you did the work without receiving any financial support from any third party -- that is, the work was supported by funds from the same institution that pays your salary and that institution did not receive third-party funds with which to pay you. If you or your institution received funds from a third party to support the work, such as a government granting agency, charitable foundation or commercial sponsor, check \"Yes\".",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 57989,
@@ -3428,7 +3768,8 @@
},
"text": "#### **Relevant financial activities outside the submitted work. 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 58058,
@@ -3438,7 +3779,8 @@
},
"text": "This section asks about your financial relationships with entities in the bio-medical arena that could be perceived to influence, or that give the appearance of potentially influencing, what you wrote in the submitted work. You should disclose interactions with ANY entity that could be considered broadly relevant to the work. For example, if your article is about testing an epidermal growth factor receptor (EGFR) antagonist in lung cancer, you should report all associations with entities pursuing diagnostic or therapeutic strategies in cancer in general, not just in the area of EGFR or lung cancer.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 58663,
@@ -3448,7 +3790,8 @@
},
"text": "Report all sources of revenue paid (or promised to be paid) directly to you or your institution on your behalf over the 36 months prior to submission of the work. This should include all monies from sources with relevance to the submitted work, not just monies from the entity that sponsored the research. Please note that your interactions with the work's sponsor that are outside the submitted work should also be listed here. If there is any question, it is usually better to disclose a relationship than not to do so.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 59184,
@@ -3458,7 +3801,8 @@
},
"text": " For grants you have received for work outside the submitted work, you should disclose support ONLY from entities that could be perceived to be affected financially by the published work, such as drug companies, or foundations supported by entities that could be perceived to have a financial stake in the outcome. Public funding sources, such as government agencies, charitable foundations or academic institutions, need not be disclosed. For example, if a government agency sponsored a study in which you have been involved and drugs were provided by a pharmaceutical company, you need only list the pharmaceutical company.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 59809,
@@ -3468,7 +3812,8 @@
},
"text": "#### **Intellectual Property. 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 59843,
@@ -3478,7 +3823,8 @@
},
"text": "This section asks about patents and copyrights, whether pending, issued, licensed and/or receiving royalties.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 59952,
@@ -3488,7 +3834,8 @@
},
"text": "#### **Relationships not covered above. 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 59996,
@@ -3498,7 +3845,8 @@
},
"text": "Use this section to report other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 60198,
@@ -3508,7 +3856,8 @@
},
"text": "### **Definitions.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 60218,
@@ -3518,7 +3867,8 @@
},
"text": "**Entity:** government agency, foundation, commercial sponsor, academic institution, etc.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 60307,
@@ -3528,7 +3878,8 @@
},
"text": "**Grant:** A grant from an entity, generally [but not always] paid to your organization",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 60394,
@@ -3538,7 +3889,8 @@
},
"text": "**Personal Fees:** Monies paid to you for services rendered, generally honoraria, royalties, or fees for consulting , lectures, speakers bureaus, expert testimony, employment, or other affiliations",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 60591,
@@ -3548,7 +3900,8 @@
},
"text": "**Non-Financial Support:** Examples include drugs/equipment supplied by the entity, travel paid by the entity, writing assistance, administrative support, etc**.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 60754,
@@ -3558,7 +3911,8 @@
},
"text": "**Other:** Anything not covered under the previous three boxes **Pending:** The patent has been filed but not issued **Issued:** The patent has been issued by the agency **Licensed:** The patent has been licensed to an entity, whether earning royalties or not",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 61013,
@@ -3568,7 +3922,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 61041,
@@ -3578,7 +3933,8 @@
},
"text": "Did you or your institution **at any time** receive payment or services from a third party (government, commercial, private foundation, etc.) for any aspect of the submitted work (including but not limited to grants, data monitoring board, study design, manuscript preparation, statistical analysis, etc.)?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 61347,
@@ -3588,7 +3944,8 @@
},
"text": "# **Relevant financial activities outside the submitted work. Section 3.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 61421,
@@ -3598,7 +3955,8 @@
},
"text": "Place a check in the appropriate boxes in the table to indicate whether you have financial relationships (regardless of amount of compensation) with entities as described in the instructions. Use one line for each entity; add as many lines as you need by clicking the \"Add +\" box. You should report relationships that were **present during the 36 months prior to publication**.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 61798,
@@ -3608,7 +3966,8 @@
},
"text": "# **Intellectual Property -- Patents & Copyrights Section 4.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 61860,
@@ -3618,7 +3977,8 @@
},
"text": "",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 61888,
@@ -3628,7 +3988,8 @@
},
"text": "## **Relationships not covered above Section 5.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 61937,
@@ -3638,7 +3999,8 @@
},
"text": "Are there other relationships or activities that readers could perceive to have influenced, or that give the appearance of potentially influencing, what you wrote in the submitted work?",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 62122,
@@ -3648,7 +4010,8 @@
},
"text": "Yes, the following relationships/conditions/circumstances are present (explain below):",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 62208,
@@ -3658,7 +4021,8 @@
},
"text": "\u2714 No other relationships/conditions/circumstances that present a potential conflict of interest",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 62303,
@@ -3668,7 +4032,8 @@
},
"text": "At the time of manuscript acceptance, journals will ask authors to confirm and, if necessary, update their disclosure statements. On occasion, journals may ask authors to disclose further information about reported relationships.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 62532,
@@ -3678,7 +4043,8 @@
},
"text": "## **Disclosure Statement Section 6.**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 62570,
@@ -3688,7 +4054,8 @@
},
"text": "Based on the above disclosures, this form will automatically generate a disclosure statement, which will appear in the box below.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 62699,
@@ -3698,7 +4065,8 @@
},
"text": "Dr. Li has nothing to disclose.",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
},
{
"offset": 62730,
@@ -3708,10 +4076,12 @@
},
"text": "### **Evaluation and Feedback**",
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
- "relations": []
+ "relations": [],
+ "annotations": []
}
]
}
\ No newline at end of file
diff --git a/tests/data/Supplementary/PDF/Expected Output/tp-10-08-2123-coif.pdf_tables.json b/tests/data/Supplementary/PDF/Expected Output/tp-10-08-2123-coif.pdf_tables.json
index e62ba301..7c655c0c 100644
--- a/tests/data/Supplementary/PDF/Expected Output/tp-10-08-2123-coif.pdf_tables.json
+++ b/tests/data/Supplementary/PDF/Expected Output/tp-10-08-2123-coif.pdf_tables.json
@@ -1,8 +1,7 @@
{
"source": "Auto-CORPus (supplementary)",
- "date": "20250520",
+ "date": "20250521",
"key": "autocorpus_supplementary.key",
- "version": "1.0",
"infons": {},
"documents": [
{
@@ -92,7 +91,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -147,7 +147,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -195,7 +196,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -320,7 +322,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -368,7 +371,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -408,7 +412,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -471,7 +476,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -588,7 +594,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -628,7 +635,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -668,7 +676,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -731,7 +740,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -830,7 +840,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -885,7 +896,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -925,7 +937,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -1024,7 +1037,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -1079,7 +1093,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -1127,7 +1142,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -1226,7 +1242,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -1274,7 +1291,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -1314,7 +1332,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -1362,7 +1381,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -1479,7 +1499,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -1542,7 +1563,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -1659,7 +1681,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -1812,7 +1835,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -1860,7 +1884,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -1900,7 +1925,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -2053,7 +2079,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -2108,7 +2135,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -2156,7 +2184,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
@@ -2219,7 +2248,8 @@
}
],
"annotations": [],
- "relations": []
+ "relations": [],
+ "sentences": []
}
],
"annotations": [],
diff --git a/tests/data/Supplementary/Word/Expected Output/mmc1.doc_bioc.json b/tests/data/Supplementary/Word/Expected Output/mmc1.doc_bioc.json
new file mode 100644
index 00000000..793320fa
--- /dev/null
+++ b/tests/data/Supplementary/Word/Expected Output/mmc1.doc_bioc.json
@@ -0,0 +1,930 @@
+{
+ "source": "Auto-CORPus (supplementary)",
+ "date": "20250520",
+ "key": "autocorpus_supplementary.key",
+ "infons": {},
+ "documents": [
+ {
+ "id": "1",
+ "infons": {},
+ "inputfile": "/mnt/sda2/Projects/Auto-CORPus/tests/data/Supplementary/Word/mmc1.doc",
+ "passages": [
+ {
+ "offset": 0,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "The occurrence of a multidrug-resistant tuberculous retropharyngeal abscess in an immunocompetent patient: a case report",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 120,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Tiresse N4* , Oucharqui S2*,Benaissa E1, 2, Badri B4 Bssaibis F2, Maleb A3, Elouennass M1,2",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 212,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "1Epidemiology and bacterial resistance research team/BIO-INOVA Centre, Faculty of Medicine and Pharmacy (University Mohammed V), Rabat, Morocco. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 357,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "2Department of Bacteriology, Mohammed V Military Teaching Hospital / Faculty of Medicine and Pharmacy (University Mohammed V), Rabat, Morocco. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 500,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "3Laboratory of Microbiology, Mohammed VI University Hospital / Faculty of Medicine and Pharmacy (University Mohammed the first), Oujda, Morocco.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 644,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "4Department of pneumology, Mohammed V Military Teaching Hospital / Faculty of Medicine and Pharmacy (University Mohammed V), Rabat, Morocco.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 784,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "* Oucharqui sara and Tiresse nabil have contributed equally in the elaboration of the work.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 875,
+ "infons": {
+ "iao_name_1": "document title",
+ "iao_id_1": "IAO:0000305"
+ },
+ "text": "Corresponding author: Elmostafa Benaissa : benaissaelmostafa2@gmail.com",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 947,
+ "infons": {
+ "iao_name_1": "document title",
+ "iao_id_1": "IAO:0000305"
+ },
+ "text": "Tiresse Nabil: nabil.tiresse1@gmail.com",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 986,
+ "infons": {
+ "iao_name_1": "document title",
+ "iao_id_1": "IAO:0000305"
+ },
+ "text": "Oucharqui Sara: oucharqui@gmail.com",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1021,
+ "infons": {
+ "iao_name_1": "document title",
+ "iao_id_1": "IAO:0000305"
+ },
+ "text": "Elmostafa Benaissa : benaissaelmostafa2@gmail.com",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1071,
+ "infons": {
+ "iao_name_1": "document title",
+ "iao_id_1": "IAO:0000305"
+ },
+ "text": "Badri bouchra: bouchra.ba04@gmail.com",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1108,
+ "infons": {
+ "iao_name_1": "document title",
+ "iao_id_1": "IAO:0000305"
+ },
+ "text": "Bssaibis fatna: bssaibisfatna@yahoo.fr",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1146,
+ "infons": {
+ "iao_name_1": "document title",
+ "iao_id_1": "IAO:0000305"
+ },
+ "text": "Adil Maleb: maleb.adil@gmail.com",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1178,
+ "infons": {
+ "iao_name_1": "document title",
+ "iao_id_1": "IAO:0000305"
+ },
+ "text": "Mostafa Elouennass: elouennassm@yahoo.fr",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1218,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1218,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1218,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1218,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1218,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1218,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1218,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1218,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1218,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Abstract:",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 1227,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Retropharyngeal abscess is an uncommon location of tuberculosis (TB). In this report, we describe a multidrug-resistant tuberculous retropharyngeal abscess in a 21-year-old female patient who was treated for lymph node TB for one year. CT scan revealed a large retropharyngeal abscess that was aspirated intraorally under local anesthesia. The diagnosis of TB was retained by molecular and histological study. GeneXpert MTB/ RIF (Cepheid, Sunnyvale, CA, USA),performed on the pus, showed rifampicin resistance and a first- and second-line drug resistance test using Genotype MTBDRplus VER.2 and MTBDRsl VER.1 (Hain Lifescience GmbH, Nehren, Germany) showed TB highly resistant to rifampicin, isoniazid, and aminoglycosides. Treatment is primarily medical as it combines specific antituberculous antibiotics, and aspiration for drainage of the abscess. Our patient was put on long-term 2nd line anti-TB treatment. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 2142,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Key words: Multidrug-resistant, Retropharyngeal abscess, GeneXpert MTB/RIF, GenoType MTBDRplus, GenoType MTBDRsl",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 2254,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 2254,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Introduction",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 2266,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Tuberculous retropharyngeal abscess is not frequently reported in the literature and pre-extensive tuberculous retropharyngeal abscess is even less frequently reported [1]. Early recognition of this condition is essential to prevent serious complications. The diagnosis is difficult and relies on a combination of clinical, radiological and biological arguments. We report a case of multidrug resistant (MDR) tuberculous retropharyngeal abscess in a 21-year-old female patient treated for lymph node tuberculosis (TB) for one year and discuss the different diagnostic and therapeutic elements of this pathology, highlighting the contribution of molecular biology in the effective management of MDR extra-pulmonary TB.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 2983,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Case report",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 2994,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "This is a 21-year-old female with a history of chronic headache for several years with Chiari decompression surgery performed in 2017 and latero-cervical adenopathy diagnosed as lymph node TB on bacteriological, molecular and histological arguments in 2019. GeneXpert MTB/RIF performed on the cervical lymph node came back positive for TB, without resistance to rifampicin. She was then treated at another institution according to the national protocol which includes quadritherapy with isoniazid, rifampicin, ethambutol and pyrazinamide for 2 months followed by bitherapy with isoniazid and rifampicin for 10 months (2RHZE/10RH). The evolution was then marked by the disappearance of the lymph nodes after one year of treatment. Six months after the end of treatment, the patient presented to the emergency room with severe headaches.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 3830,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Otherwise, no cough, chest pain, fever, or loss of appetite was reported. The patient noted no signs of trismus or difficulty breathing. She reported no known allergies and had no history of smoking or drinking alcohol. On admission, physical examination revealed a body temperature of 36.6\u00b0C, a heart rate of 90 beats/min, and a blood pressure of 117/75 mmHg. Palpation of both sides of the neck revealed no tenderness and no lymph nodes were noted. Examination of the oral cavity revealed no pathologic findings, and no posterior pharyngeal wall projections were observed. The lungs were clear on auscultation and no neurologic deficits were noted on initial clinical examination. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 4514,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "The biological workup showed hemoglobin at 12.6 g/l; white blood cell count at 4.8 G/l; and C-reactive protein at 0.8 mg/l. In addition, serologies for human immunodeficiency virus (HIV), hepatitis B, and hepatitis C were negative.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 4745,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "A cerebral CT scan performed as part of the etiological diagnosis fortuitously revealed a peripherally enhanced collection in the retropharyngeal area after injection of contrast medium measuring 19x21 mm, associated with an adjacent necrotic adenopathy measuring 10x06 mm. (figure 1).",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 5030,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 5030,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Figure 1: Sagittal CT scan revealed a peripherally enhanced collection in the retropharyngeal area after injection of contrast medium.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 5164,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 5164,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "A cervical MRI was realized later and confirmed the presence of the retropharyngeal collection. (figure 2)",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 5270,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 5270,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 5270,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Figure 2: Sagittal MRI revealed the presence of the retropharyngeal collection",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 5348,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 5348,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "The abscess was drained under local anesthesia. 02 milliliters of pus were aspirated. The specimen was sent for bacteriological analysis for Mycobacterium tuberculosis complex (MTC) and banal germs as well as for pathological study. A molecular study using GeneXpert MTB/RIF (Cepheid, Sunnyvale, CA, USA) resulted in detection of MTC with detection of rifampicin resistance in less than 2 hours. In response to this rifampicin resistance, we performed other molecular tests, including GenoType MTBDRplus VER. 2 and GenoType MTBDRsl VER.1 (Hain Lifescience GmbH, Nehren, Germany) on the pus to confirm rifampicin resistance and also to investigate resistance to other anti-TB drugs. It should be noted that this technique is not validated on extrapulmonary specimens directly, although many studies have showed a good correlation with the usual resistance screening methods. The MTBDRplus VER. 2 showed resistance to both rifampicin and isoniazid, while MTBDRsl VER.1 showed resistance only to aminoglycosides. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 6360,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Direct examination after special Ziehl-Nielsen staining was positive and cultures on Lowenstein-Jensen\u00ae (LJ) solid medium and Mycobacteria Growth Indicator Tube (MGIT\u00ae) liquid medium were positive after 32 days and 12 days respectively, thus confirming the molecular diagnosis.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 6637,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "A treatment was initiated on the basis of molecular data. The histopathological study confirmed the molecular diagnosis by showing epithelioid and gigantocellular granulomas with caseous necrosis, without histological evidence of malignancy.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 6878,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Subsequently, the patient was put on a long-term protocol consisting of 6 months of bedaquiline, levofloxacin, linezolid, clofazimine, and cycloserine and 12 to 14 months of levofloxacin, linezolid, clofazimine, and cycloserine.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 7106,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "After 1 month of treatment, the antibacillary drugs appear to be well tolerated, and the patient is still being monitored.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 7228,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Discussion",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 7238,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 7238,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "TB remains a major public health problem in the world, mainly affecting developing countries [2]. Its incidence has also increased in developed countries, partly due to co-infection with HIV [2], the latter being more frequent in extra-pulmonary forms [3].",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 7494,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": " The 2019 WHO report estimates the number of new cases at 10 million and the number of deaths at 1.5 million [4]. TB usually affects the lungs (pulmonary) or sometimes other organs (extrapulmonary). Excluding laryngeal TB, TB of the head and neck is rare and constitutes 2-6% of extrapulmonary TB and 0.1-1% of all forms of TB [5]. Retropharyngeal localization is rare [1].",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 7868,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Infection of the retropharyngeal space and subsequent abscess formation are mainly due to acute bacterial infections of the head and neck region, especially in children, injury to the posterior pharyngeal wall, and forward spread of spinal TB [6].",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 8115,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Spread to the retropharyngeal space occurs via lymphatics involving persistent retropharyngeal nodes or by hematogenous spread from pulmonary or extrapulmonary sites [5]. In our patient, the retropharyngeal abscess was probably due to lymphatic dissemination from lymph node TB because radiological exploration revealed a centimetric adenopathy with a necrotic center adjacent to the retropharyngeal abscess and there was no evidence of any distant involvement that could support hematogenous, pulmonary, or other dissemination. Tuberculous retropharyngeal abscess in an immunocompetent adult is rare [6]. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 8721,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Drug-resistant TB represents a major challenge to national, regional and global TB control programs. Some MDR strains have developed additional resistance mechanisms to second-line antibacillaries, namely fluoroquinolones and aminoglycosides [7]. Each year, 500,000 cases of MDR-TB or rifampicin-resistant TB (RR-TB) and nearly 200,000 deaths are reported worldwide. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 9088,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "In 2019, the reported treatment success rate was 56% for MDR and extensively drug-resistant (XDR) TB cases and 39% for XDR-TB [4]. In Morocco, where TB remains endemic, the 2014 National TB Drug Resistance Survey found a low prevalence of MDR/XDR-TB (1% MDR-TB among new cases and 8.7% among previously treated cases) [4]. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 9412,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "In 2019, 235 cases of drug-resistant TB were treated in Morocco, and 1500 cumulative cases have been reported since 2012 [4]. MDR extrapulmonary localizations have rarely been described in the literature [3,7,8]. An Indian study published in 2014 reported 3 cases, including 2 lymph node localizations and 1 cervical cold abscess [3]. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 9747,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "MDR extrapulmonary forms are more frequent in young female subjects with a history of TB [8]. This is in accordance with our case. Another Moroccan study published in 2018 presented 7 cases of MDR extrapulmonary TB, of which 6 patients had a history of TB and 1 patient had a therapeutic failure [7]. 4 of these 7 patients had additional resistance to second-line anti-TB drugs [7].",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 10129,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": " The diagnosis of MDR in extrapulmonary forms should be made by tissue or biological fluid sampling, but this is sometimes difficult [3]. Tuberculous retropharyngeal abscess can present with variable manifestations, ranging from asymptomatic to subtle features such as odynophagia alone and neck pain, due to early stage and lesser severity of the disease, to life-threatening respiratory obstruction [6]. Our patient had only chronic headache that can be attributed to her Chiari malformation. In addition, the general condition was preserved. On throat examination, swelling due to tuberculous retropharyngeal abscess is usually located in the midline [6].",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 10787,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Radiologic imaging plays an important role in demonstrating the extent of the abscess and the involvement of surrounding structures [2,5]. CT has an accuracy of 89% and MRI is even more accurate, as it allows for better soft tissue analysis and allows for the assessment of vascular complications, including internal jugular vein thrombosis [2,5]. Both CT and MRI in our patient showed the retropharyngeal abscess. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 11202,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "TB was first diagnosed by direct microscopic examination and the discovery of acid-fast bacilli in the abscess aspirate using Ziehl-Neelsen stain, and then confirmed by culture, which remains the gold standard method [2]. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 11424,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Molecular biology has demonstrated its effectiveness even on pauci-bacillary specimens by allowing the identification and detection of resistance to anti-TB drugs through several studies. GeneXpert MTB/RIF is a rapid, automated, World Health Organization (WHO)-recommended nucleic acid amplification test that is widely used for the simultaneous detection of MTC and rifampicin resistance in pulmonary and extrapulmonary specimens. It has a sensitivity of more than 80% in cerebral spine fluid, pus and biopsy fragments [7]. In our study, GeneXpert MTB/RIF (Cepheid, Sunnyvale, CA, USA) allowed identification of MTC and detection of rifampicin resistance. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 12081,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "In addition to the GeneXpert MTB/RIF, there are the MTBDRplus and MTBDRsl genotype tests which allow the identification of MTC from pulmonary clinical specimens or cultivated samples. The MTBDRplus test is used to identify resistance to rifampicin and isoniazid [7]. The MTBDRsl test is designed to detect resistance to the second-line antibacillary drugs, namely aminoglycosides on the gyrA gene, fluoroquinolones on the rrs gene, and ethambutol on the embB gene [7]. The MTBDRplus test and the MTBDRsl test have a sensitivity greater than 80% for the detection of resistance to rifampicin, isoniazid, fluoroquinolones, and aminoglycosides [7]. The discovery of an additional aminoglycoside resistance makes the choice of treatment even more difficult. These tests have been shown to be effective in detecting resistance to anti-TB drugs from extrapulmonary samples, even though they are not validated on these samples. This has been reported in some studies [9, 10].",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 13049,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "In our case, the aspiration was positive by GeneXpert MTB/RIF with a detection of rifampicin resistance. The MTBDRplus test confirmed resistance to rifampicin and isoniazid and the MTBDRsl test showed additional resistance to aminoglycosides. Later on, mycobacterial culture on solid and liquid media both became positive after 32 days and 12 days respectively. Pre-ultraresistant TB (pre-XDR TB) is defined as MDR/RR-TB in addition to resistance to any fluoroquinolones (levofloxacin and moxifloxacin). ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 13553,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Antibacillary drug resistance can be primary or secondary, primary drug resistance is defined as resistance in a patient who has never been treated for TB. Treatment with anti-TB drugs exerts selective pressure on the Mycobacterium tuberculosis population, resulting in a decrease in susceptible bacilli, an increase in drug-resistant mutants, and the emergence of drug resistance (acquired resistance). Given her previously treated lymph node TB, it seems safe to assume that our patient has acquired drug resistance. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 14072,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "In recent years, significant progress has been made in the rapid diagnosis of TB and drug resistance, as well as in treatment: new drugs, reduction of the age of indication for certain drugs as well as modification of the classification of drugs used to treat MDR-TB. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 14340,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "For MDR-TB of all forms, the WHO recommends a short regimen of 9 to 11 months, which includes a 4 to 6 month loading phase with high dose amikacin, moxifloxacin, etionamide, clofazimine, pyrazinamide, ethambutol and high dose of isoniazid. In the maintenance phase, patients are put on moxifloxacin, clofazimine, pyrazinamide and ethambutol [11]. Another recent WHO review in 2020 updated the recommendations eliminating short regimens containing injectables, replacing them with a short regimen containing bedaquiline [4]. Another WHO trial approved by the FDA in 2019 recommends the combination of bedaquiline, linezolid, and pretomanide for ultraresistant TB or XDR-TB for 9 months if the three molecules have not been taken previously [4,11].",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 15087,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "In Morocco, the short regimen has been adapted for some cases, but the old long regimen is still widely prescribed. This long regimen is based on 6 months of initial treatment with bedaquiline combined with levofloxacin, linezolid, clofazimine and cycloserine, followed by cessation of bedaquiline and maintenance of the remainder for 12 to 14 months if there is no resistance to group A and B molecules [4]. Our patient was put on a standard regimen by replacing aminoglycosides with bedaquiline. The simultaneous medical and surgical approach seems to be the best strategy for the management of tuberculous retropharyngeal abscess [3,5].",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 15726,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "As with any abscess, the mainstay of management of retro-pharyngeal tubercular abscess is drainage of the pus. Therapeutic aspiration only has been used successfully and can be repeated if necessary [2]. Anti-TB drug therapy and conservative neck stabilization should be the initial treatment if a retropharyngeal abscess is due to an extension from cervical spine TB, with a stable spine and without any neurological deficit or with minimal neurological signs [6]. If left untreated, internal jugular vein thrombosis, mediastinitis and airway obstruction are potential complications [1,2]. ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 16317,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Clinical, bacteriological and radiological surveillance is recommended, as well as monitoring of treatment tolerance [7,11]. The prognosis of MDR pulmonary and extrapulmonary TB has been improved thanks in part to the prescription of new anti-TB drugs such as linezolid and bedaquiline. The success of the treatment is related to the number of effective molecules still available [7]. However, high mortality has been observed in patients with XDR-TB and HIV infection. This could be explained by its synergistic relationship with TB and the emergence of MDR and XDR strains [7]. The HIV serology of our patient is negative which could further improve the prognosis of her disease.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 16998,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Conclusion",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 17008,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Retropharyngeal abscess is a recognized but rare presentation of TB. Unspecified symptoms and unusual location often lead to delayed diagnosis and treatment. Through this case, we highlight the importance of gene amplification tests in the effective and rapid management of this disease.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 17295,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Competing interests:",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 17315,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "The authors declare no competing interest.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 17357,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Author contributions:",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 17378,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "OS,TN and BE have been involved in drafting in the manuscript, BF, BY, CM, AM have revising the manuscript and ELM have given final approval of the version to be published.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 17550,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "References",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 17560,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Supplemental file: ",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 17579,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 17579,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Definitions:",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 17591,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "RR: is defined as isolated resistance to rifampicin.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 17643,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "MDR: is defined as resistance to both rifampicin and isoniazid.",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 17706,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Pre-XDR: is defined as multidrug resistance (MDR/RR-TB) in addition to resistance to any fluoroquinolones (levofloxacin and moxifloxacin).",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ },
+ {
+ "offset": 17844,
+ "infons": {
+ "iao_name_1": "supplementary material section",
+ "iao_id_1": "IAO:0000326"
+ },
+ "text": "Ultraresistant TB or extensively drug-resistant TB (XDR-TB): is defined as multidrug resistance (MDR/RR-TB) in addition to resistance to a fluoroquinolone (levofloxacin or moxifloxacin) and at least one of bedaquiline or linezolid (or both).",
+ "annotations": [],
+ "relations": [],
+ "sentences": []
+ }
+ ],
+ "relations": [],
+ "annotations": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tests/data/Supplementary/Word/mmc1.doc b/tests/data/Supplementary/Word/mmc1.doc
new file mode 100644
index 00000000..c3d22694
Binary files /dev/null and b/tests/data/Supplementary/Word/mmc1.doc differ
diff --git a/tests/data/private b/tests/data/private
new file mode 160000
index 00000000..8e9f45e4
--- /dev/null
+++ b/tests/data/private
@@ -0,0 +1 @@
+Subproject commit 8e9f45e4d6c3f4ebdc1bc612674b1da6d0ff94dd
diff --git a/tests/data/PMC/Pre-Oct-2024/PMC8885717.html b/tests/data/public/html/LEGACY_PMC/PMC8885717.html
similarity index 100%
rename from tests/data/PMC/Pre-Oct-2024/PMC8885717.html
rename to tests/data/public/html/LEGACY_PMC/PMC8885717.html
diff --git a/tests/data/PMC/Pre-Oct-2024/PMC8885717_abbreviations.json b/tests/data/public/html/LEGACY_PMC/PMC8885717_abbreviations.json
similarity index 89%
rename from tests/data/PMC/Pre-Oct-2024/PMC8885717_abbreviations.json
rename to tests/data/public/html/LEGACY_PMC/PMC8885717_abbreviations.json
index cf26b8d3..ece41782 100644
--- a/tests/data/PMC/Pre-Oct-2024/PMC8885717_abbreviations.json
+++ b/tests/data/public/html/LEGACY_PMC/PMC8885717_abbreviations.json
@@ -1,6 +1,6 @@
{
"source": "Auto-CORPus (abbreviations)",
- "date": "20240829",
+ "date": "20250529",
"key": "autocorpus_abbreviations.key",
"documents": [
{
@@ -17,6 +17,11 @@
"text_long_1": "PubMed Central",
"extraction_algorithm_1": "fulltext"
},
+ {
+ "text_short": "Auto-CORPus",
+ "text_long_1": "Automated pipeline for Consistent Outputs from Research Publications",
+ "extraction_algorithm_1": "fulltext"
+ },
{
"text_short": "IAO",
"text_long_1": "Information Artifact Ontology",
diff --git a/tests/data/PMC/Pre-Oct-2024/PMC8885717_bioc.json b/tests/data/public/html/LEGACY_PMC/PMC8885717_bioc.json
similarity index 99%
rename from tests/data/PMC/Pre-Oct-2024/PMC8885717_bioc.json
rename to tests/data/public/html/LEGACY_PMC/PMC8885717_bioc.json
index 53c29fa8..df572974 100644
--- a/tests/data/PMC/Pre-Oct-2024/PMC8885717_bioc.json
+++ b/tests/data/public/html/LEGACY_PMC/PMC8885717_bioc.json
@@ -1,6 +1,6 @@
{
"source": "Auto-CORPus (full-text)",
- "date": "20240829",
+ "date": "20250529",
"key": "autocorpus_fulltext.key",
"infons": {},
"documents": [
diff --git a/tests/data/PMC/Pre-Oct-2024/PMC8885717_tables.json b/tests/data/public/html/LEGACY_PMC/PMC8885717_tables.json
similarity index 99%
rename from tests/data/PMC/Pre-Oct-2024/PMC8885717_tables.json
rename to tests/data/public/html/LEGACY_PMC/PMC8885717_tables.json
index 04c78e3d..db57ddfe 100644
--- a/tests/data/PMC/Pre-Oct-2024/PMC8885717_tables.json
+++ b/tests/data/public/html/LEGACY_PMC/PMC8885717_tables.json
@@ -1,6 +1,6 @@
{
"source": "Auto-CORPus (tables)",
- "date": "20240829",
+ "date": "20250529",
"key": "autocorpus_tables.key",
"infons": {},
"documents": [
diff --git a/tests/data/PMC/Current/PMC8885717.html b/tests/data/public/html/PMC/PMC8885717.html
similarity index 100%
rename from tests/data/PMC/Current/PMC8885717.html
rename to tests/data/public/html/PMC/PMC8885717.html
diff --git a/tests/data/PMC/Current/PMC8885717_abbreviations.json b/tests/data/public/html/PMC/PMC8885717_abbreviations.json
similarity index 86%
rename from tests/data/PMC/Current/PMC8885717_abbreviations.json
rename to tests/data/public/html/PMC/PMC8885717_abbreviations.json
index b04dac0d..bd1e0d7c 100644
--- a/tests/data/PMC/Current/PMC8885717_abbreviations.json
+++ b/tests/data/public/html/PMC/PMC8885717_abbreviations.json
@@ -1,11 +1,11 @@
{
"source": "Auto-CORPus (abbreviations)",
- "date": "20250326",
+ "date": "20250529",
"key": "autocorpus_abbreviations.key",
"documents": [
{
"id": "PMC8885717",
- "inputfile": "tests\\data\\PMC\\Current\\PMC8885717.html",
+ "inputfile": "tests/data/PMC/Current/PMC8885717.html",
"passages": [
{
"text_short": "NLP",
@@ -17,6 +17,11 @@
"text_long_1": "PubMed Central",
"extraction_algorithm_1": "fulltext"
},
+ {
+ "text_short": "Auto-CORPus",
+ "text_long_1": "Automated pipeline for Consistent Outputs from Research Publications",
+ "extraction_algorithm_1": "fulltext"
+ },
{
"text_short": "IAO",
"text_long_1": "Information Artifact Ontology",
diff --git a/tests/data/PMC/Current/PMC8885717_bioc.json b/tests/data/public/html/PMC/PMC8885717_bioc.json
similarity index 99%
rename from tests/data/PMC/Current/PMC8885717_bioc.json
rename to tests/data/public/html/PMC/PMC8885717_bioc.json
index 4b8703f0..a2f2f279 100644
--- a/tests/data/PMC/Current/PMC8885717_bioc.json
+++ b/tests/data/public/html/PMC/PMC8885717_bioc.json
@@ -1,12 +1,12 @@
{
"source": "Auto-CORPus (full-text)",
- "date": "20250326",
+ "date": "20250529",
"key": "autocorpus_fulltext.key",
"infons": {},
"documents": [
{
"id": "PMC8885717",
- "inputfile": "tests\\data\\PMC\\Current\\PMC8885717.html",
+ "inputfile": "tests/data/PMC/Current/PMC8885717.html",
"infons": {},
"passages": [
{
diff --git a/tests/data/PMC/Current/PMC8885717_tables.json b/tests/data/public/html/PMC/PMC8885717_tables.json
similarity index 99%
rename from tests/data/PMC/Current/PMC8885717_tables.json
rename to tests/data/public/html/PMC/PMC8885717_tables.json
index 219d82ec..df9d426b 100644
--- a/tests/data/PMC/Current/PMC8885717_tables.json
+++ b/tests/data/public/html/PMC/PMC8885717_tables.json
@@ -1,11 +1,11 @@
{
"source": "Auto-CORPus (tables)",
- "date": "20250326",
+ "date": "20250529",
"key": "autocorpus_tables.key",
"infons": {},
"documents": [
{
- "inputfile": "tests\\data\\PMC\\Current\\PMC8885717.html",
+ "inputfile": "tests/data/PMC/Current/PMC8885717.html",
"id": "1",
"infons": {},
"passages": [
@@ -782,7 +782,7 @@
]
},
{
- "inputfile": "tests\\data\\PMC\\Current\\PMC8885717.html",
+ "inputfile": "tests/data/PMC/Current/PMC8885717.html",
"id": "2",
"infons": {},
"passages": [
@@ -1139,7 +1139,7 @@
]
},
{
- "inputfile": "tests\\data\\PMC\\Current\\PMC8885717.html",
+ "inputfile": "tests/data/PMC/Current/PMC8885717.html",
"id": "3",
"infons": {},
"passages": [
@@ -1319,7 +1319,7 @@
]
},
{
- "inputfile": "tests\\data\\PMC\\Current\\PMC8885717.html",
+ "inputfile": "tests/data/PMC/Current/PMC8885717.html",
"id": "4",
"infons": {},
"passages": [
diff --git a/tests/test_abbreviation.py b/tests/test_abbreviation.py
new file mode 100644
index 00000000..2eb797f6
--- /dev/null
+++ b/tests/test_abbreviation.py
@@ -0,0 +1,43 @@
+"""Tests for the abbreviation module."""
+
+from itertools import chain, repeat
+
+import pytest
+
+from autocorpus.abbreviation import _is_abbreviation
+
+_ABBREVIATIONS = (
+ "ABC",
+ "H.P.", # can be separated by dots
+ "A.BC", # we don't enforce that there is a dot after every letter
+ "CRIS-CODE", # hyphens are also allowed
+ "C.R.I.S-C.O.D.E", # ...as is a mix
+ "HOUSE", # allowed: all caps
+ "House", # allowed: at least one letter is capital (odd though)
+ "ÄBÇ", # we support unicode chars
+ "3ABC", # we allow numbers
+ "ABC3",
+ "A.B.3.", # abbreviations with numbers can still be separated by dots
+ "a.b.c.", # all lowercase strings are fine if separated by dots
+ "A.B." * 5, # long string, but separated by dots, so also fine
+)
+_NON_ABBREVIATIONS = (
+ "",
+ "A", # too short
+ "AB" * 6, # too long
+ "3", # disallowed: exclusively composed of digits
+ "A!B!C!",
+ "H.P.!",
+ "abc", # disallowed: all lowercase
+ "house",
+ "äbç", # disallowed: all lowercase (unicode)
+)
+
+
+@pytest.mark.parametrize(
+ "s,expected",
+ chain(zip(_ABBREVIATIONS, repeat(True)), zip(_NON_ABBREVIATIONS, repeat(False))),
+)
+def test_is_abbreviation(s: str, expected: bool):
+ """Test the _is_abbreviation() function."""
+ assert _is_abbreviation(s) == expected
diff --git a/tests/test_file_type.py b/tests/test_file_type.py
new file mode 100644
index 00000000..ccad64c5
--- /dev/null
+++ b/tests/test_file_type.py
@@ -0,0 +1,30 @@
+"""Test the file_type checking utilities."""
+
+from pathlib import Path
+
+import pytest
+from lxml import etree
+
+
+def test_check_file_type_html(tmp_path: Path, data_path: Path) -> None:
+ """Test that HTML files are correctly identified."""
+ from autocorpus.file_type import FileType, check_file_type
+
+ html_file = data_path / "public" / "html" / "PMC" / "PMC8885717.html"
+ assert check_file_type(html_file) == FileType.HTML
+
+ json_file = data_path / "public" / "html" / "PMC" / "PMC8885717_bioc.json"
+ assert check_file_type(json_file) == FileType.UNKNOWN
+
+ pdf_file = data_path / "Supplementary" / "PDF" / "tp-10-08-2123-coif.pdf"
+ assert check_file_type(pdf_file) == FileType.PDF
+
+ # Create temporary XML file
+ xml_file = tmp_path / "output.xml"
+ with xml_file.open("wb") as out:
+ out.write(etree.tostring(etree.XML("data"), xml_declaration=True))
+
+ assert check_file_type(xml_file) == FileType.XML
+
+ with pytest.raises(FileNotFoundError):
+ check_file_type(tmp_path / "non_existent_file.txt")
diff --git a/tests/test_reference.py b/tests/test_reference.py
index dbfbdfd8..cbc02fbd 100644
--- a/tests/test_reference.py
+++ b/tests/test_reference.py
@@ -5,18 +5,60 @@
def test_references() -> None:
"""A regression test for the references section of the PMC example."""
- from autocorpus.reference import get_references
+ from autocorpus.reference import ReferencesParagraph, get_references
node = MagicMock()
node.get_text.return_value = "NODE TEXT\n"
- ref = {"node": node, "a": ["A"], "b": ["B", "C"]}
- expected = {
+ ref = {"node": node, "title": ["A"], "journal": ["B", "C"], "volume": ["1"]}
+ expected = ReferencesParagraph(
+ section_heading="References",
+ subsection_heading="",
+ body="NODE TEXT",
+ section_type=[{"iao_name": "references section", "iao_id": "IAO:0000320"}],
+ title="A",
+ journal="B. C",
+ volume="1",
+ )
+
+ assert expected == get_references(ref, "References")
+
+
+def test_references_paragraph_as_dict() -> None:
+ """Test the ReferencesParagraph dataclass."""
+ from autocorpus.reference import ReferencesParagraph
+
+ ref = ReferencesParagraph(
+ section_heading="References",
+ subsection_heading="",
+ body="NODE TEXT",
+ section_type=[{"iao_name": "references section", "iao_id": "IAO:0000320"}],
+ title="A",
+ journal="B. C",
+ volume="1",
+ )
+
+ assert ref.as_dict() == {
"section_heading": "References",
"subsection_heading": "",
"body": "NODE TEXT",
"section_type": [{"iao_name": "references section", "iao_id": "IAO:0000320"}],
- "a": "A",
- "b": "B. C",
+ "title": "A",
+ "journal": "B. C",
+ "volume": "1",
}
- assert expected == get_references(ref, "References")
+ ref = ReferencesParagraph(
+ section_heading="References",
+ subsection_heading="",
+ body="NODE TEXT",
+ section_type=[{"iao_name": "references section", "iao_id": "IAO:0000320"}],
+ title="A",
+ )
+
+ assert ref.as_dict() == {
+ "section_heading": "References",
+ "subsection_heading": "",
+ "body": "NODE TEXT",
+ "section_type": [{"iao_name": "references section", "iao_id": "IAO:0000320"}],
+ "title": "A",
+ }
diff --git a/tests/test_regression.py b/tests/test_regression.py
index f16a022a..86969947 100644
--- a/tests/test_regression.py
+++ b/tests/test_regression.py
@@ -1,50 +1,85 @@
"""Primary build test script used for regression testing between AC output versions."""
import json
+import os
+import shutil
from pathlib import Path
from typing import Any
import pytest
-from autocorpus.configs.default_config import DefaultConfig
+from autocorpus.config import DefaultConfig
+from autocorpus.file_processing import process_file
+
+from .conftest import DATA_PATH
+
+
+def _get_html_test_data_paths(subfolder: str):
+ """Return paths to HTML test data files with appropriate DefaultConfig."""
+ HTML_DATA_PATH = DATA_PATH / subfolder / "html"
+ if not HTML_DATA_PATH.exists():
+ return
+
+ for dir_name in os.listdir(HTML_DATA_PATH):
+ dir_path = HTML_DATA_PATH / dir_name
+ if dir_path.is_dir():
+ # Assume the folder name corresponds to a DefaultConfig
+ config = getattr(DefaultConfig, dir_name).load_config()
+
+ for file_path in dir_path.glob("*.html"):
+ # The reason for converting the path to a string is so that we get the
+ # file path in the test name (paths don't work for some reason)
+ yield (str(file_path.relative_to(DATA_PATH)), config)
+
+
+_private_test_data = list(_get_html_test_data_paths("private"))
@pytest.mark.parametrize(
- "input_file, config",
- [
- ("PMC/Pre-Oct-2024/PMC8885717.html", DefaultConfig.LEGACY_PMC.load_config()),
- ("PMC/Current/PMC8885717.html", DefaultConfig.PMC.load_config()),
- ],
+ "input_file,config",
+ _get_html_test_data_paths("public"),
)
-def test_autocorpus(data_path: Path, input_file: str, config: dict[str, Any]) -> None:
- """A regression test for the main autoCORPus class, using the each PMC config on the AutoCORPus Paper."""
- from autocorpus.autocorpus import Autocorpus
-
- pmc_example_path = data_path / input_file
+def test_regression_html_public(
+ data_path: Path, input_file: str, config: dict[str, Any]
+) -> None:
+ """Regression test for public HTML data."""
+ _run_html_regression_test(data_path, input_file, config)
+
+
+@pytest.mark.skipif(not _private_test_data, reason="Private test data not checked out")
+@pytest.mark.parametrize("input_file,config", _private_test_data)
+def test_regression_html_private(
+ data_path: Path, input_file: str, config: dict[str, Any]
+) -> None:
+ """Regression test for private HTML data."""
+ _run_html_regression_test(data_path, input_file, config)
+
+
+def _run_html_regression_test(
+ data_path: Path, input_file: str, config: dict[str, Any]
+) -> None:
+ file_path = data_path / input_file
with open(
- str(pmc_example_path).replace(".html", "_abbreviations.json"), encoding="utf-8"
+ str(file_path).replace(".html", "_abbreviations.json"), encoding="utf-8"
) as f:
expected_abbreviations = json.load(f)
with open(
- str(pmc_example_path).replace(".html", "_bioc.json"),
+ str(file_path).replace(".html", "_bioc.json"),
encoding="utf-8",
) as f:
expected_bioc = json.load(f)
- with open(
- str(pmc_example_path).replace(".html", "_tables.json"),
- encoding="utf-8",
- ) as f:
- expected_tables = json.load(f)
-
- auto_corpus = Autocorpus(
- config=config,
- main_text=pmc_example_path,
- )
-
- auto_corpus.process_file()
-
+ try:
+ with open(
+ str(file_path).replace(".html", "_tables.json"),
+ encoding="utf-8",
+ ) as f:
+ expected_tables = json.load(f)
+ except FileNotFoundError:
+ expected_tables = {}
+
+ auto_corpus = process_file(config=config, file_path=file_path)
abbreviations = auto_corpus.abbreviations
- bioc = auto_corpus.to_bioc()
+ bioc = auto_corpus.to_bioc().to_dict()
tables = auto_corpus.tables
_make_reproducible(
@@ -57,7 +92,10 @@ def test_autocorpus(data_path: Path, input_file: str, config: dict[str, Any]) ->
)
assert abbreviations == expected_abbreviations
assert bioc == expected_bioc
- assert tables == expected_tables
+ if auto_corpus.has_tables:
+ assert tables == expected_tables
+ else:
+ assert not expected_tables
@pytest.mark.skip_ci_macos
@@ -69,49 +107,79 @@ def test_autocorpus(data_path: Path, input_file: str, config: dict[str, Any]) ->
)
def test_pdf_to_bioc(data_path: Path, input_file: str, config: dict[str, Any]) -> None:
"""Test the conversion of a PDF file to a BioC format."""
- from autocorpus.autocorpus import Autocorpus
-
pdf_path = data_path / input_file
- expected_output = pdf_path.parent / "Expected Output" / pdf_path.name
+ expected_output_path = pdf_path.parent / "Expected Output" / pdf_path.name
with open(
- str(expected_output).replace(".pdf", ".pdf_bioc.json"),
+ str(expected_output_path).replace(".pdf", ".pdf_bioc.json"),
encoding="utf-8",
) as f:
expected_bioc = json.load(f)
with open(
- str(expected_output).replace(".pdf", ".pdf_tables.json"),
+ str(expected_output_path).replace(".pdf", ".pdf_tables.json"),
encoding="utf-8",
) as f:
expected_tables = json.load(f)
- ac = Autocorpus(
- config=config,
+ auto_corpus = process_file(config=config, file_path=pdf_path)
+
+ new_bioc = auto_corpus.main_text
+ new_tables = auto_corpus.tables
+
+ _make_reproducible(new_bioc, expected_bioc, new_tables, expected_tables)
+
+ assert new_bioc == expected_bioc
+ assert new_tables == expected_tables
+
+
+@pytest.mark.skip_ci_macos
+@pytest.mark.skip_ci_windows
+@pytest.mark.parametrize(
+ "input_file, config, has_tables",
+ [
+ ("Supplementary/Word/mmc1.doc", DefaultConfig.PMC.load_config(), False),
+ ],
+)
+def test_word_to_bioc(
+ data_path: Path,
+ input_file: str,
+ config: dict[str, Any],
+ has_tables: bool,
+ tmp_path: Path,
+) -> None:
+ """Test the conversion of a doc file to a BioC format using a temp directory."""
+ # Original file locations
+ original_doc_path = data_path / input_file
+ expected_output_path = (
+ original_doc_path.parent / "Expected Output" / original_doc_path.name
)
- ac.process_files(files=[pdf_path])
+ # Copy the input doc file to the temp directory
+ temp_input_dir = tmp_path / "input"
+ temp_input_dir.mkdir()
+ temp_doc_path = temp_input_dir / original_doc_path.name
+ shutil.copy(original_doc_path, temp_doc_path)
+ # Load expected BioC output
with open(
- str(pdf_path).replace(".pdf", ".pdf_bioc.json"),
+ str(expected_output_path).replace(".doc", ".doc_bioc.json"),
encoding="utf-8",
) as f:
- new_bioc = json.load(f)
+ expected_bioc = json.load(f)
- with open(
- str(pdf_path).replace(".pdf", ".pdf_tables.json"),
- encoding="utf-8",
- ) as f:
- new_tables = json.load(f)
+ auto_corpus = process_file(config=config, file_path=temp_doc_path)
- _make_reproducible(new_bioc, expected_bioc, new_tables, expected_tables)
+ new_bioc = auto_corpus.main_text
+
+ _make_reproducible(new_bioc, expected_bioc)
assert new_bioc == expected_bioc
- assert new_tables == expected_tables
def _make_reproducible(*data: dict[str, Any]) -> None:
"""Make output files reproducible by stripping dates and file paths."""
for d in data:
- d.pop("date")
- for doc in d["documents"]:
- doc.pop("inputfile")
+ d.pop("date", None)
+ if docs := d.get("documents", []):
+ for doc in docs:
+ doc.pop("inputfile", None)