matchlab 0.1.0.dev3__tar.gz → 0.1.0.dev4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/PKG-INFO +1 -1
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/models/linkers/splinklinker.py +37 -6
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab.egg-info/PKG-INFO +1 -1
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab.egg-info/SOURCES.txt +1 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab.egg-info/scm_version.json +1 -1
- matchlab-0.1.0.dev4/test/models/test_linkers_splink.py +42 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/.github/actions/setup-toolchain/action.yml +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/.github/dependabot.yml +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/.github/pull_request_template.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/.github/skills/lucid-docs/README.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/.github/skills/lucid-docs/SKILL.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/.github/skills/lucid-docs/readability.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/.github/workflows/cd.yml +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/.github/workflows/ci.yml +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/.github/workflows/codeql.yml +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/.gitignore +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/.pre-commit-config.yaml +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/.vscode/launch.json +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/.vscode/settings.json +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/CODEOWNERS +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/LICENSE +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/README.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/benchmarks/README.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/benchmarks/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/benchmarks/__main__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/benchmarks/cases.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/benchmarks/data.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/benchmarks/measure.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/benchmarks/measurements.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/benchmarks/report.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/benchmarks/results/.gitkeep +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/benchmarks/runner.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/benchmarks/topologies.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/adapters.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/core/exceptions.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/core/hash.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/core/resolver_output.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/core/schemas.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/core/transform.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/document.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/eval-judgements.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/eval-metrics.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/eval-sampling.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/eval-tui.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/lineage.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/locations.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/models.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/progress.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/recordstep.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/resolvers.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/resources.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/sources.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/specs.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/steps.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/testkit.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/api/transformers.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/assets/matchbox-icon-dark.png +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/assets/matchbox-icon.svg +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/assets/matchbox-logo-dark.svg +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/assets/matchbox-logo-light.svg +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/contributing.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/glossary.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/guide/build-a-plan.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/guide/evaluate.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/guide/install.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/guide/query.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/guide/serialise.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/index.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/migration/matchbox-to-matchlab.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/stylesheets/extra.css +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/use-cases.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/docs/why-matchlab.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/justfile +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/mkdocs.yml +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/personal-data-exclusions.txt +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/pyproject.toml +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/scripts/test_eval.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/setup.cfg +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/adapters/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/adapters/base.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/adapters/duckdb.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/cli.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/core/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/core/dataframes.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/core/dsu.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/core/exceptions.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/core/hash.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/core/kinds.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/core/logging.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/core/resolver_output.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/core/schemas.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/core/sql.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/document.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/eval/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/eval/judgements.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/eval/metrics.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/eval/samples.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/eval/tui/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/eval/tui/app.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/eval/tui/modals.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/eval/tui/styles.tcss +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/eval/tui/widgets/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/eval/tui/widgets/assignment.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/eval/tui/widgets/styling.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/eval/tui/widgets/table.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/lineage.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/models/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/models/comparison.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/models/dedupers/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/models/dedupers/base.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/models/dedupers/naive.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/models/linkers/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/models/linkers/base.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/models/linkers/deterministic.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/models/linkers/weighteddeterministic.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/models/models.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/progress.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/recordstep.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/resolvers/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/resolvers/base.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/resolvers/components.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/resolvers/resolvers.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/resources.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/sources/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/sources/base.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/sources/dataframe.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/sources/relational.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/sources/sources.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/specs.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/steps.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/testkit/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/testkit/_generate.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/testkit/compare.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/testkit/entities.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/testkit/features.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/testkit/linked.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/testkit/matchers.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/testkit/models.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/testkit/sources.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/transformers/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/transformers/base.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/transformers/clean.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/transformers/explode.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/transformers/group.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/transformers/select.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/transformers/transform.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab.egg-info/dependency_links.txt +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab.egg-info/entry_points.txt +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab.egg-info/requires.txt +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab.egg-info/scm_file_list.json +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab.egg-info/top_level.txt +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/README.md +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/adapters/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/adapters/conftest.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/adapters/test_base.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/adapters/test_contract.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/adapters/test_duckdb.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/conftest.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/core/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/core/test_dsu.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/core/test_eval.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/core/test_hash.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/core/test_resolver_output.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/eval/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/eval/test_samples.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/eval/tui/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/eval/tui/test_app.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/eval/tui/test_widgets.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/models/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/models/test_comparison.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/models/test_dedupers_deterministic.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/models/test_linkers_deterministic.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/models/test_linkers_probabilistic.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/models/test_models.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/plan/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/plan/test_ground_truth.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/plan/test_plan.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/plan/test_steps.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/resolvers/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/resolvers/test_components.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/resolvers/test_resolvers.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/sources/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/sources/conftest.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/sources/test_locations.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/test_benchmarks.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/test_cli.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/test_document.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/test_lineage.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/test_progress.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/test_resources.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/testkit/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/testkit/test_entities.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/testkit/test_linked.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/testkit/test_models.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/testkit/test_scores.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/testkit/test_sources.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/transformers/__init__.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/transformers/test_clean.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/transformers/test_explode.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/transformers/test_group.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/transformers/test_select.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/test/transformers/test_transform.py +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/trufflehog-exclude.txt +0 -0
- {matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: matchlab
|
|
3
|
-
Version: 0.1.0.
|
|
3
|
+
Version: 0.1.0.dev4
|
|
4
4
|
Summary: A local-first library for building, running and evaluating entity resolution pipelines.
|
|
5
5
|
Author: Department for Business and Trade
|
|
6
6
|
Project-URL: Documentation, https://uktrade.github.io/matchlab/
|
|
@@ -174,21 +174,52 @@ class SplinkLinker(Linker):
|
|
|
174
174
|
_id_dtype_l: pl.DataType
|
|
175
175
|
_id_dtype_r: pl.DataType
|
|
176
176
|
|
|
177
|
+
@staticmethod
|
|
178
|
+
def _schema_summary(data: pl.DataFrame) -> str:
|
|
179
|
+
"""Render a compact column-to-dtype summary for diagnostics."""
|
|
180
|
+
return (
|
|
181
|
+
", ".join(f"{column}={dtype}" for column, dtype in data.schema.items())
|
|
182
|
+
or "<empty>"
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
@classmethod
|
|
186
|
+
def _conformancy_error(cls, left: pl.DataFrame, right: pl.DataFrame) -> ValueError:
|
|
187
|
+
"""Build a detailed error describing how the two inputs differ."""
|
|
188
|
+
left_only = [column for column in left.columns if column not in right.columns]
|
|
189
|
+
right_only = [column for column in right.columns if column not in left.columns]
|
|
190
|
+
shared = [column for column in left.columns if column in right.columns]
|
|
191
|
+
differing_dtypes = [
|
|
192
|
+
f"{column}: left={left.schema[column]}, right={right.schema[column]}"
|
|
193
|
+
for column in shared
|
|
194
|
+
if left.schema[column] != right.schema[column]
|
|
195
|
+
]
|
|
196
|
+
|
|
197
|
+
details = [
|
|
198
|
+
"SplinkLinker requires input data to be conformant, meaning they "
|
|
199
|
+
"share the same column names and data formats.",
|
|
200
|
+
f"Left schema: {cls._schema_summary(left)}",
|
|
201
|
+
f"Right schema: {cls._schema_summary(right)}",
|
|
202
|
+
]
|
|
203
|
+
if left_only:
|
|
204
|
+
details.append(f"Columns only on left: {left_only}")
|
|
205
|
+
if right_only:
|
|
206
|
+
details.append(f"Columns only on right: {right_only}")
|
|
207
|
+
if differing_dtypes:
|
|
208
|
+
details.append("Differing dtypes: " + "; ".join(differing_dtypes))
|
|
209
|
+
return ValueError("\n".join(details))
|
|
210
|
+
|
|
177
211
|
def prepare(self, left: pl.DataFrame, right: pl.DataFrame) -> None:
|
|
178
212
|
"""Build the Splink linker over left and right, and run its training functions.
|
|
179
213
|
|
|
180
214
|
Runs each function in `settings.linker_training_functions`, in order, against
|
|
181
215
|
the built linker. `link()` then just predicts against the trained state.
|
|
182
216
|
"""
|
|
183
|
-
if (set(left.columns) != set(right.columns)) or not left.dtypes == right.dtypes:
|
|
184
|
-
raise ValueError(
|
|
185
|
-
"SplinkLinker requires input data to be conformant, meaning they "
|
|
186
|
-
"share the same column names and data formats."
|
|
187
|
-
)
|
|
188
|
-
|
|
189
217
|
self._id_dtype_l = left[self.left_id].dtype
|
|
190
218
|
self._id_dtype_r = right[self.right_id].dtype
|
|
191
219
|
|
|
220
|
+
if (set(left.columns) != set(right.columns)) or not left.dtypes == right.dtypes:
|
|
221
|
+
raise self._conformancy_error(left, right)
|
|
222
|
+
|
|
192
223
|
# Convert to pandas for Splink compatibility
|
|
193
224
|
left_pd = left.with_columns(pl.col(self.left_id).cast(pl.String)).to_pandas()
|
|
194
225
|
right_pd = right.with_columns(pl.col(self.right_id).cast(pl.String)).to_pandas()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: matchlab
|
|
3
|
-
Version: 0.1.0.
|
|
3
|
+
Version: 0.1.0.dev4
|
|
4
4
|
Summary: A local-first library for building, running and evaluating entity resolution pipelines.
|
|
5
5
|
Author: Department for Business and Trade
|
|
6
6
|
Project-URL: Documentation, https://uktrade.github.io/matchlab/
|
|
@@ -178,6 +178,7 @@ test/models/test_comparison.py
|
|
|
178
178
|
test/models/test_dedupers_deterministic.py
|
|
179
179
|
test/models/test_linkers_deterministic.py
|
|
180
180
|
test/models/test_linkers_probabilistic.py
|
|
181
|
+
test/models/test_linkers_splink.py
|
|
181
182
|
test/models/test_models.py
|
|
182
183
|
test/plan/__init__.py
|
|
183
184
|
test/plan/test_ground_truth.py
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Direct unit tests for `SplinkLinker` behavior.
|
|
2
|
+
|
|
3
|
+
These tests cover Splink-specific schema handling and diagnostics, rather than the
|
|
4
|
+
shared match/no-match behavior exercised in the other linker suites.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import polars as pl
|
|
8
|
+
import pytest
|
|
9
|
+
from splink import SettingsCreator
|
|
10
|
+
from splink import blocking_rule_library as brl
|
|
11
|
+
from splink import comparison_library as cl
|
|
12
|
+
|
|
13
|
+
from matchlab.models.linkers.splinklinker import SplinkLinker
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_splink_conformancy_error() -> None:
|
|
17
|
+
"""Splink surfaces the concrete schema mismatch from the real prepare path."""
|
|
18
|
+
linker = SplinkLinker(
|
|
19
|
+
left_id="id",
|
|
20
|
+
right_id="id",
|
|
21
|
+
linker_training_functions=[],
|
|
22
|
+
linker_settings=SettingsCreator(
|
|
23
|
+
link_type="link_only",
|
|
24
|
+
blocking_rules_to_generate_predictions=[brl.block_on("id")],
|
|
25
|
+
comparisons=[cl.ExactMatch("id")],
|
|
26
|
+
),
|
|
27
|
+
threshold=None,
|
|
28
|
+
)
|
|
29
|
+
left = pl.DataFrame({"id": [1], "company_name": ["left"]})
|
|
30
|
+
right = pl.DataFrame({"id": [2], "postcode": ["SW1A 1AA"]})
|
|
31
|
+
|
|
32
|
+
with pytest.raises(
|
|
33
|
+
ValueError,
|
|
34
|
+
match="SplinkLinker requires input data to be conformant",
|
|
35
|
+
) as exc_info:
|
|
36
|
+
linker.prepare(left, right)
|
|
37
|
+
|
|
38
|
+
message = str(exc_info.value)
|
|
39
|
+
assert "Left schema: id=Int64, company_name=String" in message
|
|
40
|
+
assert "Right schema: id=Int64, postcode=String" in message
|
|
41
|
+
assert "Columns only on left: ['company_name']" in message
|
|
42
|
+
assert "Columns only on right: ['postcode']" in message
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matchlab-0.1.0.dev3 → matchlab-0.1.0.dev4}/src/matchlab/models/linkers/weighteddeterministic.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|