matchbox-db 0.7.14.dev51__tar.gz → 0.7.14.dev90__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.
- matchbox_db-0.7.14.dev90/.github/dependabot.yml +11 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.github/workflows/ci.yml +14 -11
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.github/workflows/codeql.yml +4 -4
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.github/workflows/prerelease.yml +10 -9
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.github/workflows/release.yml +15 -14
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.pre-commit-config.yaml +1 -1
- {matchbox_db-0.7.14.dev51/src/matchbox_db.egg-info → matchbox_db-0.7.14.dev90}/PKG-INFO +2 -1
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/client/evaluation.md +28 -23
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/contributing.md +19 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/pyproject.toml +3 -1
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/_handler.py +8 -19
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/app.py +25 -7
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/run.py +19 -1
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/dags.py +31 -7
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/eval/__init__.py +0 -4
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/eval/samples.py +45 -29
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/locations.py +2 -1
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/linkers/splinklinker.py +1 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/models.py +18 -9
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/queries.py +7 -3
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/results.py +23 -4
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/sources.py +10 -4
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/dtos.py +1 -2
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/eval.py +1 -3
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/factories/sources.py +1 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/logging.py +50 -2
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/transform.py +8 -8
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/routers/eval.py +16 -27
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/base.py +5 -14
- matchbox_db-0.7.14.dev90/src/matchbox/server/postgresql/adapter/eval.py +312 -0
- matchbox_db-0.7.14.dev90/src/matchbox/server/postgresql/alembic/versions/58ee4e19fb7d_add_tag_to_judgement.py +30 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/orm.py +2 -1
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90/src/matchbox_db.egg-info}/PKG-INFO +2 -1
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox_db.egg-info/SOURCES.txt +2 -2
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox_db.egg-info/requires.txt +1 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/cli/eval/test_app.py +2 -2
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_dags.py +11 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_eval.py +84 -2
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_results.py +42 -8
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/e2e/test_e2e_evaluation.py +64 -36
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/adapter/test_adapter_eval.py +23 -50
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/routes/test_routes_eval.py +0 -46
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/uv.lock +10 -7
- matchbox_db-0.7.14.dev51/src/matchbox/server/postgresql/adapter/eval.py +0 -44
- matchbox_db-0.7.14.dev51/src/matchbox/server/postgresql/utils/evaluation.py +0 -321
- matchbox_db-0.7.14.dev51/test/data/all_companies.csv +0 -1001
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.github/pull_request_template.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.gitignore +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.vscode/launch.json +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.vscode/settings.json +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/CODEOWNERS +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/LICENSE +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/README.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docker-compose.yml +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/dags.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/eval.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/index.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/locations.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/models.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/queries.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/results.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/sources.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/arrow.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/db.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/dtos.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/eval.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/exceptions.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/factories/entities.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/factories/index.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/factories/models.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/factories/scenarios.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/factories/sources.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/hash.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/index.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/logging.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/transform.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/server/api.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/server/backends/postgresql.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/server/index.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/server/uploads.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/assets/matchbox-icon-dark.png +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/assets/matchbox-icon.svg +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/assets/matchbox-logo-dark.svg +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/assets/matchbox-logo-light.svg +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/client/cli.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/client/explore-dags.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/client/install.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/client/link-data.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/client/look-up.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/index.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/server/concepts.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/server/install.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/server/risks.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/stylesheets/extra.css +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/use-cases.md +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/environments/containers.env +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/environments/development.env +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/environments/sample_client.env +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/environments/sample_server.env +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/justfile +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/mkdocs.yml +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/setup.cfg +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/_settings.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/auth.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/modals.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/styles.tcss +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/widgets/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/widgets/assignment.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/widgets/styling.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/widgets/table.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/main.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/server.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/comparison.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/dedupers/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/dedupers/base.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/dedupers/naive.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/linkers/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/linkers/base.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/linkers/deterministic.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/linkers/weighteddeterministic.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/arrow.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/db.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/exceptions.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/factories/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/factories/dags.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/factories/entities.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/factories/models.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/factories/scenarios.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/hash.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/Dockerfile +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/dependencies.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/main.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/routers/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/routers/auth.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/routers/collection.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/static/favicon.png +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/static/swagger-ui-bundle.js +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/static/swagger-ui.css +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/.gitkeep +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/adapter/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/adapter/admin.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/adapter/collections.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/adapter/main.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/adapter/query.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/env.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/script.py.mako +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/05cc4181a0ad_removed_source_key_reference_and_added_.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/13095b44ff09_add_user_model_groups_and_permissions_.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/1907c34cfa1f_create_tables_given_schema.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/3754ae042254_move_orm_to_root_leaf_contains_structure.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/40a8e5ed48f2_create_schema_without_tables.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/4a7c35f86405_move_sourceconfigs_from_sourceaddress_.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/7a2d1b10ac0f_switch_from_location_uri_to_name.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/83b134a86713_simplify_resolution_naming_and_hashing.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/8c7f757b1046_remove_human_resolution_type.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/95c0b5c23446_renaming_sources_to_source_config.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/ae63f79f6b39_renamed_sourcecolumns_to_sourcefields.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/b38d61ab11cc_add_index_to_the_clustersourcekey_table.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/b694eb292dea_add_an_index_to_the_probabilities_.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/beba75a24962_add_pkspace_table.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/c4cb937d00f4_add_modelconfigs.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/c774fd4b69f8_add_upload_stage_to_resolutions.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/dd0c3a9ecdf9_add_migrations_for_first_eval_tables.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/e4122bdf9b0d_renamed_primary_keys_to_just_keys.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/f3c9279437f4_add_content_hash_to_resolutions.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/f500f7d832fe_adds_collections_and_versions_to_scope_.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic.ini +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/db.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/justfile +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/mixin.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/utils/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/utils/db.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/utils/insert.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/utils/query.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/utils/results.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/uploads.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox_db.egg-info/dependency_links.txt +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox_db.egg-info/entry_points.txt +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox_db.egg-info/top_level.txt +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/cli/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/cli/eval/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/cli/eval/test_widgets.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/cli/test_main.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/models/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/models/methodologies/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/models/methodologies/test_dedupers_deterministic.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/models/methodologies/test_linkers_deterministic.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/models/methodologies/test_linkers_probabilistic.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/models/test_comparison.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_handler.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_locations.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_models.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_queries.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_sources.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_entity_factory.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_linked_factory.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_model_factory.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_probability_generation.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_scenarios.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_source_factory.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_testkit_dag.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/test_dto.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/test_eval.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/test_hash.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/test_results.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/test_transform.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/conftest.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/e2e/test_e2e_dag.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/e2e/test_e2e_methodologies.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/fixtures/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/fixtures/client.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/fixtures/db.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/justfile +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/scripts/authorisation.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/scripts/eval.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/adapter/test_adapter_admin.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/adapter/test_adapter_collections.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/adapter/test_adapter_main.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/adapter/test_adapter_query.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/routes/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/routes/test_routes_auth.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/routes/test_routes_collection.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/routes/test_routes_main.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/routes/test_routes_resolution.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/postgresql/__init__.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/postgresql/test_pg_core.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/postgresql/test_pg_migrations.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/postgresql/test_pg_sql.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/test_uploads.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/utils.py +0 -0
- {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/trufflehog-exclude.txt +0 -0
|
@@ -13,13 +13,16 @@ jobs:
|
|
|
13
13
|
contents: read
|
|
14
14
|
|
|
15
15
|
steps:
|
|
16
|
-
- uses: actions/checkout@
|
|
16
|
+
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
17
17
|
|
|
18
18
|
- name: Install uv and Python
|
|
19
|
-
uses: astral-sh/setup-uv@
|
|
19
|
+
uses: astral-sh/setup-uv@ed21f2f24f8dd64503750218de024bcf64c7250a # v7.1.5
|
|
20
20
|
|
|
21
21
|
- name: Install just
|
|
22
|
-
uses: extractions/setup-
|
|
22
|
+
uses: extractions/setup-crate@4993624604c307fbca528d28a3c8b60fa5ecc859 # v1.4.0
|
|
23
|
+
with:
|
|
24
|
+
repo: casey/just
|
|
25
|
+
version: 1.42.4
|
|
23
26
|
|
|
24
27
|
- name: Format and lint
|
|
25
28
|
run: just format
|
|
@@ -37,10 +40,10 @@ jobs:
|
|
|
37
40
|
- "3.13"
|
|
38
41
|
|
|
39
42
|
steps:
|
|
40
|
-
- uses: actions/checkout@
|
|
43
|
+
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
41
44
|
|
|
42
45
|
- name: Install uv and Python
|
|
43
|
-
uses: astral-sh/setup-uv@
|
|
46
|
+
uses: astral-sh/setup-uv@ed21f2f24f8dd64503750218de024bcf64c7250a # v7.1.5
|
|
44
47
|
with:
|
|
45
48
|
enable-cache: true
|
|
46
49
|
cache-dependency-glob: "uv.lock"
|
|
@@ -60,7 +63,7 @@ jobs:
|
|
|
60
63
|
|
|
61
64
|
- name: Dump docker logs
|
|
62
65
|
if: failure()
|
|
63
|
-
uses: jwalton/gh-docker-logs@v2
|
|
66
|
+
uses: jwalton/gh-docker-logs@2741064ab9d7af54b0b1ffb6076cf64c16f0220e # v2.2.2
|
|
64
67
|
|
|
65
68
|
scan-for-secrets:
|
|
66
69
|
runs-on: ubuntu-latest
|
|
@@ -68,7 +71,7 @@ jobs:
|
|
|
68
71
|
contents: read
|
|
69
72
|
|
|
70
73
|
steps:
|
|
71
|
-
- uses: actions/checkout@
|
|
74
|
+
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
72
75
|
with:
|
|
73
76
|
fetch-depth: 0
|
|
74
77
|
|
|
@@ -90,10 +93,10 @@ jobs:
|
|
|
90
93
|
contents: read
|
|
91
94
|
|
|
92
95
|
steps:
|
|
93
|
-
- uses: actions/checkout@
|
|
96
|
+
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
94
97
|
|
|
95
98
|
- name: Install uv and Python
|
|
96
|
-
uses: astral-sh/setup-uv@
|
|
99
|
+
uses: astral-sh/setup-uv@ed21f2f24f8dd64503750218de024bcf64c7250a # v7.1.5
|
|
97
100
|
with:
|
|
98
101
|
python-version: "3.11"
|
|
99
102
|
|
|
@@ -109,12 +112,12 @@ jobs:
|
|
|
109
112
|
contents: read
|
|
110
113
|
|
|
111
114
|
steps:
|
|
112
|
-
- uses: actions/checkout@
|
|
115
|
+
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
113
116
|
with:
|
|
114
117
|
fetch-depth: 0
|
|
115
118
|
|
|
116
119
|
- name: Install uv and Python
|
|
117
|
-
uses: astral-sh/setup-uv@
|
|
120
|
+
uses: astral-sh/setup-uv@ed21f2f24f8dd64503750218de024bcf64c7250a # v7.1.5
|
|
118
121
|
with:
|
|
119
122
|
python-version: "3.11"
|
|
120
123
|
|
|
@@ -33,17 +33,17 @@ jobs:
|
|
|
33
33
|
|
|
34
34
|
steps:
|
|
35
35
|
- name: Checkout repository
|
|
36
|
-
uses: actions/checkout@v6
|
|
36
|
+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
37
37
|
|
|
38
38
|
- name: Initialise CodeQL
|
|
39
|
-
uses: github/codeql-action/init@v4
|
|
39
|
+
uses: github/codeql-action/init@cf1bb45a277cb3c205638b2cd5c984db1c46a412 # v4.31.7
|
|
40
40
|
with:
|
|
41
41
|
languages: ${{ matrix.language }}
|
|
42
42
|
|
|
43
43
|
# Details on CodeQL's query packs refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
|
44
|
-
queries: security-
|
|
44
|
+
queries: security-extended
|
|
45
45
|
|
|
46
46
|
- name: Perform CodeQL Analysis
|
|
47
|
-
uses: github/codeql-action/analyze@v4
|
|
47
|
+
uses: github/codeql-action/analyze@cf1bb45a277cb3c205638b2cd5c984db1c46a412 # v4.31.7
|
|
48
48
|
with:
|
|
49
49
|
category: "/language:${{matrix.language}}"
|
|
@@ -19,19 +19,19 @@ jobs:
|
|
|
19
19
|
|
|
20
20
|
steps:
|
|
21
21
|
- name: Checkout repository
|
|
22
|
-
uses: actions/checkout@
|
|
22
|
+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
23
23
|
with:
|
|
24
24
|
fetch-depth: 0
|
|
25
25
|
|
|
26
26
|
- name: Log in to GitHub packages Docker registry
|
|
27
|
-
uses: docker/login-action@v3
|
|
27
|
+
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
|
28
28
|
with:
|
|
29
29
|
registry: ${{ env.REGISTRY }}
|
|
30
30
|
username: ${{ github.actor }}
|
|
31
31
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
32
32
|
|
|
33
33
|
- name: Install uv
|
|
34
|
-
uses: astral-sh/setup-uv@
|
|
34
|
+
uses: astral-sh/setup-uv@ed21f2f24f8dd64503750218de024bcf64c7250a # v7.1.5
|
|
35
35
|
with:
|
|
36
36
|
python-version: "3.11"
|
|
37
37
|
|
|
@@ -47,14 +47,14 @@ jobs:
|
|
|
47
47
|
run: uv build
|
|
48
48
|
|
|
49
49
|
- name: Upload package artifacts
|
|
50
|
-
uses: actions/upload-artifact@
|
|
50
|
+
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
|
51
51
|
with:
|
|
52
52
|
name: package-dist
|
|
53
53
|
path: ./dist
|
|
54
54
|
|
|
55
55
|
- name: Extract tag metadata for Docker
|
|
56
56
|
id: meta
|
|
57
|
-
uses: docker/metadata-action@v5
|
|
57
|
+
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0
|
|
58
58
|
with:
|
|
59
59
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
60
60
|
tags: |
|
|
@@ -62,7 +62,7 @@ jobs:
|
|
|
62
62
|
type=raw,value=development
|
|
63
63
|
|
|
64
64
|
- name: Build and push Docker image
|
|
65
|
-
uses: docker/build-push-action@v6
|
|
65
|
+
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
|
66
66
|
with:
|
|
67
67
|
context: .
|
|
68
68
|
file: src/matchbox/server/Dockerfile
|
|
@@ -78,10 +78,11 @@ jobs:
|
|
|
78
78
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
79
79
|
|
|
80
80
|
- name: Create development prerelease
|
|
81
|
-
uses: ncipollo/release-action@v1
|
|
81
|
+
uses: ncipollo/release-action@b7eabc95ff50cbeeedec83973935c8f306dfcd0b # v1.20.0
|
|
82
82
|
with:
|
|
83
83
|
tag: development
|
|
84
84
|
name: Development
|
|
85
|
+
immutableCreate: true
|
|
85
86
|
prerelease: true
|
|
86
87
|
body: |
|
|
87
88
|
This is a development build, usually from the latest main branch.
|
|
@@ -101,10 +102,10 @@ jobs:
|
|
|
101
102
|
|
|
102
103
|
steps:
|
|
103
104
|
- name: Download package artifacts
|
|
104
|
-
uses: actions/download-artifact@
|
|
105
|
+
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
|
105
106
|
with:
|
|
106
107
|
name: package-dist
|
|
107
108
|
path: ./dist
|
|
108
109
|
|
|
109
110
|
- name: Publish package to PyPI
|
|
110
|
-
uses: pypa/gh-action-pypi-publish@
|
|
111
|
+
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
|
|
@@ -27,7 +27,7 @@ jobs:
|
|
|
27
27
|
|
|
28
28
|
steps:
|
|
29
29
|
- name: Checkout repository
|
|
30
|
-
uses: actions/checkout@
|
|
30
|
+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
31
31
|
with:
|
|
32
32
|
ref: main
|
|
33
33
|
fetch-depth: 0
|
|
@@ -66,7 +66,7 @@ jobs:
|
|
|
66
66
|
echo "Git tag: $git_tag"
|
|
67
67
|
|
|
68
68
|
- name: Install uv
|
|
69
|
-
uses: astral-sh/setup-uv@
|
|
69
|
+
uses: astral-sh/setup-uv@ed21f2f24f8dd64503750218de024bcf64c7250a # v7.1.5
|
|
70
70
|
with:
|
|
71
71
|
python-version: "3.11"
|
|
72
72
|
|
|
@@ -76,7 +76,7 @@ jobs:
|
|
|
76
76
|
run: uv build
|
|
77
77
|
|
|
78
78
|
- name: Upload package artifacts
|
|
79
|
-
uses: actions/upload-artifact@
|
|
79
|
+
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
|
80
80
|
with:
|
|
81
81
|
name: package-dist
|
|
82
82
|
path: ./dist
|
|
@@ -88,12 +88,12 @@ jobs:
|
|
|
88
88
|
run: uv run mkdocs build
|
|
89
89
|
|
|
90
90
|
- name: Upload documentation artifact
|
|
91
|
-
uses: actions/upload-pages-artifact@
|
|
91
|
+
uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0
|
|
92
92
|
with:
|
|
93
93
|
path: site/
|
|
94
94
|
|
|
95
95
|
- name: Log in to GitHub packages Docker registry
|
|
96
|
-
uses: docker/login-action@v3
|
|
96
|
+
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
|
97
97
|
with:
|
|
98
98
|
registry: ${{ env.REGISTRY }}
|
|
99
99
|
username: ${{ github.actor }}
|
|
@@ -101,7 +101,7 @@ jobs:
|
|
|
101
101
|
|
|
102
102
|
- name: Extract tag metadata for Docker
|
|
103
103
|
id: meta
|
|
104
|
-
uses: docker/metadata-action@v5
|
|
104
|
+
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0
|
|
105
105
|
with:
|
|
106
106
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
107
107
|
tags: |
|
|
@@ -109,7 +109,7 @@ jobs:
|
|
|
109
109
|
type=raw,value=latest
|
|
110
110
|
|
|
111
111
|
- name: Build Docker image
|
|
112
|
-
uses: docker/build-push-action@v6
|
|
112
|
+
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
|
113
113
|
with:
|
|
114
114
|
context: .
|
|
115
115
|
file: src/matchbox/server/Dockerfile
|
|
@@ -126,7 +126,7 @@ jobs:
|
|
|
126
126
|
> ${{ runner.temp }}/docker-image.tar
|
|
127
127
|
|
|
128
128
|
- name: Upload Docker image artifact
|
|
129
|
-
uses: actions/upload-artifact@
|
|
129
|
+
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
|
130
130
|
with:
|
|
131
131
|
name: docker-image
|
|
132
132
|
path: ${{ runner.temp }}/docker-image.tar
|
|
@@ -141,13 +141,13 @@ jobs:
|
|
|
141
141
|
|
|
142
142
|
steps:
|
|
143
143
|
- name: Download package artifacts
|
|
144
|
-
uses: actions/download-artifact@
|
|
144
|
+
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
|
145
145
|
with:
|
|
146
146
|
name: package-dist
|
|
147
147
|
path: ./dist
|
|
148
148
|
|
|
149
149
|
- name: Publish package to PyPI
|
|
150
|
-
uses: pypa/gh-action-pypi-publish@
|
|
150
|
+
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
|
|
151
151
|
|
|
152
152
|
deploy-docs:
|
|
153
153
|
needs: build
|
|
@@ -164,7 +164,7 @@ jobs:
|
|
|
164
164
|
steps:
|
|
165
165
|
- name: Deploy documentation to GitHub Pages
|
|
166
166
|
id: deployment
|
|
167
|
-
uses: actions/deploy-pages@v4
|
|
167
|
+
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5
|
|
168
168
|
|
|
169
169
|
deploy-docker:
|
|
170
170
|
needs: build
|
|
@@ -175,7 +175,7 @@ jobs:
|
|
|
175
175
|
|
|
176
176
|
steps:
|
|
177
177
|
- name: Download Docker image artifact
|
|
178
|
-
uses: actions/download-artifact@
|
|
178
|
+
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
|
179
179
|
with:
|
|
180
180
|
name: docker-image
|
|
181
181
|
path: ${{ runner.temp }}
|
|
@@ -184,7 +184,7 @@ jobs:
|
|
|
184
184
|
run: docker load --input ${{ runner.temp }}/docker-image.tar
|
|
185
185
|
|
|
186
186
|
- name: Log in to GitHub packages Docker registry
|
|
187
|
-
uses: docker/login-action@v3
|
|
187
|
+
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
|
188
188
|
with:
|
|
189
189
|
registry: ${{ env.REGISTRY }}
|
|
190
190
|
username: ${{ github.actor }}
|
|
@@ -201,8 +201,9 @@ jobs:
|
|
|
201
201
|
|
|
202
202
|
steps:
|
|
203
203
|
- name: Create tag and GitHub release
|
|
204
|
-
uses: ncipollo/release-action@v1
|
|
204
|
+
uses: ncipollo/release-action@b7eabc95ff50cbeeedec83973935c8f306dfcd0b # v1.20.0
|
|
205
205
|
with:
|
|
206
206
|
tag: ${{ needs.build.outputs.tag }}
|
|
207
207
|
name: ${{ needs.build.outputs.tag }}
|
|
208
|
+
immutableCreate: true
|
|
208
209
|
generateReleaseNotes: true
|
|
@@ -31,7 +31,7 @@ repos:
|
|
|
31
31
|
|
|
32
32
|
# Mandatory internal hooks
|
|
33
33
|
- repo: https://github.com/uktrade/github-standards
|
|
34
|
-
rev: v1.
|
|
34
|
+
rev: v1.2.0 # update periodically with pre-commit autoupdate
|
|
35
35
|
hooks:
|
|
36
36
|
- id: run-security-scan
|
|
37
37
|
verbose: false
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: matchbox-db
|
|
3
|
-
Version: 0.7.14.
|
|
3
|
+
Version: 0.7.14.dev90
|
|
4
4
|
Summary: A framework for orchestrating and comparing data linking and deduplication methodologies.
|
|
5
5
|
Author: Department for Business and Trade
|
|
6
6
|
Project-URL: Documentation, https://uktrade.github.io/matchbox/
|
|
@@ -18,6 +18,7 @@ Requires-Dist: httpx>=0.28.0
|
|
|
18
18
|
Requires-Dist: pandas>=2.2.3
|
|
19
19
|
Requires-Dist: polars-hash>=0.5.3
|
|
20
20
|
Requires-Dist: polars>=1.32.3
|
|
21
|
+
Requires-Dist: psutil>=7.1.3
|
|
21
22
|
Requires-Dist: psycopg[binary,pool]>=3.2.6
|
|
22
23
|
Requires-Dist: pyarrow>=17.0.0
|
|
23
24
|
Requires-Dist: pydantic-settings>=2.5.2
|
|
@@ -7,20 +7,36 @@ After running models to deduplicate and link your data, you’ll likely want to
|
|
|
7
7
|
|
|
8
8
|
To calculate these, we need a **ground truth** - a set of correct matches created by people. This is called **validation data**.
|
|
9
9
|
|
|
10
|
+
## Creating a sample set
|
|
11
|
+
|
|
12
|
+
First, you need to create a local set of sample clusters that you want to evaluate. If you're evaluating a single model:
|
|
13
|
+
|
|
14
|
+
```python
|
|
15
|
+
dag = ... # your DAG, defined elsewhere
|
|
16
|
+
dag.resolve().as_dump().write_parquet("samples.pq")
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Or, if you're comparing two models:
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
dag = ... # your DAG, defined elsewhere
|
|
23
|
+
|
|
24
|
+
resolved_model1 = dag.resolve("model1")
|
|
25
|
+
resolved_model2 = dag.resolve("model2")
|
|
26
|
+
# Forms clusters as the union of the clusters output by each model
|
|
27
|
+
resolved_joint = resolved_model1.merge(resolved_model2)
|
|
28
|
+
resolved_joint.as_dump().write_parquet("samples.pq")
|
|
29
|
+
```
|
|
30
|
+
|
|
10
31
|
## Creating validation data
|
|
11
32
|
|
|
12
33
|
Matchbox provides a terminal-based UI to help you create this validation data. Here's how it works:
|
|
13
34
|
|
|
14
|
-
1. **Launch the evaluation tool** using `matchbox eval --collection <collection_name> --user <your_username>`
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
3. In the terminal interface, you'll review each cluster:
|
|
20
|
-
* Use keyboard commands like `b+1,3,5` to assign rows 1, 3, and 5 to group B
|
|
21
|
-
* Press `space` to send your judgements to Matchbox
|
|
22
|
-
* Skip to the next item without reviewing with `→` (right arrow)
|
|
23
|
-
* Press `?` or `F1` for help with commands
|
|
35
|
+
1. **Launch the evaluation tool** using `matchbox eval --collection <collection_name> --user <your_username> --file <path_to_samples>`
|
|
36
|
+
- Define `MB__CLIENT__DEFAULT_WAREHOUSE` (or use `--warehouse <connection_string>`) so the CLI can reach your warehouse.
|
|
37
|
+
- Use `--tag <session_tag>` to tag your judgements so they can be filtered later
|
|
38
|
+
2. Matchbox will **load clusters** from your warehouse, for you to review.
|
|
39
|
+
3. In the terminal interface, you will review each cluster.
|
|
24
40
|
|
|
25
41
|
Once enough users have reviewed clusters, this data can be used to evaluate model performance.
|
|
26
42
|
|
|
@@ -80,11 +96,11 @@ model = source.query().deduper(
|
|
|
80
96
|
results = model.run()
|
|
81
97
|
```
|
|
82
98
|
|
|
83
|
-
Download validation data:
|
|
99
|
+
Download validation data, filtering by tag:
|
|
84
100
|
|
|
85
101
|
```python
|
|
86
102
|
from matchbox.client.eval import EvalData
|
|
87
|
-
eval_data = EvalData()
|
|
103
|
+
eval_data = EvalData(tag="companies__15_02_2025")
|
|
88
104
|
```
|
|
89
105
|
|
|
90
106
|
Check precision and recall at a specific threshold:
|
|
@@ -93,17 +109,6 @@ Check precision and recall at a specific threshold:
|
|
|
93
109
|
precision, recall = eval_data.precision_recall(results, threshold=0.5)
|
|
94
110
|
```
|
|
95
111
|
|
|
96
|
-
Compare multiple model resolutions:
|
|
97
|
-
|
|
98
|
-
```python
|
|
99
|
-
from matchbox.client.eval import compare_models, ModelResolutionPath
|
|
100
|
-
|
|
101
|
-
comparison = compare_models([
|
|
102
|
-
ModelResolutionPath(collection="companies", run=1, name="deduper"),
|
|
103
|
-
ModelResolutionPath(collection="companies", run=2, name="deduper"),
|
|
104
|
-
])
|
|
105
|
-
```
|
|
106
|
-
|
|
107
112
|
!!! tip "Deterministic models"
|
|
108
113
|
Some types of model (like the `NaiveDeduper` used in the example) only output 1s for the matches they make, hence **threshold truth tuning doesn't apply**:
|
|
109
114
|
|
|
@@ -166,3 +166,22 @@ We commit as frequently as possible. We keep our commits as atomic as possible.
|
|
|
166
166
|
### AI
|
|
167
167
|
|
|
168
168
|
In order to help reviewers prioritise their time appropriately, we expect any use of AI to be declared in your PR comment.
|
|
169
|
+
|
|
170
|
+
### Actions
|
|
171
|
+
|
|
172
|
+
In order to avoid supply chain attacks, we [pin all actions in workflows](https://codeql.github.com/codeql-query-help/actions/actions-unpinned-tag/).
|
|
173
|
+
|
|
174
|
+
When upgrading actions, we expect PR comments to confirm that the new commit is safe. You need to cover:
|
|
175
|
+
|
|
176
|
+
* That the commit's `action.yml` only uses pinned child actions, if it has children
|
|
177
|
+
* That there are no critical security concerns raised in the issues
|
|
178
|
+
|
|
179
|
+
See [#395](https://github.com/uktrade/matchbox/pull/395) for an example of the due diligence we expect.
|
|
180
|
+
|
|
181
|
+
We suggest using tools like [`wayneashleyberry/gh-act`](https://github.com/wayneashleyberry/gh-act) to help manage this, allowing you to perform the upgrade in a single line:
|
|
182
|
+
|
|
183
|
+
```shell
|
|
184
|
+
gh act update --pin
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
You will still need to independently verify that the new pins are safe.
|
|
@@ -17,6 +17,7 @@ dependencies = [
|
|
|
17
17
|
"pandas>=2.2.3",
|
|
18
18
|
"polars-hash>=0.5.3",
|
|
19
19
|
"polars>=1.32.3",
|
|
20
|
+
"psutil>=7.1.3",
|
|
20
21
|
"psycopg[binary, pool]>=3.2.6",
|
|
21
22
|
"pyarrow>=17.0.0",
|
|
22
23
|
"pydantic-settings>=2.5.2",
|
|
@@ -89,7 +90,8 @@ default-groups = ["dev", "typing"]
|
|
|
89
90
|
package = true
|
|
90
91
|
upgrade-package = ["ruff"]
|
|
91
92
|
constraint-dependencies = [
|
|
92
|
-
"urllib3>=2.
|
|
93
|
+
"urllib3>=2.6.0",
|
|
94
|
+
"werkzeug>=3.1.4",
|
|
93
95
|
"setuptools-scm>=9.2.0"
|
|
94
96
|
]
|
|
95
97
|
|
|
@@ -50,7 +50,7 @@ from matchbox.common.dtos import (
|
|
|
50
50
|
UploadStage,
|
|
51
51
|
User,
|
|
52
52
|
)
|
|
53
|
-
from matchbox.common.eval import Judgement
|
|
53
|
+
from matchbox.common.eval import Judgement
|
|
54
54
|
from matchbox.common.exceptions import (
|
|
55
55
|
MatchboxCollectionNotFoundError,
|
|
56
56
|
MatchboxDataNotFound,
|
|
@@ -65,7 +65,7 @@ from matchbox.common.exceptions import (
|
|
|
65
65
|
MatchboxUserNotFoundError,
|
|
66
66
|
)
|
|
67
67
|
from matchbox.common.hash import hash_to_base64
|
|
68
|
-
from matchbox.common.logging import logger,
|
|
68
|
+
from matchbox.common.logging import logger, profile_time
|
|
69
69
|
|
|
70
70
|
URLEncodeHandledType = str | int | float | bytes | StrEnum
|
|
71
71
|
|
|
@@ -422,7 +422,7 @@ def update_resolution(
|
|
|
422
422
|
return ResourceOperationStatus.model_validate(res.json())
|
|
423
423
|
|
|
424
424
|
|
|
425
|
-
@
|
|
425
|
+
@profile_time(kwarg="path")
|
|
426
426
|
@http_retry
|
|
427
427
|
def get_resolution(path: ResolutionPath) -> Resolution | None:
|
|
428
428
|
"""Get a resolution from Matchbox."""
|
|
@@ -435,7 +435,7 @@ def get_resolution(path: ResolutionPath) -> Resolution | None:
|
|
|
435
435
|
return Resolution.model_validate(res.json())
|
|
436
436
|
|
|
437
437
|
|
|
438
|
-
@
|
|
438
|
+
@profile_time(kwarg="path")
|
|
439
439
|
@http_retry
|
|
440
440
|
def set_data(path: ResolutionPath, data: pl.DataFrame | Table) -> None:
|
|
441
441
|
"""Upload source hashes or model results to server."""
|
|
@@ -482,7 +482,7 @@ def get_resolution_stage(path: ResolutionPath) -> UploadStage:
|
|
|
482
482
|
return upload_info.stage
|
|
483
483
|
|
|
484
484
|
|
|
485
|
-
@
|
|
485
|
+
@profile_time(kwarg="path")
|
|
486
486
|
@http_retry
|
|
487
487
|
def get_results(path: ModelResolutionPath) -> Table:
|
|
488
488
|
"""Get model results from Matchbox."""
|
|
@@ -533,16 +533,6 @@ def sample_for_eval(n: int, resolution: ModelResolutionPath, user_name: str) ->
|
|
|
533
533
|
return read_table(BytesIO(res.content))
|
|
534
534
|
|
|
535
535
|
|
|
536
|
-
@http_retry
|
|
537
|
-
def compare_models(
|
|
538
|
-
resolutions: list[ModelResolutionPath],
|
|
539
|
-
) -> ModelComparison:
|
|
540
|
-
"""Get a model comparison for a set of model resolutions."""
|
|
541
|
-
res = CLIENT.post("/eval/compare", json=[r.model_dump() for r in resolutions])
|
|
542
|
-
scores = {resolution: tuple(pr) for resolution, pr in res.json().items()}
|
|
543
|
-
return scores
|
|
544
|
-
|
|
545
|
-
|
|
546
536
|
@http_retry
|
|
547
537
|
def send_eval_judgement(judgement: Judgement) -> None:
|
|
548
538
|
"""Send judgements to the server."""
|
|
@@ -554,10 +544,10 @@ def send_eval_judgement(judgement: Judgement) -> None:
|
|
|
554
544
|
|
|
555
545
|
|
|
556
546
|
@http_retry
|
|
557
|
-
def download_eval_data() -> tuple[Table, Table]:
|
|
547
|
+
def download_eval_data(tag: str | None = None) -> tuple[Table, Table]:
|
|
558
548
|
"""Download all judgements from the server."""
|
|
559
549
|
logger.debug("Retrieving all judgements.")
|
|
560
|
-
res = CLIENT.get("/eval/judgements")
|
|
550
|
+
res = CLIENT.get("/eval/judgements", params=url_params({"tag": tag}))
|
|
561
551
|
|
|
562
552
|
zip_bytes = BytesIO(res.content)
|
|
563
553
|
with zipfile.ZipFile(zip_bytes, "r") as zip_file:
|
|
@@ -592,8 +582,7 @@ def count_backend_items(
|
|
|
592
582
|
log_prefix = "Backend count"
|
|
593
583
|
logger.debug("Counting", prefix=log_prefix)
|
|
594
584
|
|
|
595
|
-
|
|
596
|
-
res = CLIENT.get("/database/count", params=url_params(params))
|
|
585
|
+
res = CLIENT.get("/database/count", params=url_params({"entity": entity}))
|
|
597
586
|
|
|
598
587
|
counts = res.json()
|
|
599
588
|
logger.debug(f"Counts: {counts}", prefix=log_prefix)
|
|
@@ -19,7 +19,7 @@ from matchbox.client.cli.eval.widgets.styling import get_group_style
|
|
|
19
19
|
from matchbox.client.cli.eval.widgets.table import ComparisonDisplayTable
|
|
20
20
|
from matchbox.client.dags import DAG
|
|
21
21
|
from matchbox.client.eval import EvaluationItem, create_judgement, get_samples
|
|
22
|
-
from matchbox.common.dtos import
|
|
22
|
+
from matchbox.common.dtos import ModelResolutionPath
|
|
23
23
|
from matchbox.common.exceptions import MatchboxClientSettingsException
|
|
24
24
|
|
|
25
25
|
logger = logging.getLogger(__name__)
|
|
@@ -110,6 +110,8 @@ class EntityResolutionApp(App):
|
|
|
110
110
|
resolution: ModelResolutionPath
|
|
111
111
|
user_name: str
|
|
112
112
|
dag: DAG
|
|
113
|
+
session_tag: str | None
|
|
114
|
+
sample_file: str | None
|
|
113
115
|
show_help: bool
|
|
114
116
|
|
|
115
117
|
queue: EvaluationQueue
|
|
@@ -117,10 +119,12 @@ class EntityResolutionApp(App):
|
|
|
117
119
|
|
|
118
120
|
def __init__(
|
|
119
121
|
self,
|
|
120
|
-
resolution: ModelResolutionName,
|
|
121
122
|
user: str,
|
|
122
123
|
num_samples: int = 5,
|
|
124
|
+
resolution: ModelResolutionPath | None = None,
|
|
123
125
|
dag: DAG | None = None,
|
|
126
|
+
session_tag: str | None = None,
|
|
127
|
+
sample_file: str | None = None,
|
|
124
128
|
show_help: bool = False,
|
|
125
129
|
scroll_debounce_delay: float | None = 0.3,
|
|
126
130
|
) -> None:
|
|
@@ -131,20 +135,30 @@ class EntityResolutionApp(App):
|
|
|
131
135
|
num_samples: Number of clusters to sample for evaluation
|
|
132
136
|
user: Username for authentication (overrides settings)
|
|
133
137
|
dag: Pre-loaded DAG with warehouse location attached
|
|
138
|
+
session_tag: String to use for tagging judgements
|
|
139
|
+
sample_file: Path to pre-compiled sample file.
|
|
140
|
+
If set, ignores resolutions.
|
|
134
141
|
show_help: Whether to show help on start
|
|
135
142
|
scroll_debounce_delay: Delay before updating column headers after scroll.
|
|
136
143
|
Set to None to disable debouncing (useful for tests).
|
|
137
144
|
"""
|
|
138
145
|
super().__init__()
|
|
139
146
|
|
|
140
|
-
|
|
141
|
-
|
|
147
|
+
if not (resolution or sample_file):
|
|
148
|
+
raise ValueError("Either a resolution or a sample file must be set")
|
|
149
|
+
|
|
150
|
+
self.resolution = resolution
|
|
142
151
|
self.user_name = user
|
|
152
|
+
self.sample_limit = num_samples
|
|
143
153
|
self.dag = dag
|
|
144
|
-
self.
|
|
154
|
+
self.session_tag = session_tag
|
|
155
|
+
self.sample_file = sample_file
|
|
156
|
+
|
|
145
157
|
self.show_help = show_help
|
|
146
158
|
self._scroll_debounce_delay = scroll_debounce_delay
|
|
147
159
|
|
|
160
|
+
self.queue = EvaluationQueue()
|
|
161
|
+
|
|
148
162
|
# Lifecycle methods
|
|
149
163
|
def compose(self) -> ComposeResult:
|
|
150
164
|
"""Compose the main application UI."""
|
|
@@ -323,9 +337,10 @@ class EntityResolutionApp(App):
|
|
|
323
337
|
try:
|
|
324
338
|
new_samples_dict = get_samples(
|
|
325
339
|
n=needed,
|
|
326
|
-
resolution=self.resolution.name,
|
|
340
|
+
resolution=self.resolution.name if self.resolution else None,
|
|
327
341
|
user_name=self.user_name,
|
|
328
342
|
dag=self.dag,
|
|
343
|
+
sample_file=self.sample_file,
|
|
329
344
|
)
|
|
330
345
|
except Exception as e: # noqa: BLE001
|
|
331
346
|
logger.warning(f"Failed to fetch samples: {type(e).__name__}: {e}")
|
|
@@ -371,7 +386,10 @@ class EntityResolutionApp(App):
|
|
|
371
386
|
if self.user_name is None:
|
|
372
387
|
raise RuntimeError("User name is not set")
|
|
373
388
|
judgement = create_judgement(
|
|
374
|
-
current.item,
|
|
389
|
+
item=current.item,
|
|
390
|
+
assignments=current.assignments,
|
|
391
|
+
user_name=self.user_name,
|
|
392
|
+
tag=self.session_tag,
|
|
375
393
|
)
|
|
376
394
|
_handler.send_eval_judgement(judgement)
|
|
377
395
|
except Exception as exc:
|
|
@@ -51,6 +51,22 @@ def evaluate(
|
|
|
51
51
|
help="Log file path to redirect all logging output (keeps UI clean)",
|
|
52
52
|
),
|
|
53
53
|
] = None,
|
|
54
|
+
sample_file: Annotated[
|
|
55
|
+
str | None,
|
|
56
|
+
typer.Option(
|
|
57
|
+
"--file",
|
|
58
|
+
"-f",
|
|
59
|
+
help="Pre-compiled sample file. If set, ignores resolutions parameters.",
|
|
60
|
+
),
|
|
61
|
+
] = None,
|
|
62
|
+
session_tag: Annotated[
|
|
63
|
+
str | None,
|
|
64
|
+
typer.Option(
|
|
65
|
+
"--tag",
|
|
66
|
+
"-t",
|
|
67
|
+
help="String to use to tag judgements sent to the server.",
|
|
68
|
+
),
|
|
69
|
+
] = None,
|
|
54
70
|
) -> None:
|
|
55
71
|
"""Start the interactive entity resolution evaluation tool.
|
|
56
72
|
|
|
@@ -88,9 +104,11 @@ def evaluate(
|
|
|
88
104
|
try:
|
|
89
105
|
# Create app with loaded DAG (not warehouse string)
|
|
90
106
|
app = EntityResolutionApp(
|
|
91
|
-
resolution=model.resolution_path
|
|
107
|
+
resolution=model.resolution_path,
|
|
92
108
|
user=user,
|
|
93
109
|
dag=dag,
|
|
110
|
+
session_tag=session_tag,
|
|
111
|
+
sample_file=sample_file,
|
|
94
112
|
show_help=True,
|
|
95
113
|
)
|
|
96
114
|
app.run()
|