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.
Files changed (246) hide show
  1. matchbox_db-0.7.14.dev90/.github/dependabot.yml +11 -0
  2. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.github/workflows/ci.yml +14 -11
  3. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.github/workflows/codeql.yml +4 -4
  4. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.github/workflows/prerelease.yml +10 -9
  5. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.github/workflows/release.yml +15 -14
  6. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.pre-commit-config.yaml +1 -1
  7. {matchbox_db-0.7.14.dev51/src/matchbox_db.egg-info → matchbox_db-0.7.14.dev90}/PKG-INFO +2 -1
  8. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/client/evaluation.md +28 -23
  9. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/contributing.md +19 -0
  10. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/pyproject.toml +3 -1
  11. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/_handler.py +8 -19
  12. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/app.py +25 -7
  13. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/run.py +19 -1
  14. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/dags.py +31 -7
  15. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/eval/__init__.py +0 -4
  16. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/eval/samples.py +45 -29
  17. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/locations.py +2 -1
  18. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/linkers/splinklinker.py +1 -0
  19. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/models.py +18 -9
  20. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/queries.py +7 -3
  21. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/results.py +23 -4
  22. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/sources.py +10 -4
  23. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/dtos.py +1 -2
  24. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/eval.py +1 -3
  25. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/factories/sources.py +1 -0
  26. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/logging.py +50 -2
  27. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/transform.py +8 -8
  28. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/routers/eval.py +16 -27
  29. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/base.py +5 -14
  30. matchbox_db-0.7.14.dev90/src/matchbox/server/postgresql/adapter/eval.py +312 -0
  31. matchbox_db-0.7.14.dev90/src/matchbox/server/postgresql/alembic/versions/58ee4e19fb7d_add_tag_to_judgement.py +30 -0
  32. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/orm.py +2 -1
  33. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90/src/matchbox_db.egg-info}/PKG-INFO +2 -1
  34. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox_db.egg-info/SOURCES.txt +2 -2
  35. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox_db.egg-info/requires.txt +1 -0
  36. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/cli/eval/test_app.py +2 -2
  37. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_dags.py +11 -0
  38. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_eval.py +84 -2
  39. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_results.py +42 -8
  40. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/e2e/test_e2e_evaluation.py +64 -36
  41. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/adapter/test_adapter_eval.py +23 -50
  42. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/routes/test_routes_eval.py +0 -46
  43. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/uv.lock +10 -7
  44. matchbox_db-0.7.14.dev51/src/matchbox/server/postgresql/adapter/eval.py +0 -44
  45. matchbox_db-0.7.14.dev51/src/matchbox/server/postgresql/utils/evaluation.py +0 -321
  46. matchbox_db-0.7.14.dev51/test/data/all_companies.csv +0 -1001
  47. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.github/pull_request_template.md +0 -0
  48. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.gitignore +0 -0
  49. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.vscode/launch.json +0 -0
  50. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/.vscode/settings.json +0 -0
  51. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/CODEOWNERS +0 -0
  52. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/LICENSE +0 -0
  53. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/README.md +0 -0
  54. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docker-compose.yml +0 -0
  55. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/dags.md +0 -0
  56. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/eval.md +0 -0
  57. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/index.md +0 -0
  58. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/locations.md +0 -0
  59. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/models.md +0 -0
  60. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/queries.md +0 -0
  61. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/results.md +0 -0
  62. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/client/sources.md +0 -0
  63. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/arrow.md +0 -0
  64. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/db.md +0 -0
  65. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/dtos.md +0 -0
  66. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/eval.md +0 -0
  67. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/exceptions.md +0 -0
  68. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/factories/entities.md +0 -0
  69. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/factories/index.md +0 -0
  70. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/factories/models.md +0 -0
  71. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/factories/scenarios.md +0 -0
  72. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/factories/sources.md +0 -0
  73. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/hash.md +0 -0
  74. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/index.md +0 -0
  75. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/logging.md +0 -0
  76. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/common/transform.md +0 -0
  77. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/server/api.md +0 -0
  78. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/server/backends/postgresql.md +0 -0
  79. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/server/index.md +0 -0
  80. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/api/server/uploads.md +0 -0
  81. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/assets/matchbox-icon-dark.png +0 -0
  82. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/assets/matchbox-icon.svg +0 -0
  83. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/assets/matchbox-logo-dark.svg +0 -0
  84. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/assets/matchbox-logo-light.svg +0 -0
  85. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/client/cli.md +0 -0
  86. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/client/explore-dags.md +0 -0
  87. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/client/install.md +0 -0
  88. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/client/link-data.md +0 -0
  89. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/client/look-up.md +0 -0
  90. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/index.md +0 -0
  91. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/server/concepts.md +0 -0
  92. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/server/install.md +0 -0
  93. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/server/risks.md +0 -0
  94. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/stylesheets/extra.css +0 -0
  95. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/docs/use-cases.md +0 -0
  96. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/environments/containers.env +0 -0
  97. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/environments/development.env +0 -0
  98. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/environments/sample_client.env +0 -0
  99. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/environments/sample_server.env +0 -0
  100. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/justfile +0 -0
  101. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/mkdocs.yml +0 -0
  102. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/setup.cfg +0 -0
  103. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/__init__.py +0 -0
  104. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/__init__.py +0 -0
  105. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/_settings.py +0 -0
  106. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/__init__.py +0 -0
  107. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/auth.py +0 -0
  108. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/__init__.py +0 -0
  109. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/modals.py +0 -0
  110. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/styles.tcss +0 -0
  111. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/widgets/__init__.py +0 -0
  112. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/widgets/assignment.py +0 -0
  113. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/widgets/styling.py +0 -0
  114. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/eval/widgets/table.py +0 -0
  115. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/main.py +0 -0
  116. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/cli/server.py +0 -0
  117. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/__init__.py +0 -0
  118. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/comparison.py +0 -0
  119. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/dedupers/__init__.py +0 -0
  120. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/dedupers/base.py +0 -0
  121. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/dedupers/naive.py +0 -0
  122. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/linkers/__init__.py +0 -0
  123. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/linkers/base.py +0 -0
  124. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/linkers/deterministic.py +0 -0
  125. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/client/models/linkers/weighteddeterministic.py +0 -0
  126. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/__init__.py +0 -0
  127. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/arrow.py +0 -0
  128. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/db.py +0 -0
  129. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/exceptions.py +0 -0
  130. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/factories/__init__.py +0 -0
  131. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/factories/dags.py +0 -0
  132. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/factories/entities.py +0 -0
  133. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/factories/models.py +0 -0
  134. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/factories/scenarios.py +0 -0
  135. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/common/hash.py +0 -0
  136. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/Dockerfile +0 -0
  137. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/__init__.py +0 -0
  138. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/__init__.py +0 -0
  139. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/dependencies.py +0 -0
  140. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/main.py +0 -0
  141. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/routers/__init__.py +0 -0
  142. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/routers/auth.py +0 -0
  143. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/routers/collection.py +0 -0
  144. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/static/favicon.png +0 -0
  145. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/static/swagger-ui-bundle.js +0 -0
  146. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/api/static/swagger-ui.css +0 -0
  147. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/.gitkeep +0 -0
  148. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/__init__.py +0 -0
  149. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/adapter/__init__.py +0 -0
  150. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/adapter/admin.py +0 -0
  151. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/adapter/collections.py +0 -0
  152. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/adapter/main.py +0 -0
  153. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/adapter/query.py +0 -0
  154. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/env.py +0 -0
  155. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/script.py.mako +0 -0
  156. {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
  157. {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
  158. {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
  159. {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
  160. {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
  161. {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
  162. {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
  163. {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
  164. {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
  165. {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
  166. {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
  167. {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
  168. {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
  169. {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
  170. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic/versions/c4cb937d00f4_add_modelconfigs.py +0 -0
  171. {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
  172. {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
  173. {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
  174. {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
  175. {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
  176. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/alembic.ini +0 -0
  177. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/db.py +0 -0
  178. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/justfile +0 -0
  179. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/mixin.py +0 -0
  180. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/utils/__init__.py +0 -0
  181. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/utils/db.py +0 -0
  182. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/utils/insert.py +0 -0
  183. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/utils/query.py +0 -0
  184. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/postgresql/utils/results.py +0 -0
  185. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox/server/uploads.py +0 -0
  186. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox_db.egg-info/dependency_links.txt +0 -0
  187. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox_db.egg-info/entry_points.txt +0 -0
  188. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/src/matchbox_db.egg-info/top_level.txt +0 -0
  189. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/__init__.py +0 -0
  190. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/__init__.py +0 -0
  191. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/cli/__init__.py +0 -0
  192. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/cli/eval/__init__.py +0 -0
  193. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/cli/eval/test_widgets.py +0 -0
  194. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/cli/test_main.py +0 -0
  195. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/models/__init__.py +0 -0
  196. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/models/methodologies/__init__.py +0 -0
  197. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/models/methodologies/test_dedupers_deterministic.py +0 -0
  198. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/models/methodologies/test_linkers_deterministic.py +0 -0
  199. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/models/methodologies/test_linkers_probabilistic.py +0 -0
  200. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/models/test_comparison.py +0 -0
  201. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_handler.py +0 -0
  202. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_locations.py +0 -0
  203. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_models.py +0 -0
  204. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_queries.py +0 -0
  205. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/client/test_sources.py +0 -0
  206. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/__init__.py +0 -0
  207. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/__init__.py +0 -0
  208. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_entity_factory.py +0 -0
  209. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_linked_factory.py +0 -0
  210. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_model_factory.py +0 -0
  211. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_probability_generation.py +0 -0
  212. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_scenarios.py +0 -0
  213. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_source_factory.py +0 -0
  214. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/factories/test_testkit_dag.py +0 -0
  215. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/test_dto.py +0 -0
  216. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/test_eval.py +0 -0
  217. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/test_hash.py +0 -0
  218. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/test_results.py +0 -0
  219. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/common/test_transform.py +0 -0
  220. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/conftest.py +0 -0
  221. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/e2e/test_e2e_dag.py +0 -0
  222. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/e2e/test_e2e_methodologies.py +0 -0
  223. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/fixtures/__init__.py +0 -0
  224. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/fixtures/client.py +0 -0
  225. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/fixtures/db.py +0 -0
  226. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/justfile +0 -0
  227. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/scripts/authorisation.py +0 -0
  228. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/scripts/eval.py +0 -0
  229. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/__init__.py +0 -0
  230. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/adapter/test_adapter_admin.py +0 -0
  231. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/adapter/test_adapter_collections.py +0 -0
  232. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/adapter/test_adapter_main.py +0 -0
  233. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/adapter/test_adapter_query.py +0 -0
  234. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/__init__.py +0 -0
  235. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/routes/__init__.py +0 -0
  236. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/routes/test_routes_auth.py +0 -0
  237. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/routes/test_routes_collection.py +0 -0
  238. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/routes/test_routes_main.py +0 -0
  239. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/api/routes/test_routes_resolution.py +0 -0
  240. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/postgresql/__init__.py +0 -0
  241. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/postgresql/test_pg_core.py +0 -0
  242. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/postgresql/test_pg_migrations.py +0 -0
  243. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/postgresql/test_pg_sql.py +0 -0
  244. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/server/test_uploads.py +0 -0
  245. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/test/utils.py +0 -0
  246. {matchbox_db-0.7.14.dev51 → matchbox_db-0.7.14.dev90}/trufflehog-exclude.txt +0 -0
@@ -0,0 +1,11 @@
1
+ ---
2
+ version: 2
3
+ updates:
4
+ - package-ecosystem: "github-actions"
5
+ directory: "/"
6
+ schedule:
7
+ interval: "weekly"
8
+ - package-ecosystem: uv
9
+ directory: "/"
10
+ schedule:
11
+ interval: "weekly"
@@ -13,13 +13,16 @@ jobs:
13
13
  contents: read
14
14
 
15
15
  steps:
16
- - uses: actions/checkout@v5
16
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
17
17
 
18
18
  - name: Install uv and Python
19
- uses: astral-sh/setup-uv@v6
19
+ uses: astral-sh/setup-uv@ed21f2f24f8dd64503750218de024bcf64c7250a # v7.1.5
20
20
 
21
21
  - name: Install just
22
- uses: extractions/setup-just@v2
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@v5
43
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
41
44
 
42
45
  - name: Install uv and Python
43
- uses: astral-sh/setup-uv@v6
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@v5
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@v5
96
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
94
97
 
95
98
  - name: Install uv and Python
96
- uses: astral-sh/setup-uv@v6
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@v5
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@v6
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-and-quality
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@v5
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@v6
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@v4
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@v4
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@release/v1
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@v5
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@v6
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@v4
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@v3
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@v4
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@v4
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@release/v1
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@v4
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.1.2 # update periodically with pre-commit autoupdate
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.dev51
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
- a. You can also set your username with the `MB__CLIENT__USER` environment variable.
16
- b. Define `MB__CLIENT__DEFAULT_WAREHOUSE` (or use `--warehouse <connection_string>`) so the CLI can reach your warehouse.
17
- c. If your DAG isn't complete, include `--resolution <resolution_name>` to pick a specific run.
18
- 2. Matchbox will **download clusters** for you to review. It avoids clusters you've already judged and focuses on ones the model is unsure about.
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.5.0",
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, ModelComparison
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, profile
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
- @profile(kwarg="path")
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
- @profile(kwarg="path")
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
- @profile(kwarg="path")
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
- params = {"entity": entity} if entity else {}
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 ModelResolutionName, ModelResolutionPath
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
- self.queue = EvaluationQueue()
141
- self.sample_limit = num_samples
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.resolution = dag.get_model(resolution).resolution_path
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, current.assignments, self.user_name
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.name,
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()