diff --git a/README.md b/README.md
index fd1972fb..cd17d577 100644
--- a/README.md
+++ b/README.md
@@ -24,9 +24,13 @@ Have a look at the [Python-specific documentation](https://davidvujic.github.io/
You will find installation, setup, usage guides and more.
## Polylith for Python? :snake:
-This repo contains a Poetry plugin, that you can install from [PyPI](https://pypi.org/project/poetry-polylith-plugin).
-The plugin will add Polylith specific tooling support to Poetry.
-Have a look in the [Poetry Polylith Plugin project folder](projects/poetry_polylith_plugin/README.md) with details about the Poetry plugin.
+This repo contains a Poetry plugin and a CLI that enables support for Hatch.
+Both can be installed from PyPI:
+* [a Poetry Plugin](https://pypi.org/project/poetry-polylith-plugin)
+* a CLI (coming soon)
+
+The Poetry plugin will add Polylith specific tooling support to Poetry.
+The CLI will add tooling support for Polylith, enabling more Package & Dependency Management tools (such as Hatch).
### Use cases
@@ -39,7 +43,10 @@ More details about how to package libraries in the docs about [Packaging & deplo
## :sparkles: Examples :sparkles:
Have a look at the [Python Polylith Examples](https://github.com/DavidVujic/python-polylith-example) repository.
-It is a repository with an example __Python__ setup of the Polylith Architecture.
+
+There is also a [Python Polylith Examples with Hatch](https://github.com/DavidVujic/python-polylith-example-hatch) repository.
+
+The repositories are example __Python__ setups of the Polylith Architecture.
You will find examples of sharing code between different kind of projects, and developer tooling setup such as `mypy` and the `venv`.
## Videos
@@ -63,6 +70,3 @@ You will find examples of sharing code between different kind of projects, and d
- [Kafka messaging with Python & Polylith](https://davidvujic.blogspot.com/2023/08/kafka-messaging-with-python-and-polylith.html)
-
-
-
diff --git a/bases/polylith/cli/__init__.py b/bases/polylith/cli/__init__.py
new file mode 100644
index 00000000..8ff14949
--- /dev/null
+++ b/bases/polylith/cli/__init__.py
@@ -0,0 +1,3 @@
+from polylith.cli import core
+
+__all__ = ["core"]
diff --git a/bases/polylith/cli/__main__.py b/bases/polylith/cli/__main__.py
new file mode 100644
index 00000000..dfb04828
--- /dev/null
+++ b/bases/polylith/cli/__main__.py
@@ -0,0 +1,3 @@
+from polylith.cli.core import app
+
+app(prog_name="poly")
diff --git a/bases/polylith/cli/core.py b/bases/polylith/cli/core.py
new file mode 100644
index 00000000..d97d825d
--- /dev/null
+++ b/bases/polylith/cli/core.py
@@ -0,0 +1,115 @@
+from pathlib import Path
+
+from polylith import commands, info, repo, workspace
+from polylith.cli import create, options
+from typer import Exit, Option, Typer
+from typing_extensions import Annotated
+
+app = Typer()
+
+app.add_typer(
+ create.app,
+ name="create",
+ help="Commands for creating a workspace, bases, components and projects.",
+)
+
+
+@app.command("info")
+def info_command(short: Annotated[bool, options.short_workspace] = False):
+ """Info about the Polylith workspace."""
+ commands.info.run(short)
+
+
+@app.command("check")
+def check_command(
+ strict: Annotated[bool, options.strict] = False,
+ verbose: Annotated[bool, options.verbose] = False,
+ quiet: Annotated[bool, options.quiet] = False,
+ directory: Annotated[str, options.directory] = "",
+ alias: Annotated[str, options.alias] = "",
+):
+ """Validates the Polylith workspace."""
+ root = repo.get_workspace_root(Path.cwd())
+ ns = workspace.parser.get_namespace_from_config(root)
+
+ all_projects_data = info.get_projects_data(root, ns)
+ only_projects_data = [p for p in all_projects_data if info.is_project(p)]
+
+ cli_options = {
+ "verbose": verbose,
+ "quiet": quiet,
+ "strict": strict,
+ "alias": str.split(alias, ",") if alias else [],
+ }
+
+ dir_path = Path(directory).as_posix() if directory else Path.cwd().name
+ projects_data = [p for p in only_projects_data if dir_path in p["path"].as_posix()]
+ results = {commands.check.run(root, ns, p, cli_options) for p in projects_data}
+
+ if not all(results):
+ raise Exit(code=1)
+
+
+@app.command("diff")
+def diff_command(
+ since: Annotated[str, Option(help="Changed since a specific tag.")] = "",
+ short: Annotated[bool, options.short] = False,
+ bricks: Annotated[bool, Option(help="Print changed bricks.")] = False,
+):
+ """Shows changed bricks compared to the latest git tag."""
+ commands.diff.run(since, short, bricks)
+
+
+@app.command("libs")
+def libs_command(
+ strict: Annotated[bool, options.strict] = False,
+ directory: Annotated[str, options.directory] = "",
+ alias: Annotated[str, options.alias] = "",
+):
+ """Show third-party libraries used in the workspace."""
+ root = repo.get_workspace_root(Path.cwd())
+ ns = workspace.parser.get_namespace_from_config(root)
+
+ projects_data = info.get_projects_data(root, ns)
+
+ cli_options = {
+ "strict": strict,
+ "alias": str.split(alias, ",") if alias else [],
+ }
+
+ dir_path = Path(directory).as_posix() if directory else Path.cwd().name
+ projects_data = [p for p in projects_data if dir_path in p["path"].as_posix()]
+ results = {commands.libs.run(root, ns, p, cli_options) for p in projects_data}
+
+ if not all(results):
+ raise Exit(code=1)
+
+
+@app.command("sync")
+def sync_command(
+ strict: Annotated[bool, options.strict] = False,
+ quiet: Annotated[bool, options.quiet] = False,
+ directory: Annotated[str, options.directory] = "",
+ verbose: Annotated[str, options.verbose] = "",
+):
+ """Update pyproject.toml with missing bricks."""
+ root = repo.get_workspace_root(Path.cwd())
+ ns = workspace.parser.get_namespace_from_config(root)
+
+ projects_data = info.get_projects_data(root, ns)
+
+ cli_options = {
+ "strict": strict,
+ "quiet": quiet,
+ "verbose": verbose,
+ }
+
+ dir_path = Path(directory).as_posix() if directory else Path.cwd().name
+ projects_data = [p for p in projects_data if dir_path in p["path"].as_posix()]
+
+ for p in projects_data:
+ commands.sync.run(root, ns, p, cli_options)
+
+
+if __name__ == "__main__":
+ app()
diff --git a/bases/polylith/cli/create.py b/bases/polylith/cli/create.py
new file mode 100644
index 00000000..cd8fcc14
--- /dev/null
+++ b/bases/polylith/cli/create.py
@@ -0,0 +1,67 @@
+from pathlib import Path
+from typing import Union
+
+from polylith import project, repo
+from polylith.bricks import base, component
+from polylith.commands.create import create
+from polylith.workspace.create import create_workspace
+from typer import Exit, Option, Typer
+from typing_extensions import Annotated
+
+app = Typer()
+
+
+@app.command("base")
+def base_command(
+ name: Annotated[str, Option(help="Name of the base.")],
+ description: Annotated[str, Option(help="Description of the base.")] = "",
+):
+ """Creates a Polylith base."""
+ create(name, description, base.create_base)
+
+
+@app.command("component")
+def component_command(
+ name: Annotated[str, Option(help="Name of the component.")],
+ description: Annotated[str, Option(help="Description of the component.")] = "",
+):
+ """Creates a Polylith component."""
+ create(name, description, component.create_component)
+
+
+def _create_project(root: Path, _ns: str, name: str, description: Union[str, None]):
+ root_pyproject: dict = project.get_toml(root / repo.default_toml)
+
+ if repo.is_poetry(root_pyproject):
+ template = project.templates.poetry_pyproject
+ elif repo.is_hatch(root_pyproject):
+ template = project.templates.hatch_pyproject
+
+ if not template:
+ print("Failed to guess the used Package & Dependency Management")
+ print(
+ "Is the root pyproject.toml missing, or are you using a tool not supported by Polylith?"
+ )
+ raise Exit(code=1)
+
+ project.create_project(root, template, name, description or "")
+
+
+@app.command("project")
+def project_command(
+ name: Annotated[str, Option(help="Name of the project.")],
+ description: Annotated[str, Option(help="Description of the project.")] = "",
+):
+ """Creates a Polylith project."""
+ create(name, description, _create_project)
+
+
+@app.command("workspace")
+def workspace_command(
+ name: Annotated[str, Option(help="Name of the workspace.")],
+ theme: Annotated[str, Option(help="Workspace theme.")] = "tdd",
+):
+ """Creates a Polylith workspace in the current directory."""
+ path = Path.cwd()
+
+ create_workspace(path, name, theme)
diff --git a/bases/polylith/cli/options.py b/bases/polylith/cli/options.py
new file mode 100644
index 00000000..5a142808
--- /dev/null
+++ b/bases/polylith/cli/options.py
@@ -0,0 +1,17 @@
+from typer import Option
+
+alias = Option(
+ help="alias for third-party libraries, useful when an import differ from the library name"
+)
+directory = Option(
+ help="The working directory for the command (defaults to the current working directory)."
+)
+
+short = Option(help="Print short view.")
+short_workspace = Option(help="Display Workspace Info adjusted for many projects.")
+strict = Option(
+ help="More strict checks when matching name of third-party libraries and imports"
+)
+
+verbose = Option(help="More verbose output.")
+quiet = Option(help="Do not output any messages.")
diff --git a/components/polylith/bricks/base.py b/components/polylith/bricks/base.py
index dc39b6e8..1f8c8e79 100644
--- a/components/polylith/bricks/base.py
+++ b/components/polylith/bricks/base.py
@@ -1,5 +1,5 @@
from pathlib import Path
-from typing import List, Union
+from typing import List
from polylith.bricks import component
from polylith.bricks.brick import create_brick
@@ -7,9 +7,12 @@
from polylith.test import create_test
-def create_base(path: Path, namespace: str, package: str, description: Union[str, None]) -> None:
- create_brick(path, bases_dir, namespace, package, description)
- create_test(path, bases_dir, namespace, package)
+def create_base(path: Path, options: dict) -> None:
+ extra = {"brick": bases_dir}
+ base_options = {**options, **extra}
+
+ create_brick(path, base_options)
+ create_test(path, base_options)
def get_bases_data(path: Path, ns: str) -> List[dict]:
diff --git a/components/polylith/bricks/brick.py b/components/polylith/bricks/brick.py
index e08e4942..597fdbe4 100644
--- a/components/polylith/bricks/brick.py
+++ b/components/polylith/bricks/brick.py
@@ -1,5 +1,4 @@
from pathlib import Path
-from typing import Union
from polylith.dirs import create_dir
from polylith.files import create_file
@@ -8,15 +7,11 @@
from polylith.workspace import parser
-def create_brick(
- root: Path,
- brick: str,
- namespace: str,
- package: str,
- description: Union[str, None],
- modulename: str = "core",
-) -> None:
- path_kwargs = {"brick": brick, "namespace": namespace, "package": package}
+def create_brick(root: Path, options: dict) -> None:
+ modulename = options["modulename"]
+ path_kwargs = {
+ k: v for k, v in options.items() if k in {"brick", "namespace", "package"}
+ }
brick_structure = parser.get_brick_structure_from_config(root)
resources_structure = parser.get_resources_structure_from_config(root)
@@ -26,7 +21,7 @@ def create_brick(
d = create_dir(root, brick_path)
create_file(d, f"{modulename}.py")
- create_interface(d, namespace, package, modulename, description)
+ create_interface(d, options)
if parser.is_readme_generation_enabled(root):
- create_brick_readme(root / resources_path, package, brick, description)
+ create_brick_readme(root / resources_path, options)
diff --git a/components/polylith/bricks/component.py b/components/polylith/bricks/component.py
index f3b8e168..deed2078 100644
--- a/components/polylith/bricks/component.py
+++ b/components/polylith/bricks/component.py
@@ -1,5 +1,5 @@
from pathlib import Path
-from typing import List, Union
+from typing import List
from polylith import workspace
from polylith.bricks.brick import create_brick
@@ -7,11 +7,12 @@
from polylith.test import create_test
-def create_component(
- path: Path, namespace: str, package: str, description: Union[str, None]
-) -> None:
- create_brick(path, components_dir, namespace, package, description)
- create_test(path, components_dir, namespace, package)
+def create_component(path: Path, options: dict) -> None:
+ extra = {"brick": components_dir}
+ component_options = {**options, **extra}
+
+ create_brick(path, component_options)
+ create_test(path, component_options)
def is_brick_dir(p: Path) -> bool:
diff --git a/components/polylith/commands/__init__.py b/components/polylith/commands/__init__.py
new file mode 100644
index 00000000..99e1a8ec
--- /dev/null
+++ b/components/polylith/commands/__init__.py
@@ -0,0 +1,3 @@
+from polylith.commands import check, create, diff, info, libs, sync
+
+__all__ = ["check", "create", "diff", "info", "libs", "sync"]
diff --git a/components/polylith/commands/check.py b/components/polylith/commands/check.py
new file mode 100644
index 00000000..57fbd5ea
--- /dev/null
+++ b/components/polylith/commands/check.py
@@ -0,0 +1,43 @@
+import importlib.metadata
+from pathlib import Path
+
+from polylith import alias, check, distributions
+
+
+def run(root: Path, ns: str, project_data: dict, options: dict) -> bool:
+ is_verbose = options["verbose"]
+ is_quiet = options["quiet"]
+ is_strict = options["strict"]
+ library_alias = options["alias"]
+
+ third_party_libs = project_data["deps"]
+ name = project_data["name"]
+
+ collected_imports = check.report.collect_all_imports(root, ns, project_data)
+ dists = importlib.metadata.distributions()
+
+ known_aliases = distributions.distributions_packages(dists)
+ known_aliases.update(alias.parse(library_alias))
+
+ extra = alias.pick(known_aliases, third_party_libs)
+
+ libs = third_party_libs.union(extra)
+
+ details = check.report.create_report(
+ project_data,
+ collected_imports,
+ libs,
+ is_strict,
+ )
+
+ res = all([not details["brick_diff"], not details["libs_diff"]])
+
+ if not is_quiet:
+ check.report.print_missing_deps(details["brick_diff"], name)
+ check.report.print_missing_deps(details["libs_diff"], name)
+
+ if is_verbose:
+ check.report.print_brick_imports(details["brick_imports"])
+ check.report.print_brick_imports(details["third_party_imports"])
+
+ return res
diff --git a/components/polylith/poetry/commands/create.py b/components/polylith/commands/create.py
similarity index 50%
rename from components/polylith/poetry/commands/create.py
rename to components/polylith/commands/create.py
index a118909c..8488de30 100644
--- a/components/polylith/poetry/commands/create.py
+++ b/components/polylith/commands/create.py
@@ -1,20 +1,24 @@
from pathlib import Path
-
+from typing import Union
from polylith import repo, workspace
-def create(command, fn):
+def create(name: Union[str, None], description: Union[str, None], fn):
root = repo.get_workspace_root(Path.cwd())
- name = command.option("name")
- description = command.option("description")
namespace = workspace.parser.get_namespace_from_config(root)
if not name:
- raise ValueError("Please add a name by using --name or -n")
+ raise ValueError("Please add a name by using --name")
if not namespace:
raise ValueError(
"Didn't find a namespace. Expected to find it in workspace.toml."
)
- fn(root, namespace, name, description)
+ options = {
+ "namespace": namespace,
+ "package": name,
+ "description": description,
+ "modulename": "core",
+ }
+ fn(root, options)
diff --git a/components/polylith/commands/diff.py b/components/polylith/commands/diff.py
new file mode 100644
index 00000000..766b17b2
--- /dev/null
+++ b/components/polylith/commands/diff.py
@@ -0,0 +1,45 @@
+from pathlib import Path
+
+from typing import Union
+from polylith import diff, info, repo, workspace
+
+
+def print_views(root: Path, tag: str, short: bool, only_bricks: bool) -> None:
+ ns = workspace.parser.get_namespace_from_config(root)
+ files = diff.collect.get_files(tag)
+ bases = diff.collect.get_changed_bases(files, ns)
+ components = diff.collect.get_changed_components(files, ns)
+
+ projects = diff.collect.get_changed_projects(files)
+ all_projects_data = info.get_bricks_in_projects(root, components, bases, ns)
+ projects_data = [p for p in all_projects_data if info.is_project(p)]
+
+ affected_projects = diff.collect.get_projects_affected_by_changes(
+ projects_data, projects, bases, components
+ )
+
+ if not short and not only_bricks:
+ diff.report.print_diff_summary(tag, bases, components)
+ diff.report.print_detected_changes_in_projects(projects, short)
+ diff.report.print_diff_details(projects_data, bases, components)
+
+ return
+
+ if short and not only_bricks:
+ diff.report.print_projects_affected_by_changes(affected_projects, short)
+
+ return
+
+ diff.report.print_detected_changes_in_bricks(bases, components, short)
+
+
+def run(tag_name: Union[str, None], short: bool, only_bricks: bool):
+ root = repo.get_workspace_root(Path.cwd())
+
+ tag = diff.collect.get_latest_tag(root, tag_name)
+
+ if not tag:
+ print("No tags found in repository.")
+ return
+
+ print_views(root, tag, short, only_bricks)
diff --git a/components/polylith/commands/info.py b/components/polylith/commands/info.py
new file mode 100644
index 00000000..a41fd931
--- /dev/null
+++ b/components/polylith/commands/info.py
@@ -0,0 +1,24 @@
+from pathlib import Path
+
+from polylith import info, repo, workspace
+
+
+def run(short: bool):
+ root = repo.get_workspace_root(Path.cwd())
+
+ ns = workspace.parser.get_namespace_from_config(root)
+ bases = info.get_bases(root, ns)
+ components = info.get_components(root, ns)
+ projects_data = info.get_bricks_in_projects(root, components, bases, ns)
+
+ info.print_workspace_summary(projects_data, bases, components)
+
+ if not components and not bases:
+ return
+
+ if short:
+ info.print_compressed_view_for_bricks_in_projects(
+ projects_data, bases, components
+ )
+ else:
+ info.print_bricks_in_projects(projects_data, bases, components)
diff --git a/components/polylith/commands/libs.py b/components/polylith/commands/libs.py
new file mode 100644
index 00000000..8f4bcb7a
--- /dev/null
+++ b/components/polylith/commands/libs.py
@@ -0,0 +1,29 @@
+from pathlib import Path
+
+from polylith import alias
+from polylith.libs import report
+
+
+def run(root: Path, ns: str, project_data: dict, options: dict) -> bool:
+ is_strict = options["strict"]
+ library_alias = options["alias"]
+
+ name = project_data["name"]
+ third_party_libs = project_data["deps"]
+
+ brick_imports = report.get_third_party_imports(root, ns, project_data)
+
+ report.print_libs_summary(brick_imports, project_data)
+ report.print_libs_in_bricks(brick_imports)
+
+ library_aliases = alias.parse(library_alias)
+ extra = alias.pick(library_aliases, third_party_libs)
+
+ libs = third_party_libs.union(extra)
+
+ return report.print_missing_installed_libs(
+ brick_imports,
+ libs,
+ name,
+ is_strict,
+ )
diff --git a/components/polylith/commands/sync.py b/components/polylith/commands/sync.py
new file mode 100644
index 00000000..0e2cdd48
--- /dev/null
+++ b/components/polylith/commands/sync.py
@@ -0,0 +1,25 @@
+from pathlib import Path
+
+from polylith import info
+from polylith import sync
+
+
+def run(root: Path, ns: str, project_data: dict, options: dict):
+ is_quiet = options["quiet"]
+ is_verbose = options["verbose"]
+
+ bases = info.get_bases(root, ns)
+ components = info.get_components(root, ns)
+ workspace_data = {"bases": bases, "components": components}
+
+ diff = sync.calculate_diff(root, ns, project_data, workspace_data)
+
+ sync.update_project(root, ns, diff)
+
+ if is_quiet:
+ return
+
+ sync.report.print_summary(diff)
+
+ if is_verbose:
+ sync.report.print_brick_imports(diff)
diff --git a/components/polylith/distributions/__init__.py b/components/polylith/distributions/__init__.py
new file mode 100644
index 00000000..d9951bf7
--- /dev/null
+++ b/components/polylith/distributions/__init__.py
@@ -0,0 +1,3 @@
+from polylith.distributions.core import distributions_packages, get_distributions
+
+__all__ = ["distributions_packages", "get_distributions"]
diff --git a/components/polylith/distributions/core.py b/components/polylith/distributions/core.py
new file mode 100644
index 00000000..809b8fa0
--- /dev/null
+++ b/components/polylith/distributions/core.py
@@ -0,0 +1,31 @@
+import importlib.metadata
+from functools import reduce
+from typing import Dict, List
+
+
+def top_level_packages(dist) -> List[str]:
+ top_level = dist.read_text("top_level.txt")
+
+ return str.split(top_level or "")
+
+
+def mapped_packages(dist) -> dict:
+ packages = top_level_packages(dist)
+ name = dist.metadata["name"]
+
+ return {name: packages} if packages else {}
+
+
+def map_packages(acc, dist) -> dict:
+ return {**acc, **mapped_packages(dist)}
+
+
+def distributions_packages(dists) -> Dict[str, List[str]]:
+ """Return a mapping of top-level packages to their distributions."""
+ return reduce(map_packages, dists, {})
+
+
+def get_distributions(project_dependencies: set) -> list:
+ dists = importlib.metadata.distributions()
+
+ return [dist for dist in dists if dist.metadata["name"] in project_dependencies]
diff --git a/components/polylith/info/collect.py b/components/polylith/info/collect.py
index 2967261e..7bc7c9fc 100644
--- a/components/polylith/info/collect.py
+++ b/components/polylith/info/collect.py
@@ -39,7 +39,7 @@ def get_bricks_in_projects(
res = [
{
- **{"name": p["name"], "path": p["path"], "type": p["type"]},
+ **{k: v for k, v in p.items() if k not in {"packages"}},
**get_project_bricks(p["packages"], components, bases, namespace),
}
for p in packages_for_projects
diff --git a/components/polylith/interface/interfaces.py b/components/polylith/interface/interfaces.py
index a362d885..358b2623 100644
--- a/components/polylith/interface/interfaces.py
+++ b/components/polylith/interface/interfaces.py
@@ -1,5 +1,4 @@
from pathlib import Path
-from typing import Union
from polylith.files import create_file
@@ -14,7 +13,6 @@
from {namespace}.{package} import {modulename}
__all__ = ["{modulename}"]
-
"""
@@ -24,15 +22,14 @@ def to_namespaced_path(package: str) -> str:
return ".".join(parts)
-def create_interface(
- path: Path,
- namespace: str,
- package: str,
- modulename: str,
- description: Union[str, None],
-) -> None:
+def create_interface(path: Path, options: dict) -> None:
interface = create_file(path, "__init__.py")
+ namespace = options["namespace"]
+ package = options["package"]
+ description = options["description"]
+ modulename = options["modulename"]
+
package_path = to_namespaced_path(package)
docstring = (
diff --git a/components/polylith/libs/report.py b/components/polylith/libs/report.py
index 551bd2b5..65612058 100644
--- a/components/polylith/libs/report.py
+++ b/components/polylith/libs/report.py
@@ -1,4 +1,5 @@
import difflib
+from operator import itemgetter
from pathlib import Path
from typing import Set
@@ -73,13 +74,11 @@ def print_libs_summary(brick_imports: dict, project_data: dict) -> None:
Padding(f"[data]Libraries summary for [/]{printable_name}", (1, 0, 1, 0))
)
- bases_imports = flatten_imports(brick_imports, "bases")
- components_imports = flatten_imports(brick_imports, "components")
+ bases_len = len(flatten_imports(brick_imports, "bases"))
+ components_len = len(flatten_imports(brick_imports, "components"))
- console.print(f"[base]Libraries used in bases[/]: [data]{len(bases_imports)}[/]")
- console.print(
- f"[comp]libraries used in components[/]: [data]{len(components_imports)}[/]"
- )
+ console.print(f"[comp]libraries used in components[/]: [data]{components_len}[/]")
+ console.print(f"[base]Libraries used in bases[/]: [data]{bases_len}[/]")
def print_libs_in_bricks(brick_imports: dict) -> None:
@@ -98,17 +97,20 @@ def print_libs_in_bricks(brick_imports: dict) -> None:
table.add_column("[data]brick[/]")
table.add_column("[data]libraries[/]")
- for brick, imports in bases.items():
- table.add_row(f"[base]{brick}[/]", ", ".join(sorted(imports)))
-
- for brick, imports in components.items():
+ for brick, imports in sorted(components.items(), key=itemgetter(0)):
table.add_row(f"[comp]{brick}[/]", ", ".join(sorted(imports)))
+ for brick, imports in sorted(bases.items(), key=itemgetter(0)):
+ table.add_row(f"[base]{brick}[/]", ", ".join(sorted(imports)))
+
console.print(table, overflow="ellipsis")
def print_missing_installed_libs(
- brick_imports: dict, third_party_libs: Set[str], project_name: str, is_strict: bool = False
+ brick_imports: dict,
+ third_party_libs: Set[str],
+ project_name: str,
+ is_strict: bool = False,
) -> bool:
diff = calculate_diff(brick_imports, third_party_libs, is_strict)
diff --git a/components/polylith/poetry/commands/check.py b/components/polylith/poetry/commands/check.py
index 94720e04..bb48a2c3 100644
--- a/components/polylith/poetry/commands/check.py
+++ b/components/polylith/poetry/commands/check.py
@@ -2,7 +2,7 @@
from cleo.helpers import option
from poetry.console.commands.command import Command
-from polylith import alias, check, info, project, repo, workspace
+from polylith import commands, info, repo, workspace
from polylith.poetry import internals
command_options = [
@@ -27,65 +27,36 @@ class CheckCommand(Command):
options = command_options
def print_report(self, root: Path, ns: str, project_data: dict) -> bool:
- is_verbose = self.option("verbose")
- is_quiet = self.option("quiet")
- is_strict = self.option("strict")
-
path = project_data["path"]
name = project_data["name"]
+ options = {
+ "verbose": True if self.option("verbose") else False,
+ "quiet": True if self.option("quiet") else False,
+ "strict": True if self.option("strict") else False,
+ "alias": self.option("alias") or [],
+ }
+
try:
- collected_imports = check.report.collect_all_imports(root, ns, project_data)
third_party_libs = internals.find_third_party_libs(self.poetry, path)
+ merged = {**project_data, **{"deps": third_party_libs}}
- dists = internals.distributions(self.poetry, path)
- known_aliases = internals.distributions_packages(dists)
- known_aliases.update(alias.parse(self.option("alias")))
-
- extra = alias.pick(known_aliases, third_party_libs)
-
- libs = third_party_libs.union(extra)
-
- details = check.report.create_report(
- project_data,
- collected_imports,
- libs,
- is_strict,
- )
-
- res = all([not details["brick_diff"], not details["libs_diff"]])
-
- if is_quiet:
- return res
-
- check.report.print_missing_deps(details["brick_diff"], name)
- check.report.print_missing_deps(details["libs_diff"], name)
-
- if is_verbose:
- check.report.print_brick_imports(details["brick_imports"])
- check.report.print_brick_imports(details["third_party_imports"])
-
- return res
+ return commands.check.run(root, ns, merged, options)
except ValueError as e:
self.line_error(f"{name}: {e}")
return False
def handle(self) -> int:
+ directory = self.option("directory")
root = repo.get_workspace_root(Path.cwd())
ns = workspace.parser.get_namespace_from_config(root)
all_projects_data = info.get_projects_data(root, ns)
- projects_data = [p for p in all_projects_data if info.is_project(p)]
-
- if self.option("directory"):
- project_name = project.get_project_name(self.poetry.pyproject.data)
- data = next((p for p in projects_data if p["name"] == project_name), None)
-
- if not data:
- raise ValueError(f"Didn't find project in {self.option('directory')}")
+ only_projects_data = [p for p in all_projects_data if info.is_project(p)]
- res = self.print_report(root, ns, data)
- return 0 if res else 1
+ projects_data = internals.filter_projects_data(
+ self.poetry, directory, only_projects_data
+ )
results = {self.print_report(root, ns, data) for data in projects_data}
diff --git a/components/polylith/poetry/commands/create_base.py b/components/polylith/poetry/commands/create_base.py
index 3cfbe5f3..3f99d7f1 100644
--- a/components/polylith/poetry/commands/create_base.py
+++ b/components/polylith/poetry/commands/create_base.py
@@ -1,7 +1,7 @@
from cleo.helpers import option
from poetry.console.commands.command import Command
from polylith.bricks import base
-from polylith.poetry.commands.create import create
+from polylith.commands.create import create
class CreateBaseCommand(Command):
@@ -20,6 +20,9 @@ class CreateBaseCommand(Command):
]
def handle(self) -> int:
- create(self, base.create_base)
+ name = self.option("name")
+ description = self.option("description")
+
+ create(name, description, base.create_base)
return 0
diff --git a/components/polylith/poetry/commands/create_component.py b/components/polylith/poetry/commands/create_component.py
index b04cfd50..31b91dca 100644
--- a/components/polylith/poetry/commands/create_component.py
+++ b/components/polylith/poetry/commands/create_component.py
@@ -1,7 +1,7 @@
from cleo.helpers import option
from poetry.console.commands.command import Command
from polylith.bricks import component
-from polylith.poetry.commands.create import create
+from polylith.commands.create import create
class CreateComponentCommand(Command):
@@ -20,6 +20,9 @@ class CreateComponentCommand(Command):
]
def handle(self) -> int:
- create(self, component.create_component)
+ name = self.option("name")
+ description = self.option("description")
+
+ create(name, description, component.create_component)
return 0
diff --git a/components/polylith/poetry/commands/create_project.py b/components/polylith/poetry/commands/create_project.py
index 1fb63e2f..4bfd1bb4 100644
--- a/components/polylith/poetry/commands/create_project.py
+++ b/components/polylith/poetry/commands/create_project.py
@@ -1,37 +1,18 @@
from pathlib import Path
-from typing import Union
from cleo.helpers import option
from poetry.console.commands.command import Command
from polylith import project
-from polylith.poetry.commands.create import create
+from polylith.commands.create import create
command_name = "poly create project"
-pyproject_template = """\
-[tool.poetry]
-name = "{name}"
-version = "0.1.0"
-description = "{description}"
-authors = {authors}
-license = ""
+def create_project(root: Path, options: dict):
+ package = options["package"]
+ desc = options["description"] or ""
-packages = []
-
-[tool.poetry.dependencies]
-python = "{python_version}"
-
-[tool.poetry.group.dev.dependencies]
-
-[build-system]
-requires = ["poetry-core>=1.0.0"]
-build-backend = "poetry.core.masonry.api"
-"""
-
-
-def create_project(root: Path, _ns: str, name: str, description: Union[str, None]):
- project.create_project(root, pyproject_template, name, description or "")
+ project.create_project(root, project.templates.poetry_pyproject, package, desc)
class CreateProjectCommand(Command):
@@ -50,6 +31,9 @@ class CreateProjectCommand(Command):
]
def handle(self) -> int:
- create(self, create_project)
+ name = self.option("name")
+ description = self.option("description")
+
+ create(name, description, create_project)
return 0
diff --git a/components/polylith/poetry/commands/diff.py b/components/polylith/poetry/commands/diff.py
index 833e542f..ec4ac0c5 100644
--- a/components/polylith/poetry/commands/diff.py
+++ b/components/polylith/poetry/commands/diff.py
@@ -1,9 +1,6 @@
-from pathlib import Path
-from typing import List, Set
-
from cleo.helpers import option
from poetry.console.commands.command import Command
-from polylith import diff, info, repo, workspace
+from polylith import commands
class DiffCommand(Command):
@@ -29,58 +26,11 @@ class DiffCommand(Command):
),
]
- def has_partial_options(self) -> bool:
- return any(self.option(k) for k in {"bricks"})
-
- def print_partial_views(
- self,
- affected_projects: Set[str],
- bases: List[str],
- components: List[str],
- ) -> None:
- short = self.option("short")
-
- if short and not self.has_partial_options():
- diff.report.print_projects_affected_by_changes(affected_projects, short)
-
- return
-
- if self.option("bricks"):
- diff.report.print_detected_changes_in_bricks(bases, components, short)
-
- def print_views(self, root: Path, tag: str) -> None:
- ns = workspace.parser.get_namespace_from_config(root)
- files = diff.collect.get_files(tag)
- bases = diff.collect.get_changed_bases(files, ns)
- components = diff.collect.get_changed_components(files, ns)
- projects = diff.collect.get_changed_projects(files)
- all_projects_data = info.get_bricks_in_projects(root, components, bases, ns)
- projects_data = [p for p in all_projects_data if info.is_project(p)]
-
- affected_projects = diff.collect.get_projects_affected_by_changes(
- projects_data, projects, bases, components
- )
-
- short = self.option("short")
-
- if not short and not self.has_partial_options():
- diff.report.print_diff_summary(tag, bases, components)
- diff.report.print_detected_changes_in_projects(projects, short)
- diff.report.print_diff_details(projects_data, bases, components)
-
- return
-
- self.print_partial_views(affected_projects, bases, components)
-
def handle(self) -> int:
- root = repo.get_workspace_root(Path.cwd())
-
- tag_name = self.option("since")
- tag = diff.collect.get_latest_tag(root, tag_name)
+ since = self.option("since")
+ short = True if self.option("short") else False
+ bricks = True if self.option("bricks") else False
- if not tag:
- self.line("No tags found in repository.")
- else:
- self.print_views(root, tag)
+ commands.diff.run(since, short, bricks)
return 0
diff --git a/components/polylith/poetry/commands/info.py b/components/polylith/poetry/commands/info.py
index 1853689b..b389f554 100644
--- a/components/polylith/poetry/commands/info.py
+++ b/components/polylith/poetry/commands/info.py
@@ -1,8 +1,6 @@
-from pathlib import Path
-
from cleo.helpers import option
from poetry.console.commands.command import Command
-from polylith import info, repo, workspace
+from polylith import commands
class InfoCommand(Command):
@@ -19,22 +17,8 @@ class InfoCommand(Command):
]
def handle(self) -> int:
- short = self.option("short")
-
- root = repo.get_workspace_root(Path.cwd())
- ns = workspace.parser.get_namespace_from_config(root)
- bases = info.get_bases(root, ns)
- components = info.get_components(root, ns)
- projects_data = info.get_bricks_in_projects(root, components, bases, ns)
-
- info.print_workspace_summary(projects_data, bases, components)
+ short = True if self.option("short") else False
- if components or bases:
- if short:
- info.print_compressed_view_for_bricks_in_projects(
- projects_data, bases, components
- )
- else:
- info.print_bricks_in_projects(projects_data, bases, components)
+ commands.info.run(short)
return 0
diff --git a/components/polylith/poetry/commands/libs.py b/components/polylith/poetry/commands/libs.py
index 9e73a84e..c9db0034 100644
--- a/components/polylith/poetry/commands/libs.py
+++ b/components/polylith/poetry/commands/libs.py
@@ -1,10 +1,9 @@
from pathlib import Path
from poetry.console.commands.command import Command
-from polylith import alias, info, project, repo, workspace
-from polylith.libs import report
+from polylith import commands, info, repo, workspace
from polylith.poetry.commands.check import command_options
-from polylith.poetry.internals import find_third_party_libs
+from polylith.poetry.internals import filter_projects_data, find_third_party_libs
class LibsCommand(Command):
@@ -14,49 +13,27 @@ class LibsCommand(Command):
options = command_options
def print_report(self, root: Path, ns: str, data: dict) -> bool:
- is_strict = self.option("strict")
-
name = data["name"]
path = data["path"]
- brick_imports = report.get_third_party_imports(root, ns, data)
-
- report.print_libs_summary(brick_imports, data)
- report.print_libs_in_bricks(brick_imports)
+ options = {"strict": self.option("strict"), "alias": self.option("alias")}
try:
third_party_libs = find_third_party_libs(self.poetry, path)
+ merged = {**data, **{"deps": third_party_libs}}
- library_aliases = alias.parse(self.option("alias"))
- extra = alias.pick(library_aliases, third_party_libs)
-
- libs = third_party_libs.union(extra)
-
- return report.print_missing_installed_libs(
- brick_imports,
- libs,
- name,
- is_strict,
- )
+ return commands.libs.run(root, ns, merged, options)
except ValueError as e:
self.line_error(f"{name}: {e}")
return False
def handle(self) -> int:
+ directory = self.option("directory")
root = repo.get_workspace_root(Path.cwd())
ns = workspace.parser.get_namespace_from_config(root)
- projects_data = info.get_projects_data(root, ns)
-
- if self.option("directory"):
- project_name = project.get_project_name(self.poetry.pyproject.data)
- data = next((p for p in projects_data if p["name"] == project_name), None)
-
- if not data:
- raise ValueError(f"Didn't find project in {self.option('directory')}")
-
- res = self.print_report(root, ns, data)
- return 0 if res else 1
+ all_projects_data = info.get_projects_data(root, ns)
+ projects_data = filter_projects_data(self.poetry, directory, all_projects_data)
results = {self.print_report(root, ns, data) for data in projects_data}
diff --git a/components/polylith/poetry/commands/sync.py b/components/polylith/poetry/commands/sync.py
index 0fe03545..e2c6c1c7 100644
--- a/components/polylith/poetry/commands/sync.py
+++ b/components/polylith/poetry/commands/sync.py
@@ -1,57 +1,25 @@
from pathlib import Path
-from typing import List
from poetry.console.commands.command import Command
-from polylith import info, project, repo, sync, workspace
+from polylith import commands, info, repo, workspace
+from polylith.poetry.internals import filter_projects_data
class SyncCommand(Command):
name = "poly sync"
description = "Update pyproject.toml with missing bricks."
- def filter_projects_data(self, all_projects_data: List[dict]) -> List[dict]:
- if self.option("directory"):
- project_name = project.get_project_name(self.poetry.pyproject.data)
-
- data = next(
- (p for p in all_projects_data if p["name"] == project_name), None
- )
-
- if not data:
- raise ValueError(f"Didn't find project in {self.option('directory')}")
-
- return [data]
-
- return all_projects_data
-
def handle(self) -> int:
- is_verbose = self.option("verbose")
- is_quiet = self.option("quiet")
-
+ directory = self.option("directory")
root = repo.get_workspace_root(Path.cwd())
ns = workspace.parser.get_namespace_from_config(root)
- bases = info.get_bases(root, ns)
- components = info.get_components(root, ns)
- workspace_data = {"bases": bases, "components": components}
-
- all_projects_data = info.get_bricks_in_projects(root, components, bases, ns)
- projects_data = self.filter_projects_data(all_projects_data)
-
- diffs = [
- sync.calculate_diff(root, ns, data, workspace_data)
- for data in projects_data
- ]
-
- for diff in diffs:
- sync.update_project(root, ns, diff)
-
- if is_quiet:
- continue
+ all_projects_data = info.get_projects_data(root, ns)
+ projects_data = filter_projects_data(self.poetry, directory, all_projects_data)
- sync.report.print_summary(diff)
+ options = {"verbose": self.option("verbose"), "quiet": self.option("quiet")}
- if is_verbose:
- sync.report.print_brick_imports(diff)
+ for data in projects_data:
+ commands.sync.run(root, ns, data, options)
return 0
diff --git a/components/polylith/poetry/internals.py b/components/polylith/poetry/internals.py
index 12bf3695..a1f75ed4 100644
--- a/components/polylith/poetry/internals.py
+++ b/components/polylith/poetry/internals.py
@@ -1,32 +1,10 @@
-from functools import reduce
from pathlib import Path
-from typing import Dict, Iterable, List, Set, Union
+from typing import Iterable, List, Set, Union
from poetry.factory import Factory
from poetry.poetry import Poetry
from poetry.utils.env import EnvManager
-
-
-def top_level_packages(dist) -> List[str]:
- top_level = dist.read_text("top_level.txt")
-
- return str.split(top_level or "")
-
-
-def mapped_packages(dist) -> dict:
- packages = top_level_packages(dist)
- name = dist.metadata["name"]
-
- return {name: packages} if packages else {}
-
-
-def map_packages(acc, dist) -> dict:
- return {**acc, **mapped_packages(dist)}
-
-
-def distributions_packages(dists) -> Dict[str, List[str]]:
- """Return a mapping of top-level packages to their distributions."""
- return reduce(map_packages, dists, {})
+from polylith import project
def get_project_poetry(poetry: Poetry, path: Union[Path, None]) -> Poetry:
@@ -50,3 +28,19 @@ def find_third_party_libs(poetry: Poetry, path: Union[Path, None]) -> Set:
packages = project_poetry.locker.locked_repository().packages
return {p.name for p in packages}
+
+
+def filter_projects_data(
+ poetry: Poetry, directory: Union[str, None], projects_data: List[dict]
+) -> List[dict]:
+ if not directory:
+ return projects_data
+
+ project_name = project.get_project_name(poetry.pyproject.data)
+
+ data = next((p for p in projects_data if p["name"] == project_name), None)
+
+ if not data:
+ raise ValueError(f"Didn't find project in {directory}")
+
+ return [data]
diff --git a/components/polylith/project/__init__.py b/components/polylith/project/__init__.py
index 1baa43cb..7040d729 100644
--- a/components/polylith/project/__init__.py
+++ b/components/polylith/project/__init__.py
@@ -1,11 +1,19 @@
+from polylith.project import templates
from polylith.project.create import create_project
-from polylith.project.get import get_packages_for_projects, get_project_name, get_toml
+from polylith.project.get import (
+ get_packages_for_projects,
+ get_project_dependencies,
+ get_project_name,
+ get_toml,
+)
from polylith.project.parser import parse_package_paths
__all__ = [
"create_project",
"get_packages_for_projects",
+ "get_project_dependencies",
"get_project_name",
"get_toml",
"parse_package_paths",
+ "templates",
]
diff --git a/components/polylith/project/get.py b/components/polylith/project/get.py
index 7e318cb4..2a48a8cf 100644
--- a/components/polylith/project/get.py
+++ b/components/polylith/project/get.py
@@ -1,5 +1,7 @@
+import re
+from functools import lru_cache
from pathlib import Path
-from typing import List
+from typing import List, Set
import tomlkit
from polylith import repo, workspace
@@ -12,11 +14,15 @@ def transform_to_package(namespace: str, include: str) -> dict:
def get_project_package_includes(namespace: str, data) -> List[dict]:
- if repo.is_pep_621_ready(data):
- includes = data["project"].get("includes", [])
- return [transform_to_package(namespace, include) for include in includes]
+ if repo.is_poetry(data):
+ return data["tool"]["poetry"].get("packages", [])
+
+ if repo.is_hatch(data):
+ includes = data["tool"]["hatch"].get("build", {}).get("force-include", {})
- return data["tool"]["poetry"].get("packages", [])
+ return [transform_to_package(namespace, key) for key in includes.keys()]
+
+ return []
def get_project_name(data) -> str:
@@ -26,6 +32,18 @@ def get_project_name(data) -> str:
return data["tool"]["poetry"]["name"]
+def get_project_dependencies(data) -> Set:
+ if repo.is_poetry(data):
+ deps = data["tool"]["poetry"].get("dependencies", [])
+
+ return set(deps.keys())
+ else:
+ deps = data["project"].get("dependencies", [])
+
+ return {re.split(r"[\^~=!<>]", dep)[0] for dep in deps}
+
+
+@lru_cache
def get_toml(path: Path) -> tomlkit.TOMLDocument:
with path.open(encoding="utf-8", errors="ignore") as f:
return tomlkit.loads(f.read())
@@ -64,6 +82,7 @@ def get_packages_for_projects(root: Path) -> List[dict]:
"packages": get_project_package_includes(namespace, d["toml"]),
"path": d["path"],
"type": d["type"],
+ "deps": get_project_dependencies(d["toml"]),
}
for d in tomls
]
diff --git a/components/polylith/project/templates.py b/components/polylith/project/templates.py
new file mode 100644
index 00000000..1dc5fa79
--- /dev/null
+++ b/components/polylith/project/templates.py
@@ -0,0 +1,37 @@
+poetry_pyproject = """\
+[tool.poetry]
+name = "{name}"
+version = "0.1.0"
+description = "{description}"
+authors = {authors}
+license = ""
+
+packages = []
+
+[tool.poetry.dependencies]
+python = "{python_version}"
+
+[tool.poetry.group.dev.dependencies]
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"
+"""
+
+hatch_pyproject = """\
+build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[project]
+name = {name}"
+version = "0.1.0"
+description = '{description}'
+authors = {authors}
+
+requires-python = "{python_version}"
+
+dependencies = []
+
+[tool.hatch.build.force-include]
+"""
diff --git a/components/polylith/readme/readme.py b/components/polylith/readme/readme.py
index 2c694690..773a873c 100644
--- a/components/polylith/readme/readme.py
+++ b/components/polylith/readme/readme.py
@@ -1,5 +1,4 @@
from pathlib import Path
-from typing import Union
from polylith import repo
@@ -35,11 +34,13 @@ def create_workspace_readme(path: Path, namespace: str) -> None:
create_readme(path, workspace_template, namespace=namespace)
-def create_brick_readme(
- path: Path, name: str, brick: str, description: Union[str, None]
-) -> None:
+def create_brick_readme(path: Path, options: dict) -> None:
+ brick = options["brick"]
+ package = options["package"]
+ description = options["description"]
+
b = "component" if brick in repo.components_dir else "base"
create_readme(
- path, brick_template, name=name, brick=b, description=description or ""
+ path, brick_template, name=package, brick=b, description=description or ""
)
diff --git a/components/polylith/repo/__init__.py b/components/polylith/repo/__init__.py
index 9831bcf6..fb9015c9 100644
--- a/components/polylith/repo/__init__.py
+++ b/components/polylith/repo/__init__.py
@@ -5,7 +5,9 @@
default_toml,
development_dir,
get_workspace_root,
+ is_hatch,
is_pep_621_ready,
+ is_poetry,
projects_dir,
readme_file,
workspace_file,
@@ -19,7 +21,9 @@
"default_toml",
"development_dir",
"get_workspace_root",
+ "is_hatch",
"is_pep_621_ready",
+ "is_poetry",
"projects_dir",
"readme_file",
"workspace_file",
diff --git a/components/polylith/repo/repo.py b/components/polylith/repo/repo.py
index fabfcd14..7c2ddc7c 100644
--- a/components/polylith/repo/repo.py
+++ b/components/polylith/repo/repo.py
@@ -57,8 +57,16 @@ def get_workspace_root(cwd: Path) -> Path:
return root
+def is_poetry(pyproject: dict) -> bool:
+ return pyproject.get("tool", {}).get("poetry") is not None
+
+
+def is_hatch(pyproject: dict) -> bool:
+ return pyproject.get("tool", {}).get("hatch") is not None
+
+
def is_pep_621_ready(pyproject: dict) -> bool:
- if pyproject.get("tool", {}).get("poetry") is not None:
+ if is_poetry(pyproject):
return False
return pyproject.get("project", {}).get("name") is not None
diff --git a/components/polylith/sync/update.py b/components/polylith/sync/update.py
index 39280d44..74e66e7e 100644
--- a/components/polylith/sync/update.py
+++ b/components/polylith/sync/update.py
@@ -1,5 +1,5 @@
from pathlib import Path
-from typing import List
+from typing import List, Union
import tomlkit
from polylith import project, repo, workspace
@@ -19,22 +19,23 @@ def copy_toml_data(data: TOMLDocument) -> dict:
return copy
-def generate_updated_pep_621_ready_project(
+def generate_updated_hatch_project(
data: TOMLDocument, packages: List[dict]
) -> str:
copy = copy_toml_data(data)
- if copy["project"].get("includes") is None:
- copy["project"].add("includes", [])
+ if copy["tool"]["hatch"].get("build") is None:
+ copy["tool"]["hatch"].add("build", {"force-include": {}})
+
+ if copy["tool"]["hatch"]["build"].get("force-include") is None:
+ copy["tool"]["hatch"]["build"]["force-include"] = {}
for package in packages:
brick = package["include"]
relative_path = package.get("from", "")
include = Path(relative_path, brick).as_posix()
- copy["project"]["includes"].append(include)
-
- copy["project"]["includes"].multiline(True)
+ copy["tool"]["hatch"]["build"]["force-include"][include] = brick
return tomlkit.dumps(copy)
@@ -53,11 +54,14 @@ def generate_updated_poetry_project(data: TOMLDocument, packages: List[dict]) ->
return tomlkit.dumps(copy)
-def generate_updated_project(data: TOMLDocument, packages: List[dict]) -> str:
- if repo.is_pep_621_ready(data):
- return generate_updated_pep_621_ready_project(data, packages)
+def generate_updated_project(data: TOMLDocument, packages: List[dict]) -> Union[str, None]:
+ if repo.is_poetry(data):
+ return generate_updated_poetry_project(data, packages)
- return generate_updated_poetry_project(data, packages)
+ if repo.is_hatch(data):
+ return generate_updated_hatch_project(data, packages)
+
+ return None
def to_packages(root: Path, namespace: str, diff: dict) -> List[dict]:
@@ -80,6 +84,9 @@ def rewrite_project_file(path: Path, packages: List[dict]):
generated = generate_updated_project(project_toml, packages)
+ if not generated:
+ return
+
with fullpath.open("w", encoding="utf-8") as f:
f.write(generated)
diff --git a/components/polylith/test/tests.py b/components/polylith/test/tests.py
index 17a40453..475fa46a 100644
--- a/components/polylith/test/tests.py
+++ b/components/polylith/test/tests.py
@@ -13,12 +13,15 @@ def test_sample():
"""
-def create_test(
- root: Path, brick: str, namespace: str, package: str, modulename: str = "core"
-) -> None:
+def create_test(root: Path, options: dict) -> None:
if not parser.is_test_generation_enabled(root):
return
+ brick = options["brick"]
+ namespace = options["namespace"]
+ package = options["package"]
+ modulename = options["modulename"]
+
dirs_structure = parser.get_tests_structure_from_config(root)
dirs = dirs_structure.format(brick=brick, namespace=namespace, package=package)
d = create_dir(root, dirs)
diff --git a/poetry.lock b/poetry.lock
index d6efcd8b..7743811d 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -2,36 +2,47 @@
[[package]]
name = "black"
-version = "22.12.0"
+version = "23.12.1"
description = "The uncompromising code formatter."
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"},
- {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"},
- {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"},
- {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"},
- {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"},
- {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"},
- {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"},
- {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"},
- {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"},
- {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"},
- {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"},
- {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"},
+ {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"},
+ {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"},
+ {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"},
+ {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"},
+ {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"},
+ {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"},
+ {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"},
+ {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"},
+ {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"},
+ {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"},
+ {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"},
+ {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"},
+ {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"},
+ {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"},
+ {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"},
+ {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"},
+ {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"},
+ {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"},
+ {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"},
+ {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"},
+ {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"},
+ {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"},
]
[package.dependencies]
click = ">=8.0.0"
mypy-extensions = ">=0.4.3"
+packaging = ">=22.0"
pathspec = ">=0.9.0"
platformdirs = ">=2"
-tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""}
-typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
+tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
+typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""}
[package.extras]
colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.7.4)"]
+d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"]
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
uvloop = ["uvloop (>=0.15.2)"]
@@ -294,73 +305,6 @@ files = [
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
-[[package]]
-name = "coverage"
-version = "7.3.4"
-description = "Code coverage measurement for Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "coverage-7.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aff2bd3d585969cc4486bfc69655e862028b689404563e6b549e6a8244f226df"},
- {file = "coverage-7.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4353923f38d752ecfbd3f1f20bf7a3546993ae5ecd7c07fd2f25d40b4e54571"},
- {file = "coverage-7.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea473c37872f0159294f7073f3fa72f68b03a129799f3533b2bb44d5e9fa4f82"},
- {file = "coverage-7.3.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5214362abf26e254d749fc0c18af4c57b532a4bfde1a057565616dd3b8d7cc94"},
- {file = "coverage-7.3.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f99b7d3f7a7adfa3d11e3a48d1a91bb65739555dd6a0d3fa68aa5852d962e5b1"},
- {file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:74397a1263275bea9d736572d4cf338efaade2de9ff759f9c26bcdceb383bb49"},
- {file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f154bd866318185ef5865ace5be3ac047b6d1cc0aeecf53bf83fe846f4384d5d"},
- {file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e0d84099ea7cba9ff467f9c6f747e3fc3906e2aadac1ce7b41add72e8d0a3712"},
- {file = "coverage-7.3.4-cp310-cp310-win32.whl", hash = "sha256:3f477fb8a56e0c603587b8278d9dbd32e54bcc2922d62405f65574bd76eba78a"},
- {file = "coverage-7.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:c75738ce13d257efbb6633a049fb2ed8e87e2e6c2e906c52d1093a4d08d67c6b"},
- {file = "coverage-7.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:997aa14b3e014339d8101b9886063c5d06238848905d9ad6c6eabe533440a9a7"},
- {file = "coverage-7.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a9c5bc5db3eb4cd55ecb8397d8e9b70247904f8eca718cc53c12dcc98e59fc8"},
- {file = "coverage-7.3.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27ee94f088397d1feea3cb524e4313ff0410ead7d968029ecc4bc5a7e1d34fbf"},
- {file = "coverage-7.3.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ce03e25e18dd9bf44723e83bc202114817f3367789052dc9e5b5c79f40cf59d"},
- {file = "coverage-7.3.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85072e99474d894e5df582faec04abe137b28972d5e466999bc64fc37f564a03"},
- {file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a877810ef918d0d345b783fc569608804f3ed2507bf32f14f652e4eaf5d8f8d0"},
- {file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9ac17b94ab4ca66cf803f2b22d47e392f0977f9da838bf71d1f0db6c32893cb9"},
- {file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:36d75ef2acab74dc948d0b537ef021306796da551e8ac8b467810911000af66a"},
- {file = "coverage-7.3.4-cp311-cp311-win32.whl", hash = "sha256:47ee56c2cd445ea35a8cc3ad5c8134cb9bece3a5cb50bb8265514208d0a65928"},
- {file = "coverage-7.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:11ab62d0ce5d9324915726f611f511a761efcca970bd49d876cf831b4de65be5"},
- {file = "coverage-7.3.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:33e63c578f4acce1b6cd292a66bc30164495010f1091d4b7529d014845cd9bee"},
- {file = "coverage-7.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:782693b817218169bfeb9b9ba7f4a9f242764e180ac9589b45112571f32a0ba6"},
- {file = "coverage-7.3.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c4277ddaad9293454da19121c59f2d850f16bcb27f71f89a5c4836906eb35ef"},
- {file = "coverage-7.3.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d892a19ae24b9801771a5a989fb3e850bd1ad2e2b6e83e949c65e8f37bc67a1"},
- {file = "coverage-7.3.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3024ec1b3a221bd10b5d87337d0373c2bcaf7afd86d42081afe39b3e1820323b"},
- {file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1c3e9d2bbd6f3f79cfecd6f20854f4dc0c6e0ec317df2b265266d0dc06535f1"},
- {file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e91029d7f151d8bf5ab7d8bfe2c3dbefd239759d642b211a677bc0709c9fdb96"},
- {file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6879fe41c60080aa4bb59703a526c54e0412b77e649a0d06a61782ecf0853ee1"},
- {file = "coverage-7.3.4-cp312-cp312-win32.whl", hash = "sha256:fd2f8a641f8f193968afdc8fd1697e602e199931012b574194052d132a79be13"},
- {file = "coverage-7.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:d1d0ce6c6947a3a4aa5479bebceff2c807b9f3b529b637e2b33dea4468d75fc7"},
- {file = "coverage-7.3.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:36797b3625d1da885b369bdaaa3b0d9fb8865caed3c2b8230afaa6005434aa2f"},
- {file = "coverage-7.3.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfed0ec4b419fbc807dec417c401499ea869436910e1ca524cfb4f81cf3f60e7"},
- {file = "coverage-7.3.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f97ff5a9fc2ca47f3383482858dd2cb8ddbf7514427eecf5aa5f7992d0571429"},
- {file = "coverage-7.3.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:607b6c6b35aa49defaebf4526729bd5238bc36fe3ef1a417d9839e1d96ee1e4c"},
- {file = "coverage-7.3.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8e258dcc335055ab59fe79f1dec217d9fb0cdace103d6b5c6df6b75915e7959"},
- {file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a02ac7c51819702b384fea5ee033a7c202f732a2a2f1fe6c41e3d4019828c8d3"},
- {file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b710869a15b8caf02e31d16487a931dbe78335462a122c8603bb9bd401ff6fb2"},
- {file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c6a23ae9348a7a92e7f750f9b7e828448e428e99c24616dec93a0720342f241d"},
- {file = "coverage-7.3.4-cp38-cp38-win32.whl", hash = "sha256:758ebaf74578b73f727acc4e8ab4b16ab6f22a5ffd7dd254e5946aba42a4ce76"},
- {file = "coverage-7.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:309ed6a559bc942b7cc721f2976326efbfe81fc2b8f601c722bff927328507dc"},
- {file = "coverage-7.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:aefbb29dc56317a4fcb2f3857d5bce9b881038ed7e5aa5d3bcab25bd23f57328"},
- {file = "coverage-7.3.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:183c16173a70caf92e2dfcfe7c7a576de6fa9edc4119b8e13f91db7ca33a7923"},
- {file = "coverage-7.3.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a4184dcbe4f98d86470273e758f1d24191ca095412e4335ff27b417291f5964"},
- {file = "coverage-7.3.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93698ac0995516ccdca55342599a1463ed2e2d8942316da31686d4d614597ef9"},
- {file = "coverage-7.3.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb220b3596358a86361139edce40d97da7458412d412e1e10c8e1970ee8c09ab"},
- {file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5b14abde6f8d969e6b9dd8c7a013d9a2b52af1235fe7bebef25ad5c8f47fa18"},
- {file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:610afaf929dc0e09a5eef6981edb6a57a46b7eceff151947b836d869d6d567c1"},
- {file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d6ed790728fb71e6b8247bd28e77e99d0c276dff952389b5388169b8ca7b1c28"},
- {file = "coverage-7.3.4-cp39-cp39-win32.whl", hash = "sha256:c15fdfb141fcf6a900e68bfa35689e1256a670db32b96e7a931cab4a0e1600e5"},
- {file = "coverage-7.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:38d0b307c4d99a7aca4e00cad4311b7c51b7ac38fb7dea2abe0d182dd4008e05"},
- {file = "coverage-7.3.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b1e0f25ae99cf247abfb3f0fac7ae25739e4cd96bf1afa3537827c576b4847e5"},
- {file = "coverage-7.3.4.tar.gz", hash = "sha256:020d56d2da5bc22a0e00a5b0d54597ee91ad72446fa4cf1b97c35022f6b6dbf0"},
-]
-
-[package.dependencies]
-tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""}
-
-[package.extras]
-toml = ["tomli"]
-
[[package]]
name = "crashtest"
version = "0.4.1"
@@ -531,13 +475,13 @@ test = ["pytest (>=6)"]
[[package]]
name = "fastjsonschema"
-version = "2.19.0"
+version = "2.19.1"
description = "Fastest Python implementation of JSON schema"
optional = false
python-versions = "*"
files = [
- {file = "fastjsonschema-2.19.0-py3-none-any.whl", hash = "sha256:b9fd1a2dd6971dbc7fee280a95bd199ae0dd9ce22beb91cc75e9c1c528a5170e"},
- {file = "fastjsonschema-2.19.0.tar.gz", hash = "sha256:e25df6647e1bc4a26070b700897b07b542ec898dd4f1f6ea013e7f6a88417225"},
+ {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"},
+ {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"},
]
[package.extras]
@@ -561,19 +505,19 @@ typing = ["typing-extensions (>=4.8)"]
[[package]]
name = "flake8"
-version = "5.0.4"
+version = "7.0.0"
description = "the modular source code checker: pep8 pyflakes and co"
optional = false
-python-versions = ">=3.6.1"
+python-versions = ">=3.8.1"
files = [
- {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"},
- {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"},
+ {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"},
+ {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"},
]
[package.dependencies]
mccabe = ">=0.7.0,<0.8.0"
-pycodestyle = ">=2.9.0,<2.10.0"
-pyflakes = ">=2.5.0,<2.6.0"
+pycodestyle = ">=2.11.0,<2.12.0"
+pyflakes = ">=3.2.0,<3.3.0"
[[package]]
name = "idna"
@@ -764,13 +708,13 @@ files = [
[[package]]
name = "more-itertools"
-version = "10.1.0"
+version = "10.2.0"
description = "More routines for operating on iterables, beyond itertools"
optional = false
python-versions = ">=3.8"
files = [
- {file = "more-itertools-10.1.0.tar.gz", hash = "sha256:626c369fa0eb37bac0291bce8259b332fd59ac792fa5497b59837309cd5b114a"},
- {file = "more_itertools-10.1.0-py3-none-any.whl", hash = "sha256:64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6"},
+ {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"},
+ {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"},
]
[[package]]
@@ -840,45 +784,49 @@ files = [
[[package]]
name = "mypy"
-version = "0.982"
+version = "1.8.0"
description = "Optional static typing for Python"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "mypy-0.982-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5085e6f442003fa915aeb0a46d4da58128da69325d8213b4b35cc7054090aed5"},
- {file = "mypy-0.982-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:41fd1cf9bc0e1c19b9af13a6580ccb66c381a5ee2cf63ee5ebab747a4badeba3"},
- {file = "mypy-0.982-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f793e3dd95e166b66d50e7b63e69e58e88643d80a3dcc3bcd81368e0478b089c"},
- {file = "mypy-0.982-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86ebe67adf4d021b28c3f547da6aa2cce660b57f0432617af2cca932d4d378a6"},
- {file = "mypy-0.982-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:175f292f649a3af7082fe36620369ffc4661a71005aa9f8297ea473df5772046"},
- {file = "mypy-0.982-cp310-cp310-win_amd64.whl", hash = "sha256:8ee8c2472e96beb1045e9081de8e92f295b89ac10c4109afdf3a23ad6e644f3e"},
- {file = "mypy-0.982-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58f27ebafe726a8e5ccb58d896451dd9a662a511a3188ff6a8a6a919142ecc20"},
- {file = "mypy-0.982-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6af646bd46f10d53834a8e8983e130e47d8ab2d4b7a97363e35b24e1d588947"},
- {file = "mypy-0.982-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7aeaa763c7ab86d5b66ff27f68493d672e44c8099af636d433a7f3fa5596d40"},
- {file = "mypy-0.982-cp37-cp37m-win_amd64.whl", hash = "sha256:724d36be56444f569c20a629d1d4ee0cb0ad666078d59bb84f8f887952511ca1"},
- {file = "mypy-0.982-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14d53cdd4cf93765aa747a7399f0961a365bcddf7855d9cef6306fa41de01c24"},
- {file = "mypy-0.982-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:26ae64555d480ad4b32a267d10cab7aec92ff44de35a7cd95b2b7cb8e64ebe3e"},
- {file = "mypy-0.982-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6389af3e204975d6658de4fb8ac16f58c14e1bacc6142fee86d1b5b26aa52bda"},
- {file = "mypy-0.982-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b35ce03a289480d6544aac85fa3674f493f323d80ea7226410ed065cd46f206"},
- {file = "mypy-0.982-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c6e564f035d25c99fd2b863e13049744d96bd1947e3d3d2f16f5828864506763"},
- {file = "mypy-0.982-cp38-cp38-win_amd64.whl", hash = "sha256:cebca7fd333f90b61b3ef7f217ff75ce2e287482206ef4a8b18f32b49927b1a2"},
- {file = "mypy-0.982-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a705a93670c8b74769496280d2fe6cd59961506c64f329bb179970ff1d24f9f8"},
- {file = "mypy-0.982-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:75838c649290d83a2b83a88288c1eb60fe7a05b36d46cbea9d22efc790002146"},
- {file = "mypy-0.982-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:91781eff1f3f2607519c8b0e8518aad8498af1419e8442d5d0afb108059881fc"},
- {file = "mypy-0.982-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa97b9ddd1dd9901a22a879491dbb951b5dec75c3b90032e2baa7336777363b"},
- {file = "mypy-0.982-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a692a8e7d07abe5f4b2dd32d731812a0175626a90a223d4b58f10f458747dd8a"},
- {file = "mypy-0.982-cp39-cp39-win_amd64.whl", hash = "sha256:eb7a068e503be3543c4bd329c994103874fa543c1727ba5288393c21d912d795"},
- {file = "mypy-0.982-py3-none-any.whl", hash = "sha256:1021c241e8b6e1ca5a47e4d52601274ac078a89845cfde66c6d5f769819ffa1d"},
- {file = "mypy-0.982.tar.gz", hash = "sha256:85f7a343542dc8b1ed0a888cdd34dca56462654ef23aa673907305b260b3d746"},
+ {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"},
+ {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"},
+ {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"},
+ {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"},
+ {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"},
+ {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"},
+ {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"},
+ {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"},
+ {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"},
+ {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"},
+ {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"},
+ {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"},
+ {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"},
+ {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"},
+ {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"},
+ {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"},
+ {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"},
+ {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"},
+ {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"},
+ {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"},
+ {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"},
+ {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"},
+ {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"},
+ {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"},
+ {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"},
+ {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"},
+ {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"},
]
[package.dependencies]
-mypy-extensions = ">=0.4.3"
+mypy-extensions = ">=1.0.0"
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
-typing-extensions = ">=3.10"
+typing-extensions = ">=4.1.0"
[package.extras]
dmypy = ["psutil (>=4.0)"]
-python2 = ["typed-ast (>=1.4.0,<2)"]
+install-types = ["pip"]
+mypyc = ["setuptools (>=50)"]
reports = ["lxml"]
[[package]]
@@ -1048,13 +996,13 @@ files = [
[[package]]
name = "pycodestyle"
-version = "2.9.1"
+version = "2.11.1"
description = "Python style guide checker"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8"
files = [
- {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"},
- {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"},
+ {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"},
+ {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"},
]
[[package]]
@@ -1070,13 +1018,13 @@ files = [
[[package]]
name = "pyflakes"
-version = "2.5.0"
+version = "3.2.0"
description = "passive checker of Python programs"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8"
files = [
- {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"},
- {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"},
+ {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"},
+ {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"},
]
[[package]]
@@ -1110,13 +1058,13 @@ tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
[[package]]
name = "pytest"
-version = "7.4.3"
+version = "7.4.4"
description = "pytest: simple powerful testing with Python"
optional = false
python-versions = ">=3.7"
files = [
- {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"},
- {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"},
+ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"},
+ {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"},
]
[package.dependencies]
@@ -1130,24 +1078,6 @@ tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
[package.extras]
testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
-[[package]]
-name = "pytest-cov"
-version = "4.1.0"
-description = "Pytest plugin for measuring coverage."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"},
- {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"},
-]
-
-[package.dependencies]
-coverage = {version = ">=5.2.1", extras = ["toml"]}
-pytest = ">=4.6"
-
-[package.extras]
-testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"]
-
[[package]]
name = "pywin32-ctypes"
version = "0.2.2"
@@ -1161,101 +1091,101 @@ files = [
[[package]]
name = "rapidfuzz"
-version = "3.5.2"
+version = "3.6.1"
description = "rapid fuzzy string matching"
optional = false
python-versions = ">=3.8"
files = [
- {file = "rapidfuzz-3.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1a047d6e58833919d742bbc0dfa66d1de4f79e8562ee195007d3eae96635df39"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22877c027c492b7dc7e3387a576a33ed5aad891104aa90da2e0844c83c5493ef"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e0f448b0eacbcc416feb634e1232a48d1cbde5e60f269c84e4fb0912f7bbb001"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05146497672f869baf41147d5ec1222788c70e5b8b0cfcd6e95597c75b5b96b"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f2df3968738a38d2a0058b5e721753f5d3d602346a1027b0dde31b0476418f3"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5afc1fcf1830f9bb87d3b490ba03691081b9948a794ea851befd2643069a30c1"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84be69ea65f64fa01e5c4976be9826a5aa949f037508887add42da07420d65d6"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8658c1045766e87e0038323aa38b4a9f49b7f366563271f973c8890a98aa24b5"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:852b3f93c15fce58b8dc668bd54123713bfdbbb0796ba905ea5df99cfd083132"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:12424a06ad9bd0cbf5f7cea1015e78d924a0034a0e75a5a7b39c0703dcd94095"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b4e9ded8e80530bd7205a7a2b01802f934a4695ca9e9fbe1ce9644f5e0697864"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:affb8fe36157c2dc8a7bc45b6a1875eb03e2c49167a1d52789144bdcb7ab3b8c"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1d33a622572d384f4c90b5f7a139328246ab5600141e90032b521c2127bd605"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-win32.whl", hash = "sha256:2cf9f2ed4a97b388cffd48d534452a564c2491f68f4fd5bc140306f774ceb63a"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:6541ffb70097885f7302cd73e2efd77be99841103023c2f9408551f27f45f7a5"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-win_arm64.whl", hash = "sha256:1dd2542e5103fb8ca46500a979ae14d1609dcba11d2f9fe01e99eec03420e193"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bff7d3127ebc5cd908f3a72f6517f31f5247b84666137556a8fcc5177c560939"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fdfdb3685b631d8efbb6d6d3d86eb631be2b408d9adafcadc11e63e3f9c96dec"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97b043fe8185ec53bb3ff0e59deb89425c0fc6ece6e118939963aab473505801"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a4a7832737f87583f3863dc62e6f56dd4a9fefc5f04a7bdcb4c433a0f36bb1b"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d876dba9a11fcf60dcf1562c5a84ef559db14c2ceb41e1ad2d93cd1dc085889"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa4c0612893716bbb6595066ca9ecb517c982355abe39ba9d1f4ab834ace91ad"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:120316824333e376b88b284724cfd394c6ccfcb9818519eab5d58a502e5533f0"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cdbe8e80cc186d55f748a34393533a052d855357d5398a1ccb71a5021b58e8d"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1062425c8358a547ae5ebad148f2e0f02417716a571b803b0c68e4d552e99d32"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:66be181965aff13301dd5f9b94b646ce39d99c7fe2fd5de1656f4ca7fafcb38c"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:53df7aea3cf301633cfa2b4b2c2d2441a87dfc878ef810e5b4eddcd3e68723ad"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:76639dca5eb0afc6424ac5f42d43d3bd342ac710e06f38a8c877d5b96de09589"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:27689361c747b5f7b8a26056bc60979875323f1c3dcaaa9e2fec88f03b20a365"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-win32.whl", hash = "sha256:99c9fc5265566fb94731dc6826f43c5109e797078264e6389a36d47814473692"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:666928ee735562a909d81bd2f63207b3214afd4ca41f790ab3025d066975c814"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-win_arm64.whl", hash = "sha256:d55de67c48f06b7772541e8d4c062a2679205799ce904236e2836cb04c106442"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:04e1e02b182283c43c866e215317735e91d22f5d34e65400121c04d5ed7ed859"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:365e544aba3ac13acf1a62cb2e5909ad2ba078d0bfc7d69b1f801dfd673b9782"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b61f77d834f94b0099fa9ed35c189b7829759d4e9c2743697a130dd7ba62259f"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43fb368998b9703fa8c63db292a8ab9e988bf6da0c8a635754be8e69da1e7c1d"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25510b5d142c47786dbd27cfd9da7cae5bdea28d458379377a3644d8460a3404"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf3093443751e5a419834162af358d1e31dec75f84747a91dbbc47b2c04fc085"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2fbaf546f15a924613f89d609ff66b85b4f4c2307ac14d93b80fe1025b713138"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32d580df0e130ed85400ff77e1c32d965e9bc7be29ac4072ab637f57e26d29fb"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:358a0fbc49343de20fee8ebdb33c7fa8f55a9ff93ff42d1ffe097d2caa248f1b"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fb379ac0ddfc86c5542a225d194f76ed468b071b6f79ff57c4b72e635605ad7d"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7fb21e182dc6d83617e88dea002963d5cf99cf5eabbdbf04094f503d8fe8d723"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:c04f9f1310ce414ab00bdcbf26d0906755094bfc59402cb66a7722c6f06d70b2"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f6da61cc38c1a95efc5edcedf258759e6dbab73191651a28c5719587f32a56ad"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-win32.whl", hash = "sha256:f823fd1977071486739f484e27092765d693da6beedaceece54edce1dfeec9b2"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:a8162d81486de85ab1606e48e076431b66d44cf431b2b678e9cae458832e7147"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:dfc63fabb7d8da8483ca836bae7e55766fe39c63253571e103c034ba8ea80950"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:df8fae2515a1e4936affccac3e7d506dd904de5ff82bc0b1433b4574a51b9bfb"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dd6384780c2a16097d47588844cd677316a90e0f41ef96ff485b62d58de79dcf"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:467a4d730ae3bade87dba6bd769e837ab97e176968ce20591fe8f7bf819115b1"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54576669c1502b751b534bd76a4aeaaf838ed88b30af5d5c1b7d0a3ca5d4f7b5"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abafeb82f85a651a9d6d642a33dc021606bc459c33e250925b25d6b9e7105a2e"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73e14617a520c0f1bc15eb78c215383477e5ca70922ecaff1d29c63c060e04ca"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7cdf92116e9dfe40da17f921cdbfa0039dde9eb158914fa5f01b1e67a20b19cb"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1962d5ccf8602589dbf8e85246a0ee2b4050d82fade1568fb76f8a4419257704"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:db45028eae2fda7a24759c69ebeb2a7fbcc1a326606556448ed43ee480237a3c"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b685abb8b6d97989f6c69556d7934e0e533aa8822f50b9517ff2da06a1d29f23"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:40139552961018216b8cd88f6df4ecbbe984f907a62a5c823ccd907132c29a14"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0fef4705459842ef8f79746d6f6a0b5d2b6a61a145d7d8bbe10b2e756ea337c8"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6b2ad5516f7068c7d9cbcda8ac5906c589e99bc427df2e1050282ee2d8bc2d58"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-win32.whl", hash = "sha256:2da3a24c2f7dfca7f26ba04966b848e3bbeb93e54d899908ff88dfe3e1def9dc"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:e3f2be79d4114d01f383096dbee51b57df141cb8b209c19d0cf65f23a24e75ba"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:089a7e96e5032821af5964d8457fcb38877cc321cdd06ad7c5d6e3d852264cb9"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:75d8a52bf8d1aa2ac968ae4b21b83b94fc7e5ea3dfbab34811fc60f32df505b2"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2bacce6bbc0362f0789253424269cc742b1f45e982430387db3abe1d0496e371"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5fd627e604ddc02db2ddb9ddc4a91dd92b7a6d6378fcf30bb37b49229072b89"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2e8b369f23f00678f6e673572209a5d3b0832f4991888e3df97af7b8b9decf3"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c29958265e4c2b937269e804b8a160c027ee1c2627d6152655008a8b8083630e"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00be97f9219355945c46f37ac9fa447046e6f7930f7c901e5d881120d1695458"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0d8d57e0f556ef38c24fee71bfe8d0db29c678bff2acd1819fc1b74f331c2"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de89585268ed8ee44e80126814cae63ff6b00d08416481f31b784570ef07ec59"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:908ff2de9c442b379143d1da3c886c63119d4eba22986806e2533cee603fe64b"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:54f0061028723c026020f5bb20649c22bc8a0d9f5363c283bdc5901d4d3bff01"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b581107ec0c610cdea48b25f52030770be390db4a9a73ca58b8d70fa8a5ec32e"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1d5a686ea258931aaa38019204bdc670bbe14b389a230b1363d84d6cf4b9dc38"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-win32.whl", hash = "sha256:97f811ca7709c6ee8c0b55830f63b3d87086f4abbcbb189b4067e1cd7014db7b"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:58ee34350f8c292dd24a050186c0e18301d80da904ef572cf5fda7be6a954929"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-win_arm64.whl", hash = "sha256:c5075ce7b9286624cafcf36720ef1cfb2946d75430b87cb4d1f006e82cd71244"},
- {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af5221e4f7800db3e84c46b79dba4112e3b3cc2678f808bdff4fcd2487073846"},
- {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8501d7875b176930e6ed9dbc1bc35adb37ef312f6106bd6bb5c204adb90160ac"},
- {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e414e1ca40386deda4291aa2d45062fea0fbaa14f95015738f8bb75c4d27f862"},
- {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2059cd73b7ea779a9307d7a78ed743f0e3d33b88ccdcd84569abd2953cd859f"},
- {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:58e3e21f6f13a7cca265cce492bc797425bd4cb2025fdd161a9e86a824ad65ce"},
- {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b847a49377e64e92e11ef3d0a793de75451526c83af015bdafdd5d04de8a058a"},
- {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a42c7a8c62b29c4810e39da22b42524295fcb793f41c395c2cb07c126b729e83"},
- {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51b5166be86e09e011e92d9862b1fe64c4c7b9385f443fb535024e646d890460"},
- {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f808dcb0088a7a496cc9895e66a7b8de55ffea0eb9b547c75dfb216dd5f76ed"},
- {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d4b05a8f4ab7e7344459394094587b033fe259eea3a8720035e8ba30e79ab39b"},
- {file = "rapidfuzz-3.5.2.tar.gz", hash = "sha256:9e9b395743e12c36a3167a3a9fd1b4e11d92fb0aa21ec98017ee6df639ed385e"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ac434fc71edda30d45db4a92ba5e7a42c7405e1a54cb4ec01d03cc668c6dcd40"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2a791168e119cfddf4b5a40470620c872812042f0621e6a293983a2d52372db0"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a2f3e9df346145c2be94e4d9eeffb82fab0cbfee85bd4a06810e834fe7c03fa"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23de71e7f05518b0bbeef55d67b5dbce3bcd3e2c81e7e533051a2e9401354eb0"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d056e342989248d2bdd67f1955bb7c3b0ecfa239d8f67a8dfe6477b30872c607"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01835d02acd5d95c1071e1da1bb27fe213c84a013b899aba96380ca9962364bc"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed0f712e0bb5fea327e92aec8a937afd07ba8de4c529735d82e4c4124c10d5a0"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96cd19934f76a1264e8ecfed9d9f5291fde04ecb667faef5f33bdbfd95fe2d1f"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e06c4242a1354cf9d48ee01f6f4e6e19c511d50bb1e8d7d20bcadbb83a2aea90"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d73dcfe789d37c6c8b108bf1e203e027714a239e50ad55572ced3c004424ed3b"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:06e98ff000e2619e7cfe552d086815671ed09b6899408c2c1b5103658261f6f3"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:08b6fb47dd889c69fbc0b915d782aaed43e025df6979b6b7f92084ba55edd526"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a1788ebb5f5b655a15777e654ea433d198f593230277e74d51a2a1e29a986283"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c65f92881753aa1098c77818e2b04a95048f30edbe9c3094dc3707d67df4598b"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:4243a9c35667a349788461aae6471efde8d8800175b7db5148a6ab929628047f"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-win_arm64.whl", hash = "sha256:f59d19078cc332dbdf3b7b210852ba1f5db8c0a2cd8cc4c0ed84cc00c76e6802"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fbc07e2e4ac696497c5f66ec35c21ddab3fc7a406640bffed64c26ab2f7ce6d6"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40cced1a8852652813f30fb5d4b8f9b237112a0bbaeebb0f4cc3611502556764"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82300e5f8945d601c2daaaac139d5524d7c1fdf719aa799a9439927739917460"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf97c321fd641fea2793abce0e48fa4f91f3c202092672f8b5b4e781960b891"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7420e801b00dee4a344ae2ee10e837d603461eb180e41d063699fb7efe08faf0"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:060bd7277dc794279fa95522af355034a29c90b42adcb7aa1da358fc839cdb11"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7e3375e4f2bfec77f907680328e4cd16cc64e137c84b1886d547ab340ba6928"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a490cd645ef9d8524090551016f05f052e416c8adb2d8b85d35c9baa9d0428ab"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2e03038bfa66d2d7cffa05d81c2f18fd6acbb25e7e3c068d52bb7469e07ff382"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b19795b26b979c845dba407fe79d66975d520947b74a8ab6cee1d22686f7967"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:064c1d66c40b3a0f488db1f319a6e75616b2e5fe5430a59f93a9a5e40a656d15"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3c772d04fb0ebeece3109d91f6122b1503023086a9591a0b63d6ee7326bd73d9"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:841eafba6913c4dfd53045835545ba01a41e9644e60920c65b89c8f7e60c00a9"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-win32.whl", hash = "sha256:266dd630f12696ea7119f31d8b8e4959ef45ee2cbedae54417d71ae6f47b9848"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:d79aec8aeee02ab55d0ddb33cea3ecd7b69813a48e423c966a26d7aab025cdfe"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-win_arm64.whl", hash = "sha256:484759b5dbc5559e76fefaa9170147d1254468f555fd9649aea3bad46162a88b"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b2ef4c0fd3256e357b70591ffb9e8ed1d439fb1f481ba03016e751a55261d7c1"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:588c4b20fa2fae79d60a4e438cf7133d6773915df3cc0a7f1351da19eb90f720"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7142ee354e9c06e29a2636b9bbcb592bb00600a88f02aa5e70e4f230347b373e"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dfc557c0454ad22382373ec1b7df530b4bbd974335efe97a04caec936f2956a"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03f73b381bdeccb331a12c3c60f1e41943931461cdb52987f2ecf46bfc22f50d"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b0ccc2ec1781c7e5370d96aef0573dd1f97335343e4982bdb3a44c133e27786"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da3e8c9f7e64bb17faefda085ff6862ecb3ad8b79b0f618a6cf4452028aa2222"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fde9b14302a31af7bdafbf5cfbb100201ba21519be2b9dedcf4f1048e4fbe65d"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1a23eee225dfb21c07f25c9fcf23eb055d0056b48e740fe241cbb4b22284379"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e49b9575d16c56c696bc7b06a06bf0c3d4ef01e89137b3ddd4e2ce709af9fe06"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:0a9fc714b8c290261669f22808913aad49553b686115ad0ee999d1cb3df0cd66"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a3ee4f8f076aa92184e80308fc1a079ac356b99c39408fa422bbd00145be9854"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f056ba42fd2f32e06b2c2ba2443594873cfccc0c90c8b6327904fc2ddf6d5799"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-win32.whl", hash = "sha256:5d82b9651e3d34b23e4e8e201ecd3477c2baa17b638979deeabbb585bcb8ba74"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:dad55a514868dae4543ca48c4e1fc0fac704ead038dafedf8f1fc0cc263746c1"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-win_arm64.whl", hash = "sha256:3c84294f4470fcabd7830795d754d808133329e0a81d62fcc2e65886164be83b"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e19d519386e9db4a5335a4b29f25b8183a1c3f78cecb4c9c3112e7f86470e37f"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01eb03cd880a294d1bf1a583fdd00b87169b9cc9c9f52587411506658c864d73"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:be368573255f8fbb0125a78330a1a40c65e9ba3c5ad129a426ff4289099bfb41"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e5af946f419c30f5cb98b69d40997fe8580efe78fc83c2f0f25b60d0e56efb"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f382f7ffe384ce34345e1c0b2065451267d3453cadde78946fbd99a59f0cc23c"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be156f51f3a4f369e758505ed4ae64ea88900dcb2f89d5aabb5752676d3f3d7e"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1936d134b6c513fbe934aeb668b0fee1ffd4729a3c9d8d373f3e404fbb0ce8a0"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ff8eaf4a9399eb2bebd838f16e2d1ded0955230283b07376d68947bbc2d33d"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae598a172e3a95df3383634589660d6b170cc1336fe7578115c584a99e0ba64d"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cd4ba4c18b149da11e7f1b3584813159f189dc20833709de5f3df8b1342a9759"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:0402f1629e91a4b2e4aee68043a30191e5e1b7cd2aa8dacf50b1a1bcf6b7d3ab"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:1e12319c6b304cd4c32d5db00b7a1e36bdc66179c44c5707f6faa5a889a317c0"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0bbfae35ce4de4c574b386c43c78a0be176eeddfdae148cb2136f4605bebab89"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-win32.whl", hash = "sha256:7fec74c234d3097612ea80f2a80c60720eec34947066d33d34dc07a3092e8105"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:a553cc1a80d97459d587529cc43a4c7c5ecf835f572b671107692fe9eddf3e24"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:757dfd7392ec6346bd004f8826afb3bf01d18a723c97cbe9958c733ab1a51791"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2963f4a3f763870a16ee076796be31a4a0958fbae133dbc43fc55c3968564cf5"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2f0274595cc5b2b929c80d4e71b35041104b577e118cf789b3fe0a77b37a4c5"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f211e366e026de110a4246801d43a907cd1a10948082f47e8a4e6da76fef52"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a59472b43879012b90989603aa5a6937a869a72723b1bf2ff1a0d1edee2cc8e6"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a03863714fa6936f90caa7b4b50ea59ea32bb498cc91f74dc25485b3f8fccfe9"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd95b6b7bfb1584f806db89e1e0c8dbb9d25a30a4683880c195cc7f197eaf0c"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7183157edf0c982c0b8592686535c8b3e107f13904b36d85219c77be5cefd0d8"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ad9d74ef7c619b5b0577e909582a1928d93e07d271af18ba43e428dc3512c2a1"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b53137d81e770c82189e07a8f32722d9e4260f13a0aec9914029206ead38cac3"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:49b9ed2472394d306d5dc967a7de48b0aab599016aa4477127b20c2ed982dbf9"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:dec307b57ec2d5054d77d03ee4f654afcd2c18aee00c48014cb70bfed79597d6"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4381023fa1ff32fd5076f5d8321249a9aa62128eb3f21d7ee6a55373e672b261"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-win32.whl", hash = "sha256:8d7a072f10ee57c8413c8ab9593086d42aaff6ee65df4aa6663eecdb7c398dca"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:ebcfb5bfd0a733514352cfc94224faad8791e576a80ffe2fd40b2177bf0e7198"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-win_arm64.whl", hash = "sha256:1c47d592e447738744905c18dda47ed155620204714e6df20eb1941bb1ba315e"},
+ {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:eef8b346ab331bec12bbc83ac75641249e6167fab3d84d8f5ca37fd8e6c7a08c"},
+ {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53251e256017e2b87f7000aee0353ba42392c442ae0bafd0f6b948593d3f68c6"},
+ {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dede83a6b903e3ebcd7e8137e7ff46907ce9316e9d7e7f917d7e7cdc570ee05"},
+ {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4da90e4c2b444d0a171d7444ea10152e07e95972bb40b834a13bdd6de1110c"},
+ {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ca3dfcf74f2b6962f411c33dd95b0adf3901266e770da6281bc96bb5a8b20de9"},
+ {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bcc957c0a8bde8007f1a8a413a632a1a409890f31f73fe764ef4eac55f59ca87"},
+ {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:692c9a50bea7a8537442834f9bc6b7d29d8729a5b6379df17c31b6ab4df948c2"},
+ {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c23ceaea27e790ddd35ef88b84cf9d721806ca366199a76fd47cfc0457a81b"},
+ {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b155e67fff215c09f130555002e42f7517d0ea72cbd58050abb83cb7c880cec"},
+ {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3028ee8ecc48250607fa8a0adce37b56275ec3b1acaccd84aee1f68487c8557b"},
+ {file = "rapidfuzz-3.6.1.tar.gz", hash = "sha256:35660bee3ce1204872574fa041c7ad7ec5175b3053a4cb6e181463fc07013de7"},
]
[package.extras]
@@ -1365,15 +1295,39 @@ files = [
[[package]]
name = "trove-classifiers"
-version = "2023.11.29"
+version = "2024.1.8"
description = "Canonical source for classifiers on PyPI (pypi.org)."
optional = false
python-versions = "*"
files = [
- {file = "trove-classifiers-2023.11.29.tar.gz", hash = "sha256:ff8f7fd82c7932113b46e7ef6742c70091cc63640c8c65db00d91f2e940b9514"},
- {file = "trove_classifiers-2023.11.29-py3-none-any.whl", hash = "sha256:02307750cbbac2b3d13078662f8a5bf077732bf506e9c33c97204b7f68f3699e"},
+ {file = "trove-classifiers-2024.1.8.tar.gz", hash = "sha256:6e36caf430ff6485c4b57a4c6b364a13f6a898d16b9417c6c37467e59c14b05a"},
+ {file = "trove_classifiers-2024.1.8-py3-none-any.whl", hash = "sha256:3c1ff4deb10149c7e39ede6e5bbc107def64362ef1ee7590ec98d71fb92f1b6a"},
]
+[[package]]
+name = "typer"
+version = "0.9.0"
+description = "Typer, build great CLIs. Easy to code. Based on Python type hints."
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"},
+ {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"},
+]
+
+[package.dependencies]
+click = ">=7.1.1,<9.0.0"
+colorama = {version = ">=0.4.3,<0.5.0", optional = true, markers = "extra == \"all\""}
+rich = {version = ">=10.11.0,<14.0.0", optional = true, markers = "extra == \"all\""}
+shellingham = {version = ">=1.3.0,<2.0.0", optional = true, markers = "extra == \"all\""}
+typing-extensions = ">=3.7.4.3"
+
+[package.extras]
+all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"]
+dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"]
+doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"]
+test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"]
+
[[package]]
name = "typing-extensions"
version = "4.9.0"
@@ -1522,5 +1476,5 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p
[metadata]
lock-version = "2.0"
-python-versions = "^3.8"
-content-hash = "d21d0e7aff60023ba11cadf8b69c3bac737172698fb18529ca2b6fc2d96a35c0"
+python-versions = "^3.8.1"
+content-hash = "de65e90775c58e5e930efa83146526a3879827f46296afad0d4031081992315a"
diff --git a/projects/poetry_polylith_plugin/poetry.lock b/projects/poetry_polylith_plugin/poetry.lock
index adbf44ca..7689da64 100644
--- a/projects/poetry_polylith_plugin/poetry.lock
+++ b/projects/poetry_polylith_plugin/poetry.lock
@@ -1,40 +1,5 @@
# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
-[[package]]
-name = "black"
-version = "22.12.0"
-description = "The uncompromising code formatter."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"},
- {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"},
- {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"},
- {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"},
- {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"},
- {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"},
- {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"},
- {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"},
- {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"},
- {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"},
- {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"},
- {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"},
-]
-
-[package.dependencies]
-click = ">=8.0.0"
-mypy-extensions = ">=0.4.3"
-pathspec = ">=0.9.0"
-platformdirs = ">=2"
-tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""}
-typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}
-
-[package.extras]
-colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.7.4)"]
-jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
-uvloop = ["uvloop (>=0.15.2)"]
-
[[package]]
name = "build"
version = "1.0.3"
@@ -269,20 +234,6 @@ files = [
crashtest = ">=0.4.1,<0.5.0"
rapidfuzz = ">=3.0.0,<4.0.0"
-[[package]]
-name = "click"
-version = "8.1.7"
-description = "Composable command line interface toolkit"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
- {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-
[[package]]
name = "colorama"
version = "0.4.6"
@@ -450,13 +401,13 @@ pgp = ["gpg"]
[[package]]
name = "fastjsonschema"
-version = "2.19.0"
+version = "2.19.1"
description = "Fastest Python implementation of JSON schema"
optional = false
python-versions = "*"
files = [
- {file = "fastjsonschema-2.19.0-py3-none-any.whl", hash = "sha256:b9fd1a2dd6971dbc7fee280a95bd199ae0dd9ce22beb91cc75e9c1c528a5170e"},
- {file = "fastjsonschema-2.19.0.tar.gz", hash = "sha256:e25df6647e1bc4a26070b700897b07b542ec898dd4f1f6ea013e7f6a88417225"},
+ {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"},
+ {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"},
]
[package.extras]
@@ -478,22 +429,6 @@ docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1
testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"]
typing = ["typing-extensions (>=4.8)"]
-[[package]]
-name = "flake8"
-version = "5.0.4"
-description = "the modular source code checker: pep8 pyflakes and co"
-optional = false
-python-versions = ">=3.6.1"
-files = [
- {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"},
- {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"},
-]
-
-[package.dependencies]
-mccabe = ">=0.7.0,<0.8.0"
-pycodestyle = ">=2.9.0,<2.10.0"
-pyflakes = ">=2.5.0,<2.6.0"
-
[[package]]
name = "idna"
version = "3.6"
@@ -553,20 +488,6 @@ files = [
{file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"},
]
-[[package]]
-name = "isort"
-version = "5.13.2"
-description = "A Python utility / library to sort Python imports."
-optional = false
-python-versions = ">=3.8.0"
-files = [
- {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"},
- {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"},
-]
-
-[package.extras]
-colors = ["colorama (>=0.4.6)"]
-
[[package]]
name = "jaraco-classes"
version = "3.3.0"
@@ -648,17 +569,6 @@ profiling = ["gprof2dot"]
rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"]
testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
-[[package]]
-name = "mccabe"
-version = "0.7.0"
-description = "McCabe checker, plugin for flake8"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"},
- {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
-]
-
[[package]]
name = "mdurl"
version = "0.1.2"
@@ -672,13 +582,13 @@ files = [
[[package]]
name = "more-itertools"
-version = "10.1.0"
+version = "10.2.0"
description = "More routines for operating on iterables, beyond itertools"
optional = false
python-versions = ">=3.8"
files = [
- {file = "more-itertools-10.1.0.tar.gz", hash = "sha256:626c369fa0eb37bac0291bce8259b332fd59ac792fa5497b59837309cd5b114a"},
- {file = "more_itertools-10.1.0-py3-none-any.whl", hash = "sha256:64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6"},
+ {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"},
+ {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"},
]
[[package]]
@@ -746,60 +656,6 @@ files = [
{file = "msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87"},
]
-[[package]]
-name = "mypy"
-version = "0.982"
-description = "Optional static typing for Python"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "mypy-0.982-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5085e6f442003fa915aeb0a46d4da58128da69325d8213b4b35cc7054090aed5"},
- {file = "mypy-0.982-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:41fd1cf9bc0e1c19b9af13a6580ccb66c381a5ee2cf63ee5ebab747a4badeba3"},
- {file = "mypy-0.982-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f793e3dd95e166b66d50e7b63e69e58e88643d80a3dcc3bcd81368e0478b089c"},
- {file = "mypy-0.982-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86ebe67adf4d021b28c3f547da6aa2cce660b57f0432617af2cca932d4d378a6"},
- {file = "mypy-0.982-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:175f292f649a3af7082fe36620369ffc4661a71005aa9f8297ea473df5772046"},
- {file = "mypy-0.982-cp310-cp310-win_amd64.whl", hash = "sha256:8ee8c2472e96beb1045e9081de8e92f295b89ac10c4109afdf3a23ad6e644f3e"},
- {file = "mypy-0.982-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58f27ebafe726a8e5ccb58d896451dd9a662a511a3188ff6a8a6a919142ecc20"},
- {file = "mypy-0.982-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6af646bd46f10d53834a8e8983e130e47d8ab2d4b7a97363e35b24e1d588947"},
- {file = "mypy-0.982-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7aeaa763c7ab86d5b66ff27f68493d672e44c8099af636d433a7f3fa5596d40"},
- {file = "mypy-0.982-cp37-cp37m-win_amd64.whl", hash = "sha256:724d36be56444f569c20a629d1d4ee0cb0ad666078d59bb84f8f887952511ca1"},
- {file = "mypy-0.982-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14d53cdd4cf93765aa747a7399f0961a365bcddf7855d9cef6306fa41de01c24"},
- {file = "mypy-0.982-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:26ae64555d480ad4b32a267d10cab7aec92ff44de35a7cd95b2b7cb8e64ebe3e"},
- {file = "mypy-0.982-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6389af3e204975d6658de4fb8ac16f58c14e1bacc6142fee86d1b5b26aa52bda"},
- {file = "mypy-0.982-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b35ce03a289480d6544aac85fa3674f493f323d80ea7226410ed065cd46f206"},
- {file = "mypy-0.982-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c6e564f035d25c99fd2b863e13049744d96bd1947e3d3d2f16f5828864506763"},
- {file = "mypy-0.982-cp38-cp38-win_amd64.whl", hash = "sha256:cebca7fd333f90b61b3ef7f217ff75ce2e287482206ef4a8b18f32b49927b1a2"},
- {file = "mypy-0.982-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a705a93670c8b74769496280d2fe6cd59961506c64f329bb179970ff1d24f9f8"},
- {file = "mypy-0.982-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:75838c649290d83a2b83a88288c1eb60fe7a05b36d46cbea9d22efc790002146"},
- {file = "mypy-0.982-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:91781eff1f3f2607519c8b0e8518aad8498af1419e8442d5d0afb108059881fc"},
- {file = "mypy-0.982-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa97b9ddd1dd9901a22a879491dbb951b5dec75c3b90032e2baa7336777363b"},
- {file = "mypy-0.982-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a692a8e7d07abe5f4b2dd32d731812a0175626a90a223d4b58f10f458747dd8a"},
- {file = "mypy-0.982-cp39-cp39-win_amd64.whl", hash = "sha256:eb7a068e503be3543c4bd329c994103874fa543c1727ba5288393c21d912d795"},
- {file = "mypy-0.982-py3-none-any.whl", hash = "sha256:1021c241e8b6e1ca5a47e4d52601274ac078a89845cfde66c6d5f769819ffa1d"},
- {file = "mypy-0.982.tar.gz", hash = "sha256:85f7a343542dc8b1ed0a888cdd34dca56462654ef23aa673907305b260b3d746"},
-]
-
-[package.dependencies]
-mypy-extensions = ">=0.4.3"
-tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
-typing-extensions = ">=3.10"
-
-[package.extras]
-dmypy = ["psutil (>=4.0)"]
-python2 = ["typed-ast (>=1.4.0,<2)"]
-reports = ["lxml"]
-
-[[package]]
-name = "mypy-extensions"
-version = "1.0.0"
-description = "Type system extensions for programs checked with the mypy type checker."
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
- {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
-]
-
[[package]]
name = "packaging"
version = "23.2"
@@ -811,17 +667,6 @@ files = [
{file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"},
]
-[[package]]
-name = "pathspec"
-version = "0.12.1"
-description = "Utility library for gitignore style pattern matching of file paths."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
- {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
-]
-
[[package]]
name = "pexpect"
version = "4.9.0"
@@ -939,17 +784,6 @@ files = [
{file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
]
-[[package]]
-name = "pycodestyle"
-version = "2.9.1"
-description = "Python style guide checker"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"},
- {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"},
-]
-
[[package]]
name = "pycparser"
version = "2.21"
@@ -961,17 +795,6 @@ files = [
{file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
]
-[[package]]
-name = "pyflakes"
-version = "2.5.0"
-description = "passive checker of Python programs"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"},
- {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"},
-]
-
[[package]]
name = "pygments"
version = "2.17.2"
@@ -1014,101 +837,101 @@ files = [
[[package]]
name = "rapidfuzz"
-version = "3.5.2"
+version = "3.6.1"
description = "rapid fuzzy string matching"
optional = false
python-versions = ">=3.8"
files = [
- {file = "rapidfuzz-3.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1a047d6e58833919d742bbc0dfa66d1de4f79e8562ee195007d3eae96635df39"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22877c027c492b7dc7e3387a576a33ed5aad891104aa90da2e0844c83c5493ef"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e0f448b0eacbcc416feb634e1232a48d1cbde5e60f269c84e4fb0912f7bbb001"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05146497672f869baf41147d5ec1222788c70e5b8b0cfcd6e95597c75b5b96b"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f2df3968738a38d2a0058b5e721753f5d3d602346a1027b0dde31b0476418f3"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5afc1fcf1830f9bb87d3b490ba03691081b9948a794ea851befd2643069a30c1"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84be69ea65f64fa01e5c4976be9826a5aa949f037508887add42da07420d65d6"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8658c1045766e87e0038323aa38b4a9f49b7f366563271f973c8890a98aa24b5"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:852b3f93c15fce58b8dc668bd54123713bfdbbb0796ba905ea5df99cfd083132"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:12424a06ad9bd0cbf5f7cea1015e78d924a0034a0e75a5a7b39c0703dcd94095"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b4e9ded8e80530bd7205a7a2b01802f934a4695ca9e9fbe1ce9644f5e0697864"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:affb8fe36157c2dc8a7bc45b6a1875eb03e2c49167a1d52789144bdcb7ab3b8c"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1d33a622572d384f4c90b5f7a139328246ab5600141e90032b521c2127bd605"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-win32.whl", hash = "sha256:2cf9f2ed4a97b388cffd48d534452a564c2491f68f4fd5bc140306f774ceb63a"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:6541ffb70097885f7302cd73e2efd77be99841103023c2f9408551f27f45f7a5"},
- {file = "rapidfuzz-3.5.2-cp310-cp310-win_arm64.whl", hash = "sha256:1dd2542e5103fb8ca46500a979ae14d1609dcba11d2f9fe01e99eec03420e193"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bff7d3127ebc5cd908f3a72f6517f31f5247b84666137556a8fcc5177c560939"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fdfdb3685b631d8efbb6d6d3d86eb631be2b408d9adafcadc11e63e3f9c96dec"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97b043fe8185ec53bb3ff0e59deb89425c0fc6ece6e118939963aab473505801"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a4a7832737f87583f3863dc62e6f56dd4a9fefc5f04a7bdcb4c433a0f36bb1b"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d876dba9a11fcf60dcf1562c5a84ef559db14c2ceb41e1ad2d93cd1dc085889"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa4c0612893716bbb6595066ca9ecb517c982355abe39ba9d1f4ab834ace91ad"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:120316824333e376b88b284724cfd394c6ccfcb9818519eab5d58a502e5533f0"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cdbe8e80cc186d55f748a34393533a052d855357d5398a1ccb71a5021b58e8d"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1062425c8358a547ae5ebad148f2e0f02417716a571b803b0c68e4d552e99d32"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:66be181965aff13301dd5f9b94b646ce39d99c7fe2fd5de1656f4ca7fafcb38c"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:53df7aea3cf301633cfa2b4b2c2d2441a87dfc878ef810e5b4eddcd3e68723ad"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:76639dca5eb0afc6424ac5f42d43d3bd342ac710e06f38a8c877d5b96de09589"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:27689361c747b5f7b8a26056bc60979875323f1c3dcaaa9e2fec88f03b20a365"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-win32.whl", hash = "sha256:99c9fc5265566fb94731dc6826f43c5109e797078264e6389a36d47814473692"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:666928ee735562a909d81bd2f63207b3214afd4ca41f790ab3025d066975c814"},
- {file = "rapidfuzz-3.5.2-cp311-cp311-win_arm64.whl", hash = "sha256:d55de67c48f06b7772541e8d4c062a2679205799ce904236e2836cb04c106442"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:04e1e02b182283c43c866e215317735e91d22f5d34e65400121c04d5ed7ed859"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:365e544aba3ac13acf1a62cb2e5909ad2ba078d0bfc7d69b1f801dfd673b9782"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b61f77d834f94b0099fa9ed35c189b7829759d4e9c2743697a130dd7ba62259f"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43fb368998b9703fa8c63db292a8ab9e988bf6da0c8a635754be8e69da1e7c1d"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25510b5d142c47786dbd27cfd9da7cae5bdea28d458379377a3644d8460a3404"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf3093443751e5a419834162af358d1e31dec75f84747a91dbbc47b2c04fc085"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2fbaf546f15a924613f89d609ff66b85b4f4c2307ac14d93b80fe1025b713138"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32d580df0e130ed85400ff77e1c32d965e9bc7be29ac4072ab637f57e26d29fb"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:358a0fbc49343de20fee8ebdb33c7fa8f55a9ff93ff42d1ffe097d2caa248f1b"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fb379ac0ddfc86c5542a225d194f76ed468b071b6f79ff57c4b72e635605ad7d"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7fb21e182dc6d83617e88dea002963d5cf99cf5eabbdbf04094f503d8fe8d723"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:c04f9f1310ce414ab00bdcbf26d0906755094bfc59402cb66a7722c6f06d70b2"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f6da61cc38c1a95efc5edcedf258759e6dbab73191651a28c5719587f32a56ad"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-win32.whl", hash = "sha256:f823fd1977071486739f484e27092765d693da6beedaceece54edce1dfeec9b2"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:a8162d81486de85ab1606e48e076431b66d44cf431b2b678e9cae458832e7147"},
- {file = "rapidfuzz-3.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:dfc63fabb7d8da8483ca836bae7e55766fe39c63253571e103c034ba8ea80950"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:df8fae2515a1e4936affccac3e7d506dd904de5ff82bc0b1433b4574a51b9bfb"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dd6384780c2a16097d47588844cd677316a90e0f41ef96ff485b62d58de79dcf"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:467a4d730ae3bade87dba6bd769e837ab97e176968ce20591fe8f7bf819115b1"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54576669c1502b751b534bd76a4aeaaf838ed88b30af5d5c1b7d0a3ca5d4f7b5"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abafeb82f85a651a9d6d642a33dc021606bc459c33e250925b25d6b9e7105a2e"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73e14617a520c0f1bc15eb78c215383477e5ca70922ecaff1d29c63c060e04ca"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7cdf92116e9dfe40da17f921cdbfa0039dde9eb158914fa5f01b1e67a20b19cb"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1962d5ccf8602589dbf8e85246a0ee2b4050d82fade1568fb76f8a4419257704"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:db45028eae2fda7a24759c69ebeb2a7fbcc1a326606556448ed43ee480237a3c"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b685abb8b6d97989f6c69556d7934e0e533aa8822f50b9517ff2da06a1d29f23"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:40139552961018216b8cd88f6df4ecbbe984f907a62a5c823ccd907132c29a14"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0fef4705459842ef8f79746d6f6a0b5d2b6a61a145d7d8bbe10b2e756ea337c8"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6b2ad5516f7068c7d9cbcda8ac5906c589e99bc427df2e1050282ee2d8bc2d58"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-win32.whl", hash = "sha256:2da3a24c2f7dfca7f26ba04966b848e3bbeb93e54d899908ff88dfe3e1def9dc"},
- {file = "rapidfuzz-3.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:e3f2be79d4114d01f383096dbee51b57df141cb8b209c19d0cf65f23a24e75ba"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:089a7e96e5032821af5964d8457fcb38877cc321cdd06ad7c5d6e3d852264cb9"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:75d8a52bf8d1aa2ac968ae4b21b83b94fc7e5ea3dfbab34811fc60f32df505b2"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2bacce6bbc0362f0789253424269cc742b1f45e982430387db3abe1d0496e371"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5fd627e604ddc02db2ddb9ddc4a91dd92b7a6d6378fcf30bb37b49229072b89"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2e8b369f23f00678f6e673572209a5d3b0832f4991888e3df97af7b8b9decf3"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c29958265e4c2b937269e804b8a160c027ee1c2627d6152655008a8b8083630e"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00be97f9219355945c46f37ac9fa447046e6f7930f7c901e5d881120d1695458"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0d8d57e0f556ef38c24fee71bfe8d0db29c678bff2acd1819fc1b74f331c2"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de89585268ed8ee44e80126814cae63ff6b00d08416481f31b784570ef07ec59"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:908ff2de9c442b379143d1da3c886c63119d4eba22986806e2533cee603fe64b"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:54f0061028723c026020f5bb20649c22bc8a0d9f5363c283bdc5901d4d3bff01"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b581107ec0c610cdea48b25f52030770be390db4a9a73ca58b8d70fa8a5ec32e"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1d5a686ea258931aaa38019204bdc670bbe14b389a230b1363d84d6cf4b9dc38"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-win32.whl", hash = "sha256:97f811ca7709c6ee8c0b55830f63b3d87086f4abbcbb189b4067e1cd7014db7b"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:58ee34350f8c292dd24a050186c0e18301d80da904ef572cf5fda7be6a954929"},
- {file = "rapidfuzz-3.5.2-cp39-cp39-win_arm64.whl", hash = "sha256:c5075ce7b9286624cafcf36720ef1cfb2946d75430b87cb4d1f006e82cd71244"},
- {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af5221e4f7800db3e84c46b79dba4112e3b3cc2678f808bdff4fcd2487073846"},
- {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8501d7875b176930e6ed9dbc1bc35adb37ef312f6106bd6bb5c204adb90160ac"},
- {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e414e1ca40386deda4291aa2d45062fea0fbaa14f95015738f8bb75c4d27f862"},
- {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2059cd73b7ea779a9307d7a78ed743f0e3d33b88ccdcd84569abd2953cd859f"},
- {file = "rapidfuzz-3.5.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:58e3e21f6f13a7cca265cce492bc797425bd4cb2025fdd161a9e86a824ad65ce"},
- {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b847a49377e64e92e11ef3d0a793de75451526c83af015bdafdd5d04de8a058a"},
- {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a42c7a8c62b29c4810e39da22b42524295fcb793f41c395c2cb07c126b729e83"},
- {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51b5166be86e09e011e92d9862b1fe64c4c7b9385f443fb535024e646d890460"},
- {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f808dcb0088a7a496cc9895e66a7b8de55ffea0eb9b547c75dfb216dd5f76ed"},
- {file = "rapidfuzz-3.5.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d4b05a8f4ab7e7344459394094587b033fe259eea3a8720035e8ba30e79ab39b"},
- {file = "rapidfuzz-3.5.2.tar.gz", hash = "sha256:9e9b395743e12c36a3167a3a9fd1b4e11d92fb0aa21ec98017ee6df639ed385e"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ac434fc71edda30d45db4a92ba5e7a42c7405e1a54cb4ec01d03cc668c6dcd40"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2a791168e119cfddf4b5a40470620c872812042f0621e6a293983a2d52372db0"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a2f3e9df346145c2be94e4d9eeffb82fab0cbfee85bd4a06810e834fe7c03fa"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23de71e7f05518b0bbeef55d67b5dbce3bcd3e2c81e7e533051a2e9401354eb0"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d056e342989248d2bdd67f1955bb7c3b0ecfa239d8f67a8dfe6477b30872c607"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01835d02acd5d95c1071e1da1bb27fe213c84a013b899aba96380ca9962364bc"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed0f712e0bb5fea327e92aec8a937afd07ba8de4c529735d82e4c4124c10d5a0"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96cd19934f76a1264e8ecfed9d9f5291fde04ecb667faef5f33bdbfd95fe2d1f"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e06c4242a1354cf9d48ee01f6f4e6e19c511d50bb1e8d7d20bcadbb83a2aea90"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d73dcfe789d37c6c8b108bf1e203e027714a239e50ad55572ced3c004424ed3b"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:06e98ff000e2619e7cfe552d086815671ed09b6899408c2c1b5103658261f6f3"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:08b6fb47dd889c69fbc0b915d782aaed43e025df6979b6b7f92084ba55edd526"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a1788ebb5f5b655a15777e654ea433d198f593230277e74d51a2a1e29a986283"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c65f92881753aa1098c77818e2b04a95048f30edbe9c3094dc3707d67df4598b"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:4243a9c35667a349788461aae6471efde8d8800175b7db5148a6ab929628047f"},
+ {file = "rapidfuzz-3.6.1-cp310-cp310-win_arm64.whl", hash = "sha256:f59d19078cc332dbdf3b7b210852ba1f5db8c0a2cd8cc4c0ed84cc00c76e6802"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fbc07e2e4ac696497c5f66ec35c21ddab3fc7a406640bffed64c26ab2f7ce6d6"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40cced1a8852652813f30fb5d4b8f9b237112a0bbaeebb0f4cc3611502556764"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82300e5f8945d601c2daaaac139d5524d7c1fdf719aa799a9439927739917460"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf97c321fd641fea2793abce0e48fa4f91f3c202092672f8b5b4e781960b891"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7420e801b00dee4a344ae2ee10e837d603461eb180e41d063699fb7efe08faf0"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:060bd7277dc794279fa95522af355034a29c90b42adcb7aa1da358fc839cdb11"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7e3375e4f2bfec77f907680328e4cd16cc64e137c84b1886d547ab340ba6928"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a490cd645ef9d8524090551016f05f052e416c8adb2d8b85d35c9baa9d0428ab"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2e03038bfa66d2d7cffa05d81c2f18fd6acbb25e7e3c068d52bb7469e07ff382"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b19795b26b979c845dba407fe79d66975d520947b74a8ab6cee1d22686f7967"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:064c1d66c40b3a0f488db1f319a6e75616b2e5fe5430a59f93a9a5e40a656d15"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3c772d04fb0ebeece3109d91f6122b1503023086a9591a0b63d6ee7326bd73d9"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:841eafba6913c4dfd53045835545ba01a41e9644e60920c65b89c8f7e60c00a9"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-win32.whl", hash = "sha256:266dd630f12696ea7119f31d8b8e4959ef45ee2cbedae54417d71ae6f47b9848"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:d79aec8aeee02ab55d0ddb33cea3ecd7b69813a48e423c966a26d7aab025cdfe"},
+ {file = "rapidfuzz-3.6.1-cp311-cp311-win_arm64.whl", hash = "sha256:484759b5dbc5559e76fefaa9170147d1254468f555fd9649aea3bad46162a88b"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b2ef4c0fd3256e357b70591ffb9e8ed1d439fb1f481ba03016e751a55261d7c1"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:588c4b20fa2fae79d60a4e438cf7133d6773915df3cc0a7f1351da19eb90f720"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7142ee354e9c06e29a2636b9bbcb592bb00600a88f02aa5e70e4f230347b373e"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dfc557c0454ad22382373ec1b7df530b4bbd974335efe97a04caec936f2956a"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03f73b381bdeccb331a12c3c60f1e41943931461cdb52987f2ecf46bfc22f50d"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b0ccc2ec1781c7e5370d96aef0573dd1f97335343e4982bdb3a44c133e27786"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da3e8c9f7e64bb17faefda085ff6862ecb3ad8b79b0f618a6cf4452028aa2222"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fde9b14302a31af7bdafbf5cfbb100201ba21519be2b9dedcf4f1048e4fbe65d"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1a23eee225dfb21c07f25c9fcf23eb055d0056b48e740fe241cbb4b22284379"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e49b9575d16c56c696bc7b06a06bf0c3d4ef01e89137b3ddd4e2ce709af9fe06"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:0a9fc714b8c290261669f22808913aad49553b686115ad0ee999d1cb3df0cd66"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a3ee4f8f076aa92184e80308fc1a079ac356b99c39408fa422bbd00145be9854"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f056ba42fd2f32e06b2c2ba2443594873cfccc0c90c8b6327904fc2ddf6d5799"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-win32.whl", hash = "sha256:5d82b9651e3d34b23e4e8e201ecd3477c2baa17b638979deeabbb585bcb8ba74"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:dad55a514868dae4543ca48c4e1fc0fac704ead038dafedf8f1fc0cc263746c1"},
+ {file = "rapidfuzz-3.6.1-cp312-cp312-win_arm64.whl", hash = "sha256:3c84294f4470fcabd7830795d754d808133329e0a81d62fcc2e65886164be83b"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e19d519386e9db4a5335a4b29f25b8183a1c3f78cecb4c9c3112e7f86470e37f"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01eb03cd880a294d1bf1a583fdd00b87169b9cc9c9f52587411506658c864d73"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:be368573255f8fbb0125a78330a1a40c65e9ba3c5ad129a426ff4289099bfb41"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e5af946f419c30f5cb98b69d40997fe8580efe78fc83c2f0f25b60d0e56efb"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f382f7ffe384ce34345e1c0b2065451267d3453cadde78946fbd99a59f0cc23c"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be156f51f3a4f369e758505ed4ae64ea88900dcb2f89d5aabb5752676d3f3d7e"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1936d134b6c513fbe934aeb668b0fee1ffd4729a3c9d8d373f3e404fbb0ce8a0"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ff8eaf4a9399eb2bebd838f16e2d1ded0955230283b07376d68947bbc2d33d"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae598a172e3a95df3383634589660d6b170cc1336fe7578115c584a99e0ba64d"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cd4ba4c18b149da11e7f1b3584813159f189dc20833709de5f3df8b1342a9759"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:0402f1629e91a4b2e4aee68043a30191e5e1b7cd2aa8dacf50b1a1bcf6b7d3ab"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:1e12319c6b304cd4c32d5db00b7a1e36bdc66179c44c5707f6faa5a889a317c0"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0bbfae35ce4de4c574b386c43c78a0be176eeddfdae148cb2136f4605bebab89"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-win32.whl", hash = "sha256:7fec74c234d3097612ea80f2a80c60720eec34947066d33d34dc07a3092e8105"},
+ {file = "rapidfuzz-3.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:a553cc1a80d97459d587529cc43a4c7c5ecf835f572b671107692fe9eddf3e24"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:757dfd7392ec6346bd004f8826afb3bf01d18a723c97cbe9958c733ab1a51791"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2963f4a3f763870a16ee076796be31a4a0958fbae133dbc43fc55c3968564cf5"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2f0274595cc5b2b929c80d4e71b35041104b577e118cf789b3fe0a77b37a4c5"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f211e366e026de110a4246801d43a907cd1a10948082f47e8a4e6da76fef52"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a59472b43879012b90989603aa5a6937a869a72723b1bf2ff1a0d1edee2cc8e6"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a03863714fa6936f90caa7b4b50ea59ea32bb498cc91f74dc25485b3f8fccfe9"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd95b6b7bfb1584f806db89e1e0c8dbb9d25a30a4683880c195cc7f197eaf0c"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7183157edf0c982c0b8592686535c8b3e107f13904b36d85219c77be5cefd0d8"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ad9d74ef7c619b5b0577e909582a1928d93e07d271af18ba43e428dc3512c2a1"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b53137d81e770c82189e07a8f32722d9e4260f13a0aec9914029206ead38cac3"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:49b9ed2472394d306d5dc967a7de48b0aab599016aa4477127b20c2ed982dbf9"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:dec307b57ec2d5054d77d03ee4f654afcd2c18aee00c48014cb70bfed79597d6"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4381023fa1ff32fd5076f5d8321249a9aa62128eb3f21d7ee6a55373e672b261"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-win32.whl", hash = "sha256:8d7a072f10ee57c8413c8ab9593086d42aaff6ee65df4aa6663eecdb7c398dca"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:ebcfb5bfd0a733514352cfc94224faad8791e576a80ffe2fd40b2177bf0e7198"},
+ {file = "rapidfuzz-3.6.1-cp39-cp39-win_arm64.whl", hash = "sha256:1c47d592e447738744905c18dda47ed155620204714e6df20eb1941bb1ba315e"},
+ {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:eef8b346ab331bec12bbc83ac75641249e6167fab3d84d8f5ca37fd8e6c7a08c"},
+ {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53251e256017e2b87f7000aee0353ba42392c442ae0bafd0f6b948593d3f68c6"},
+ {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dede83a6b903e3ebcd7e8137e7ff46907ce9316e9d7e7f917d7e7cdc570ee05"},
+ {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4da90e4c2b444d0a171d7444ea10152e07e95972bb40b834a13bdd6de1110c"},
+ {file = "rapidfuzz-3.6.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ca3dfcf74f2b6962f411c33dd95b0adf3901266e770da6281bc96bb5a8b20de9"},
+ {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bcc957c0a8bde8007f1a8a413a632a1a409890f31f73fe764ef4eac55f59ca87"},
+ {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:692c9a50bea7a8537442834f9bc6b7d29d8729a5b6379df17c31b6ab4df948c2"},
+ {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c23ceaea27e790ddd35ef88b84cf9d721806ca366199a76fd47cfc0457a81b"},
+ {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b155e67fff215c09f130555002e42f7517d0ea72cbd58050abb83cb7c880cec"},
+ {file = "rapidfuzz-3.6.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3028ee8ecc48250607fa8a0adce37b56275ec3b1acaccd84aee1f68487c8557b"},
+ {file = "rapidfuzz-3.6.1.tar.gz", hash = "sha256:35660bee3ce1204872574fa041c7ad7ec5175b3053a4cb6e181463fc07013de7"},
]
[package.extras]
@@ -1218,13 +1041,13 @@ files = [
[[package]]
name = "trove-classifiers"
-version = "2023.11.29"
+version = "2024.1.8"
description = "Canonical source for classifiers on PyPI (pypi.org)."
optional = false
python-versions = "*"
files = [
- {file = "trove-classifiers-2023.11.29.tar.gz", hash = "sha256:ff8f7fd82c7932113b46e7ef6742c70091cc63640c8c65db00d91f2e940b9514"},
- {file = "trove_classifiers-2023.11.29-py3-none-any.whl", hash = "sha256:02307750cbbac2b3d13078662f8a5bf077732bf506e9c33c97204b7f68f3699e"},
+ {file = "trove-classifiers-2024.1.8.tar.gz", hash = "sha256:6e36caf430ff6485c4b57a4c6b364a13f6a898d16b9417c6c37467e59c14b05a"},
+ {file = "trove_classifiers-2024.1.8-py3-none-any.whl", hash = "sha256:3c1ff4deb10149c7e39ede6e5bbc107def64362ef1ee7590ec98d71fb92f1b6a"},
]
[[package]]
@@ -1376,4 +1199,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p
[metadata]
lock-version = "2.0"
python-versions = "^3.8"
-content-hash = "78a455d62c41ad4fbcd3797236bc7623e62c8e8599304ca3c8fb39d041f08d1d"
+content-hash = "b07565a572f07d76719dbbee1565ac73580ce26983fd543d7b4f96e0d5ec54ff"
diff --git a/projects/poetry_polylith_plugin/pyproject.toml b/projects/poetry_polylith_plugin/pyproject.toml
index 8715daca..b23464a3 100644
--- a/projects/poetry_polylith_plugin/pyproject.toml
+++ b/projects/poetry_polylith_plugin/pyproject.toml
@@ -1,18 +1,23 @@
[tool.poetry]
name = "poetry-polylith-plugin"
-version = "1.13.0"
+version = "1.14.0"
description = "A Poetry plugin that adds tooling support for the Polylith Architecture"
authors = ["David Vujic"]
homepage = "https://davidvujic.github.io/python-polylith-docs/"
repository = "https://github.com/davidvujic/python-polylith"
+license = "MIT"
readme = "README.md"
+
packages = [
{include = "polylith/poetry_plugin",from = "../../bases"},
+ {include = "polylith/alias",from = "../../components"},
{include = "polylith/bricks",from = "../../components"},
{include = "polylith/check",from = "../../components"},
+ {include = "polylith/commands",from = "../../components"},
{include = "polylith/development",from = "../../components"},
{include = "polylith/diff",from = "../../components"},
{include = "polylith/dirs",from = "../../components"},
+ {include = "polylith/distributions",from = "../../components"},
{include = "polylith/files",from = "../../components"},
{include = "polylith/imports",from = "../../components"},
{include = "polylith/info",from = "../../components"},
@@ -26,7 +31,6 @@ packages = [
{include = "polylith/sync",from = "../../components"},
{include = "polylith/test",from = "../../components"},
{include = "polylith/workspace",from = "../../components"},
- {include = "polylith/alias",from = "../../components"},
]
[tool.poetry.plugins."poetry.application.plugin"]
@@ -37,12 +41,7 @@ python = "^3.8"
poetry = "^1.2"
tomlkit = "^0.11.5"
rich = "^13.6.0"
-
-[tool.poetry.group.dev.dependencies]
-black = "^22.10.0"
-isort = "^5.10.1"
-mypy = "^0.982"
-flake8 = "^5.0.4"
+cleo = "^2.1.0"
[build-system]
requires = ["poetry-core>=1.0.0"]
diff --git a/projects/polylith-cli/README.md b/projects/polylith-cli/README.md
new file mode 100644
index 00000000..c3085880
--- /dev/null
+++ b/projects/polylith-cli/README.md
@@ -0,0 +1,65 @@
+# Python tooling for Polylith
+
+A command line interface that adds tooling support for the Polylith Architecture in Python.
+
+## Documentation
+Have a look at the [documentation](https://davidvujic.github.io/python-polylith-docs/).
+You will find installation, setup, usage guides and more.
+
+## Quick start
+
+`Poetry` user? For Poetry, the recommended setup is to install the `poetry-polylith-plugin`.
+Read more about Poetry in the [documentation](https://davidvujic.github.io/python-polylith-docs/installation/).
+
+### Setup: Hatch
+Create a directory for your code, initialize it with __git__ and setup the basics with `hatch`:
+
+``` shell
+git init
+
+hatch new --init
+```
+
+Add the Polylith CLI as a dev dependency in `pyproject.toml`:
+
+``` toml
+dependencies = ["polylith-cli~=0.1.0"]
+```
+
+Add configuration for a local virtual environment in the `pyproject.toml`:
+``` toml
+[tool.hatch.envs.default]
+type = "virtual"
+path = ".venv"
+python = "3.12" # your preferred version here
+```
+
+Make `Hatch` aware of the Polylith structure, by adding this to the `pyproject.toml`:
+``` toml
+[tool.hatch.build]
+dev-mode-dirs = ["components", "bases", "development", "."]
+
+```
+
+Next: create a Polylith workspace, with a basic Polylith folder structure.
+The `poly` command is now available in the local virtual environment.
+You can run commands in the context of `hatch run` to make Polylith aware of the development environment.
+
+``` shell
+hatch run poly create workspace --name my_namespace --theme loose
+```
+
+### Ready for coding!
+
+Add components, bases and projects:
+
+``` shell
+hatch run poly create component --name my_component
+
+hatch run poly create base --name my_example_endpoint
+
+hatch run poly create project --name my_example_project
+```
+
+For details, have a look at the [documentation](https://davidvujic.github.io/python-polylith-docs/).
+There, you will find guides for setup, migration, packaging, available commands, code examples and more.
diff --git a/projects/polylith-cli/pyproject.toml b/projects/polylith-cli/pyproject.toml
new file mode 100644
index 00000000..da5db50d
--- /dev/null
+++ b/projects/polylith-cli/pyproject.toml
@@ -0,0 +1,44 @@
+[tool.poetry]
+name = "polylith-cli"
+version = "0.1.0"
+description = "Python tooling support for the Polylith Architecture"
+authors = ['David Vujic']
+license = "MIT"
+readme = "README.md"
+
+packages = [
+ {include = "polylith/cli",from = "../../bases"},
+ {include = "polylith/alias",from = "../../components"},
+ {include = "polylith/bricks",from = "../../components"},
+ {include = "polylith/check",from = "../../components"},
+ {include = "polylith/commands",from = "../../components"},
+ {include = "polylith/development",from = "../../components"},
+ {include = "polylith/diff",from = "../../components"},
+ {include = "polylith/dirs",from = "../../components"},
+ {include = "polylith/distributions",from = "../../components"},
+ {include = "polylith/files",from = "../../components"},
+ {include = "polylith/imports",from = "../../components"},
+ {include = "polylith/info",from = "../../components"},
+ {include = "polylith/interface",from = "../../components"},
+ {include = "polylith/libs",from = "../../components"},
+ {include = "polylith/project",from = "../../components"},
+ {include = "polylith/readme",from = "../../components"},
+ {include = "polylith/repo",from = "../../components"},
+ {include = "polylith/reporting",from = "../../components"},
+ {include = "polylith/sync",from = "../../components"},
+ {include = "polylith/test",from = "../../components"},
+ {include = "polylith/workspace",from = "../../components"},
+]
+
+[tool.poetry.dependencies]
+python = "^3.8"
+tomlkit = "^0.11.5"
+rich = "^13.6.0"
+typer = {extras = ["all"], version = "^0.9.0"}
+
+[tool.poetry.scripts]
+poly = "polylith_cli.polylith.cli.core:app"
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"
diff --git a/pyproject.toml b/pyproject.toml
index 51ded813..e5f1547c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -8,11 +8,15 @@ repository = "https://github.com/davidvujic/python-polylith"
readme = "README.md"
packages = [
{include = "polylith/poetry_plugin",from = "bases"},
+ {include = "polylith/cli",from = "bases"},
+ {include = "polylith/alias",from = "components"},
{include = "polylith/bricks",from = "components"},
{include = "polylith/check",from = "components"},
+ {include = "polylith/commands",from = "components"},
{include = "polylith/development",from = "components"},
{include = "polylith/diff",from = "components"},
{include = "polylith/dirs",from = "components"},
+ {include = "polylith/distributions",from = "components"},
{include = "polylith/files",from = "components"},
{include = "polylith/imports",from = "components"},
{include = "polylith/info",from = "components"},
@@ -26,23 +30,26 @@ packages = [
{include = "polylith/sync",from = "components"},
{include = "polylith/test",from = "components"},
{include = "polylith/workspace",from = "components"},
- {include = "polylith/alias",from = "components"},
{include = "development"},
]
[tool.poetry.dependencies]
-python = "^3.8"
+python = "^3.8.1"
poetry = "^1.2"
tomlkit = "^0.11.5"
rich = "^13.6.0"
+typer = {extras = ["all"], version = "^0.9.0"}
+cleo = "^2.1.0"
[tool.poetry.group.dev.dependencies]
-black = "^22.10.0"
+black = "^23.12.1"
isort = "^5.10.1"
-mypy = "^0.982"
-flake8 = "^5.0.4"
-pytest = "^7.2.1"
-pytest-cov = "^4.0.0"
+mypy = "^1.8.0"
+flake8 = "^7.0.0"
+pytest = "^7.4.4"
+
+[tool.poetry.scripts]
+poly = "polylith.cli.core:app"
[tool.isort]
profile = "black"
diff --git a/test/components/polylith/bricks/test_base.py b/test/components/polylith/bricks/test_base.py
index f5e54158..75e76b0e 100644
--- a/test/components/polylith/bricks/test_base.py
+++ b/test/components/polylith/bricks/test_base.py
@@ -24,13 +24,14 @@
ids=create_base_ids,
)
def test_create_base(handle_workspace_files, id, expected_dirs, expected_dir_structure):
+ options = {
+ "namespace": "test_namespace",
+ "package": "test_package",
+ "description": "test desc",
+ "modulename": "core",
+ }
+ create_base(path=handle_workspace_files, options=options)
- create_base(
- path=handle_workspace_files,
- namespace="test_namespace",
- package="test_package",
- description="test desc",
- )
results = [
x for x in handle_workspace_files.iterdir() if x.name != "workspace.toml"
]
@@ -44,6 +45,5 @@ def test_create_base(handle_workspace_files, id, expected_dirs, expected_dir_str
def test_get_bases_data_valid_with_test_file_structure(create_test_base):
-
result = get_bases_data(create_test_base, "test_namespace")
assert result == [{"name": "test_package"}]
diff --git a/test/components/polylith/commands/__init__.py b/test/components/polylith/commands/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/test/components/polylith/commands/test_info.py b/test/components/polylith/commands/test_info.py
new file mode 100644
index 00000000..b5663bc6
--- /dev/null
+++ b/test/components/polylith/commands/test_info.py
@@ -0,0 +1,5 @@
+from polylith.commands import info
+
+
+def test_sample():
+ assert info is not None
diff --git a/test/components/polylith/distributions/__init__.py b/test/components/polylith/distributions/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/test/components/polylith/distributions/test_core.py b/test/components/polylith/distributions/test_core.py
new file mode 100644
index 00000000..5d866063
--- /dev/null
+++ b/test/components/polylith/distributions/test_core.py
@@ -0,0 +1,15 @@
+import importlib.metadata
+
+from polylith import distributions
+
+
+def test_distribution_packages():
+ dists = importlib.metadata.distributions()
+
+ res = distributions.distributions_packages(dists)
+
+ expected_dist = "mypy-extensions"
+ expected_package = "mypy_extensions"
+
+ assert res.get(expected_dist) is not None
+ assert res[expected_dist] == [expected_package]
diff --git a/test/components/polylith/poetry/test_internals.py b/test/components/polylith/poetry/test_internals.py
index cfc13c79..4663a1e1 100644
--- a/test/components/polylith/poetry/test_internals.py
+++ b/test/components/polylith/poetry/test_internals.py
@@ -30,18 +30,3 @@ def test_distributions():
res = internals.distributions(dev_poetry, path)
assert res is not None and len(list(res))
-
-
-def test_distribution_packages():
- path = Path.cwd()
-
- dev_poetry = Factory().create_poetry(path)
- dists = internals.distributions(dev_poetry, path)
-
- res = internals.distributions_packages(dists)
-
- expected_dist = "mypy-extensions"
- expected_package = "mypy_extensions"
-
- assert res.get(expected_dist) is not None
- assert res[expected_dist] == [expected_package]
diff --git a/test/components/polylith/project/test_project_get.py b/test/components/polylith/project/test_project_get.py
index 76888864..7e31e218 100644
--- a/test/components/polylith/project/test_project_get.py
+++ b/test/components/polylith/project/test_project_get.py
@@ -11,10 +11,10 @@
"""
-pep_621_toml = """\
-[project]
-name = "unit test"
-includes = ["../../components/unittest/one"]
+hatch_toml = """\
+[tool.hatch.build.force-include]
+"../../bases/unittest/one" = "unittest/one"
+"../../components/unittest/two" = "unittest/two"
"""
@@ -27,8 +27,11 @@ def test_get_poetry_package_includes():
def test_get_pep_621_includes():
- data = tomlkit.loads(pep_621_toml)
+ data = tomlkit.loads(hatch_toml)
res = project.get.get_project_package_includes(namespace, data)
- assert res == [{"include": "unittest/one", "from": "../../components"}]
+ assert res == [
+ {"include": "unittest/one", "from": "../../bases"},
+ {"include": "unittest/two", "from": "../../components"},
+ ]
diff --git a/test/components/polylith/sync/test_update.py b/test/components/polylith/sync/test_update.py
index 375342bb..f190682f 100644
--- a/test/components/polylith/sync/test_update.py
+++ b/test/components/polylith/sync/test_update.py
@@ -64,8 +64,14 @@ def test_bricks_to_pyproject_packages():
{"include": "hello/third", "from": "components"},
]
+expected_hatch_packages = {
+ "bases/hello/first": "hello/first",
+ "components/hello/second": "hello/second",
+ "components/hello/third": "hello/third",
+}
-def test_generate_updated_project():
+
+def test_generate_updated_poetry_project():
data = tomlkit.parse(
"""\
[tool.poetry]
@@ -80,23 +86,46 @@ def test_generate_updated_project():
assert res == packages
-def test_generate_updated_pep_621_ready_project():
- expected = [
- "bases/hello/first",
- "components/hello/second",
- "components/hello/third",
- ]
-
+def test_generate_updated_hatch_project():
data = tomlkit.parse(
"""\
-[project]
-name = "unit test"
-includes = ["bases/hello/first"]
+[tool.hatch.build.force-include]
+"bases/hello/first" = "hello/first"
"""
)
updated = update.generate_updated_project(data, packages[1:])
- res = tomlkit.parse(updated)["project"]["includes"]
+ res = tomlkit.parse(updated)["tool"]["hatch"]["build"]["force-include"]
- assert res == expected
+ assert res == expected_hatch_packages
+
+
+def test_generate_updated_hatch_project_with_missing_build_config():
+ data = tomlkit.parse(
+ """\
+[tool.hatch]
+hello = "world"
+"""
+ )
+
+ updated = update.generate_updated_project(data, packages)
+
+ res = tomlkit.parse(updated)["tool"]["hatch"]["build"]["force-include"]
+
+ assert res == expected_hatch_packages
+
+
+def test_generate_updated_hatch_project_with_missing_force_include_config():
+ data = tomlkit.parse(
+ """\
+[tool.hatch.build]
+hello = "world"
+"""
+ )
+
+ updated = update.generate_updated_project(data, packages)
+
+ res = tomlkit.parse(updated)["tool"]["hatch"]["build"]["force-include"]
+
+ assert res == expected_hatch_packages
diff --git a/test/conftest.py b/test/conftest.py
index f930a61b..290fe73d 100644
--- a/test/conftest.py
+++ b/test/conftest.py
@@ -35,10 +35,12 @@ def create_test_base(handle_workspace_files):
Note:
The handle_workspace_files fixture will clean up at tear-down.
"""
- create_base(
- path=handle_workspace_files,
- namespace="test_namespace",
- package="test_package",
- description="test desc",
- )
+
+ options = {
+ "namespace": "test_namespace",
+ "package": "test_package",
+ "description": "test desc",
+ "modulename": "core",
+ }
+ create_base(path=handle_workspace_files, options=options)
yield handle_workspace_files