matchlab 0.1.0.dev4__tar.gz → 0.1.1__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 (235) hide show
  1. matchlab-0.1.1/.github/CODEOWNERS +1 -0
  2. matchlab-0.1.1/.github/SECURITY_CHECKLIST.md +33 -0
  3. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/.github/pull_request_template.md +1 -0
  4. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/.github/skills/lucid-docs/readability.py +1 -1
  5. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/.github/workflows/cd.yml +1 -1
  6. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/.github/workflows/ci.yml +1 -1
  7. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/.github/workflows/codeql.yml +1 -0
  8. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/.gitignore +1 -1
  9. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/.pre-commit-config.yaml +6 -6
  10. {matchlab-0.1.0.dev4/src/matchlab.egg-info → matchlab-0.1.1}/PKG-INFO +9 -3
  11. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/README.md +8 -2
  12. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/benchmarks/__main__.py +1 -1
  13. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/benchmarks/measure.py +2 -2
  14. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/benchmarks/report.py +1 -1
  15. matchlab-0.1.0.dev4/docs/api/steps.md → matchlab-0.1.1/docs/api/plan/steps/index.md +4 -0
  16. matchlab-0.1.1/docs/api/plan/steps/models/dedupers/index.md +16 -0
  17. matchlab-0.1.1/docs/api/plan/steps/models/dedupers/naive.md +12 -0
  18. matchlab-0.1.0.dev4/docs/api/models.md → matchlab-0.1.1/docs/api/plan/steps/models/index.md +3 -20
  19. matchlab-0.1.1/docs/api/plan/steps/models/linkers/deterministic.md +12 -0
  20. matchlab-0.1.1/docs/api/plan/steps/models/linkers/index.md +16 -0
  21. matchlab-0.1.1/docs/api/plan/steps/models/linkers/splink.md +12 -0
  22. matchlab-0.1.1/docs/api/plan/steps/models/linkers/weighted-deterministic.md +12 -0
  23. matchlab-0.1.1/docs/api/plan/steps/resolvers/components.md +12 -0
  24. matchlab-0.1.0.dev4/docs/api/sources.md → matchlab-0.1.1/docs/api/plan/steps/resolvers/index.md +3 -3
  25. matchlab-0.1.1/docs/api/plan/steps/sources/dataframe.md +12 -0
  26. matchlab-0.1.1/docs/api/plan/steps/sources/index.md +29 -0
  27. matchlab-0.1.1/docs/api/plan/steps/sources/relational.md +12 -0
  28. matchlab-0.1.1/docs/api/plan/steps/transformers/clean.md +12 -0
  29. matchlab-0.1.1/docs/api/plan/steps/transformers/explode.md +12 -0
  30. matchlab-0.1.1/docs/api/plan/steps/transformers/group.md +12 -0
  31. matchlab-0.1.1/docs/api/plan/steps/transformers/index.md +29 -0
  32. matchlab-0.1.1/docs/api/plan/steps/transformers/select.md +12 -0
  33. matchlab-0.1.0.dev4/docs/api/adapters.md → matchlab-0.1.1/docs/api/stores/duckdb.md +1 -1
  34. matchlab-0.1.1/docs/api/stores/index.md +29 -0
  35. matchlab-0.1.1/docs/assets/matchlab-logo-dark.svg +1 -0
  36. matchlab-0.1.1/docs/assets/matchlab-logo-light.svg +1 -0
  37. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/contributing.md +8 -14
  38. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/glossary.md +71 -69
  39. matchlab-0.1.1/docs/guide/build-a-plan.md +446 -0
  40. matchlab-0.1.1/docs/guide/custom-methodologies.md +120 -0
  41. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/guide/evaluate.md +7 -13
  42. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/guide/install.md +0 -4
  43. {matchlab-0.1.0.dev4/docs/migration → matchlab-0.1.1/docs/guide}/matchbox-to-matchlab.md +1 -1
  44. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/guide/query.md +0 -6
  45. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/guide/serialise.md +4 -14
  46. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/index.md +10 -4
  47. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/justfile +2 -8
  48. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/pyproject.toml +7 -8
  49. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/__init__.py +6 -5
  50. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/cli.py +5 -5
  51. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/core/logging.py +85 -12
  52. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/core/schemas.py +5 -5
  53. matchlab-0.1.1/src/matchlab/core/versioning.py +62 -0
  54. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/document.py +5 -0
  55. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/eval/samples.py +23 -25
  56. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/eval/tui/__init__.py +7 -7
  57. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/eval/tui/app.py +9 -9
  58. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/lineage.py +15 -5
  59. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/models/dedupers/base.py +6 -1
  60. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/models/dedupers/naive.py +4 -0
  61. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/models/linkers/base.py +6 -1
  62. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/models/linkers/deterministic.py +3 -0
  63. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/models/linkers/splinklinker.py +15 -8
  64. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/models/linkers/weighteddeterministic.py +4 -0
  65. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/models/models.py +12 -8
  66. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/progress.py +27 -17
  67. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/recordstep.py +10 -10
  68. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/resolvers/base.py +5 -0
  69. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/resolvers/components.py +2 -0
  70. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/resolvers/resolvers.py +20 -16
  71. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/resources.py +2 -2
  72. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/sources/base.py +4 -0
  73. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/sources/sources.py +12 -8
  74. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/steps.py +117 -69
  75. matchlab-0.1.1/src/matchlab/stores/__init__.py +24 -0
  76. {matchlab-0.1.0.dev4/src/matchlab/adapters → matchlab-0.1.1/src/matchlab/stores}/base.py +19 -21
  77. matchlab-0.1.1/src/matchlab/stores/default.py +25 -0
  78. {matchlab-0.1.0.dev4/src/matchlab/adapters → matchlab-0.1.1/src/matchlab/stores}/duckdb.py +16 -14
  79. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/testkit/matchers.py +5 -0
  80. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/transformers/base.py +6 -0
  81. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/transformers/clean.py +4 -0
  82. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/transformers/explode.py +3 -0
  83. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/transformers/group.py +4 -0
  84. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/transformers/select.py +4 -0
  85. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/transformers/transform.py +12 -8
  86. {matchlab-0.1.0.dev4 → matchlab-0.1.1/src/matchlab.egg-info}/PKG-INFO +9 -3
  87. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab.egg-info/SOURCES.txt +46 -31
  88. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab.egg-info/scm_file_list.json +48 -32
  89. matchlab-0.1.1/src/matchlab.egg-info/scm_version.json +8 -0
  90. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab.egg-info/top_level.txt +0 -1
  91. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/README.md +1 -1
  92. matchlab-0.1.1/test/adapters/__init__.py +1 -0
  93. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/adapters/conftest.py +12 -12
  94. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/adapters/test_base.py +2 -2
  95. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/adapters/test_contract.py +41 -31
  96. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/adapters/test_duckdb.py +10 -10
  97. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/conftest.py +9 -8
  98. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/core/test_resolver_output.py +2 -2
  99. matchlab-0.1.1/test/core/test_versioning.py +80 -0
  100. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/eval/test_samples.py +8 -8
  101. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/eval/tui/test_app.py +13 -13
  102. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/models/test_linkers_probabilistic.py +61 -0
  103. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/plan/test_ground_truth.py +1 -1
  104. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/plan/test_plan.py +195 -43
  105. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/plan/test_steps.py +44 -1
  106. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/resolvers/test_resolvers.py +3 -3
  107. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/test_benchmarks.py +2 -2
  108. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/test_cli.py +2 -2
  109. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/test_document.py +6 -6
  110. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/test_lineage.py +7 -3
  111. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/test_progress.py +217 -76
  112. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/transformers/test_transform.py +38 -5
  113. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/uv.lock +118 -217
  114. matchlab-0.1.1/zensical.toml +158 -0
  115. matchlab-0.1.0.dev4/CODEOWNERS +0 -1
  116. matchlab-0.1.0.dev4/docs/api/locations.md +0 -46
  117. matchlab-0.1.0.dev4/docs/api/resolvers.md +0 -12
  118. matchlab-0.1.0.dev4/docs/api/transformers.md +0 -12
  119. matchlab-0.1.0.dev4/docs/assets/matchbox-logo-dark.svg +0 -17
  120. matchlab-0.1.0.dev4/docs/assets/matchbox-logo-light.svg +0 -17
  121. matchlab-0.1.0.dev4/docs/guide/build-a-plan.md +0 -487
  122. matchlab-0.1.0.dev4/docs/stylesheets/extra.css +0 -30
  123. matchlab-0.1.0.dev4/mkdocs.yml +0 -153
  124. matchlab-0.1.0.dev4/personal-data-exclusions.txt +0 -3
  125. matchlab-0.1.0.dev4/src/matchlab/adapters/__init__.py +0 -24
  126. matchlab-0.1.0.dev4/src/matchlab.egg-info/scm_version.json +0 -8
  127. matchlab-0.1.0.dev4/test/adapters/__init__.py +0 -1
  128. matchlab-0.1.0.dev4/trufflehog-exclude.txt +0 -1
  129. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/.github/actions/setup-toolchain/action.yml +0 -0
  130. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/.github/dependabot.yml +0 -0
  131. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/.github/skills/lucid-docs/README.md +0 -0
  132. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/.github/skills/lucid-docs/SKILL.md +0 -0
  133. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/.vscode/launch.json +0 -0
  134. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/.vscode/settings.json +0 -0
  135. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/LICENSE +0 -0
  136. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/benchmarks/README.md +0 -0
  137. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/benchmarks/__init__.py +0 -0
  138. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/benchmarks/cases.py +0 -0
  139. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/benchmarks/data.py +0 -0
  140. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/benchmarks/measurements.py +0 -0
  141. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/benchmarks/results/.gitkeep +0 -0
  142. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/benchmarks/runner.py +0 -0
  143. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/benchmarks/topologies.py +0 -0
  144. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/api/core/exceptions.md +0 -0
  145. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/api/core/hash.md +0 -0
  146. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/api/core/resolver_output.md +0 -0
  147. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/api/core/schemas.md +0 -0
  148. {matchlab-0.1.0.dev4/docs/api → matchlab-0.1.1/docs/api/core}/testkit.md +0 -0
  149. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/api/core/transform.md +0 -0
  150. /matchlab-0.1.0.dev4/docs/api/eval-judgements.md → /matchlab-0.1.1/docs/api/evaluation/judgements.md +0 -0
  151. /matchlab-0.1.0.dev4/docs/api/eval-metrics.md → /matchlab-0.1.1/docs/api/evaluation/metrics.md +0 -0
  152. /matchlab-0.1.0.dev4/docs/api/eval-sampling.md → /matchlab-0.1.1/docs/api/evaluation/sampling.md +0 -0
  153. /matchlab-0.1.0.dev4/docs/api/eval-tui.md → /matchlab-0.1.1/docs/api/evaluation/tui.md +0 -0
  154. {matchlab-0.1.0.dev4/docs/api → matchlab-0.1.1/docs/api/plan}/document.md +0 -0
  155. {matchlab-0.1.0.dev4/docs/api → matchlab-0.1.1/docs/api/plan}/lineage.md +0 -0
  156. {matchlab-0.1.0.dev4/docs/api → matchlab-0.1.1/docs/api/plan}/progress.md +0 -0
  157. {matchlab-0.1.0.dev4/docs/api → matchlab-0.1.1/docs/api/plan}/resources.md +0 -0
  158. {matchlab-0.1.0.dev4/docs/api → matchlab-0.1.1/docs/api/plan}/specs.md +0 -0
  159. {matchlab-0.1.0.dev4/docs/api → matchlab-0.1.1/docs/api/plan/steps}/recordstep.md +0 -0
  160. /matchlab-0.1.0.dev4/docs/assets/matchbox-icon-dark.png → /matchlab-0.1.1/docs/assets/matchlab-icon-dark.png +0 -0
  161. /matchlab-0.1.0.dev4/docs/assets/matchbox-icon.svg → /matchlab-0.1.1/docs/assets/matchlab-icon-light.svg +0 -0
  162. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/use-cases.md +0 -0
  163. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/docs/why-matchlab.md +0 -0
  164. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/scripts/test_eval.py +0 -0
  165. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/setup.cfg +0 -0
  166. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/core/__init__.py +0 -0
  167. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/core/dataframes.py +0 -0
  168. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/core/dsu.py +0 -0
  169. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/core/exceptions.py +0 -0
  170. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/core/hash.py +0 -0
  171. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/core/kinds.py +0 -0
  172. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/core/resolver_output.py +0 -0
  173. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/core/sql.py +0 -0
  174. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/eval/__init__.py +0 -0
  175. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/eval/judgements.py +0 -0
  176. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/eval/metrics.py +0 -0
  177. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/eval/tui/modals.py +0 -0
  178. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/eval/tui/styles.tcss +0 -0
  179. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/eval/tui/widgets/__init__.py +0 -0
  180. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/eval/tui/widgets/assignment.py +0 -0
  181. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/eval/tui/widgets/styling.py +0 -0
  182. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/eval/tui/widgets/table.py +0 -0
  183. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/models/__init__.py +0 -0
  184. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/models/comparison.py +0 -0
  185. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/models/dedupers/__init__.py +0 -0
  186. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/models/linkers/__init__.py +0 -0
  187. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/resolvers/__init__.py +0 -0
  188. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/sources/__init__.py +0 -0
  189. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/sources/dataframe.py +0 -0
  190. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/sources/relational.py +0 -0
  191. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/specs.py +0 -0
  192. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/testkit/__init__.py +0 -0
  193. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/testkit/_generate.py +0 -0
  194. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/testkit/compare.py +0 -0
  195. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/testkit/entities.py +0 -0
  196. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/testkit/features.py +0 -0
  197. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/testkit/linked.py +0 -0
  198. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/testkit/models.py +0 -0
  199. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/testkit/sources.py +0 -0
  200. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab/transformers/__init__.py +0 -0
  201. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab.egg-info/dependency_links.txt +0 -0
  202. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab.egg-info/entry_points.txt +0 -0
  203. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/src/matchlab.egg-info/requires.txt +0 -0
  204. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/__init__.py +0 -0
  205. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/core/__init__.py +0 -0
  206. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/core/test_dsu.py +0 -0
  207. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/core/test_eval.py +0 -0
  208. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/core/test_hash.py +0 -0
  209. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/eval/__init__.py +0 -0
  210. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/eval/tui/__init__.py +0 -0
  211. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/eval/tui/test_widgets.py +0 -0
  212. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/models/__init__.py +0 -0
  213. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/models/test_comparison.py +0 -0
  214. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/models/test_dedupers_deterministic.py +0 -0
  215. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/models/test_linkers_deterministic.py +0 -0
  216. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/models/test_linkers_splink.py +0 -0
  217. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/models/test_models.py +0 -0
  218. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/plan/__init__.py +0 -0
  219. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/resolvers/__init__.py +0 -0
  220. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/resolvers/test_components.py +0 -0
  221. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/sources/__init__.py +0 -0
  222. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/sources/conftest.py +0 -0
  223. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/sources/test_locations.py +0 -0
  224. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/test_resources.py +0 -0
  225. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/testkit/__init__.py +0 -0
  226. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/testkit/test_entities.py +0 -0
  227. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/testkit/test_linked.py +0 -0
  228. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/testkit/test_models.py +0 -0
  229. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/testkit/test_scores.py +0 -0
  230. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/testkit/test_sources.py +0 -0
  231. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/transformers/__init__.py +0 -0
  232. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/transformers/test_clean.py +0 -0
  233. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/transformers/test_explode.py +0 -0
  234. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/transformers/test_group.py +0 -0
  235. {matchlab-0.1.0.dev4 → matchlab-0.1.1}/test/transformers/test_select.py +0 -0
@@ -0,0 +1 @@
1
+ * @uktrade/data-matching-service
@@ -0,0 +1,33 @@
1
+ # Security Checklist
2
+
3
+ Work through this checklist from top to bottom, ticking each item once you have confirmed it is true. Each item links to detailed guidance in the [DBT GitHub Security Policy](https://github.com/uktrade/.github/blob/main/SECURITY.md).
4
+
5
+ Last checked against the policy: _add date_
6
+
7
+ ## 1. Contributor controls
8
+
9
+ Actions each contributor takes for themselves, so everyone knows what the controls are and why they exist.
10
+
11
+ - [X] [All internal contributors have read the DBT GitHub Security Policy](https://github.com/uktrade/.github/blob/main/SECURITY.md)
12
+ - [X] [All internal contributors have completed code security training in the last year](https://github.com/uktrade/.github/blob/main/SECURITY.md#security-training)
13
+ - [X] [All internal contributors have reviewed the GitHub Safety Tips on coding in the open](https://github.com/uktrade/.github/blob/main/SECURITY.md#github-safety-tips)
14
+
15
+ ## 2. Repository-level controls
16
+
17
+ Defences set up within the repository itself.
18
+
19
+ - [X] [A `.pre-commit-config.yaml` file exists so the organisation-approved hooks run before commits](https://github.com/uktrade/.github/blob/main/SECURITY.md#pre-commit-hooks)
20
+ - [X] [Repository access has been reviewed](https://github.com/uktrade/.github/blob/main/SECURITY.md#repository-access)
21
+ - [X] [A `CODEOWNERS` file exists so the right people review changes](https://github.com/uktrade/.github/blob/main/SECURITY.md#codeowners)
22
+ - [X] [The pull request template reminds reviewers to check for secrets](https://github.com/uktrade/.github/blob/main/SECURITY.md#pull-request-template)
23
+ - [X] [The mandatory custom GitHub properties are set](https://github.com/uktrade/.github/blob/main/SECURITY.md#custom-github-properties)
24
+ - [X] [Advanced CodeQL is set up if the repository accepts PRs from forks (optional)](https://github.com/uktrade/.github/blob/main/SECURITY.md#codeql-for-fork-based-prs-optional)
25
+
26
+ ## 3. Organisation-applied controls
27
+
28
+ Controls applied by an organisation administrator and verified by a repository administrator.
29
+
30
+ - [X] [The DBT GitHub security configuration is applied to the repository](https://github.com/uktrade/.github/blob/main/SECURITY.md#github-security-configuration)
31
+ - [X] [The default branch protection ruleset is applied to the default branch](https://github.com/uktrade/.github/blob/main/SECURITY.md#branch-protection-rules)
32
+ - [X] [GitHub Secret Protection is enabled and blocking secrets](https://github.com/uktrade/.github/blob/main/SECURITY.md#github-secret-protection)
33
+ - [X] [The relevant vulnerability scans are active](https://github.com/uktrade/.github/blob/main/SECURITY.md#vulnerability-scanning)
@@ -19,6 +19,7 @@
19
19
  - [ ] This is the smallest, simplest solution to the problem
20
20
  - [ ] I've read [our code standards](https://uktrade.github.io/matchlab/contributing/) and this code follows them
21
21
  - [ ] All new code is tested
22
+ - [ ] I've ensured no secret values are present
22
23
  - I've updated all relevant documentation (select all that apply)
23
24
  - [ ] API documentation (docstrings and indexes)
24
25
  - [ ] Tutorials
@@ -168,7 +168,7 @@ def blocks_from_md(path: Path) -> Iterator[tuple[str, str]]:
168
168
  text = re.sub(r"^#{1,6}\s*", "", text, flags=re.MULTILINE) # headings
169
169
  text = re.sub(r"\*\*([^*]+)\*\*", r"\1", text) # bold
170
170
  text = re.sub(r"\*([^*]+)\*", r"\1", text) # italic
171
- # admonition marker lines (mkdocs-style), e.g. !!! warning "title"
171
+ # admonition marker lines (zensical-style), e.g. !!! warning "title"
172
172
  text = re.sub(r'^!!!\s+\S+(\s+".*?")?\s*$', "", text, flags=re.MULTILINE)
173
173
 
174
174
  table_row = re.compile(r"^\s*\|.*\|\s*$")
@@ -31,7 +31,7 @@ jobs:
31
31
  path: ./dist
32
32
 
33
33
  - name: Build documentation
34
- run: uv run mkdocs build
34
+ run: uv run zensical build
35
35
 
36
36
  - name: Upload documentation artifact
37
37
  uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
@@ -64,7 +64,7 @@ jobs:
64
64
  run: uv build
65
65
 
66
66
  - name: Build docs
67
- run: uv run mkdocs build --strict
67
+ run: uv run zensical build --strict
68
68
 
69
69
  ci-success:
70
70
  needs: [format-and-lint, test, build]
@@ -24,6 +24,7 @@ jobs:
24
24
  permissions:
25
25
  actions: read
26
26
  contents: read
27
+ packages: read
27
28
  security-events: write
28
29
 
29
30
  strategy:
@@ -183,7 +183,7 @@ venv.bak/
183
183
  # Rope project settings
184
184
  .ropeproject
185
185
 
186
- # mkdocs documentation
186
+ # Documentation
187
187
  /site
188
188
 
189
189
  # mypy
@@ -11,18 +11,18 @@ repos:
11
11
  pass_filenames: false
12
12
  stages: [pre-commit]
13
13
 
14
- # Verify MkDocs build
15
- - id: mkdocs
16
- name: mkdocs
17
- description: "Verify MkDocs documentation builds without errors"
18
- entry: uv run mkdocs build --strict
14
+ # Verify documentation build
15
+ - id: docs
16
+ name: docs
17
+ description: "Verify documentation builds without errors"
18
+ entry: uv run zensical build --strict
19
19
  language: system
20
20
  pass_filenames: false
21
21
  stages: [pre-commit]
22
22
 
23
23
  # Mandatory internal hooks
24
24
  - repo: https://github.com/uktrade/github-standards
25
- rev: v1.3.0 # update periodically with pre-commit autoupdate
25
+ rev: v1.4.3 # update periodically with pre-commit autoupdate
26
26
  hooks:
27
27
  - id: run-security-scan
28
28
  verbose: false
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: matchlab
3
- Version: 0.1.0.dev4
3
+ Version: 0.1.1
4
4
  Summary: A local-first library for building, running and evaluating entity resolution pipelines.
5
5
  Author: Department for Business and Trade
6
6
  Project-URL: Documentation, https://uktrade.github.io/matchlab/
@@ -33,7 +33,13 @@ Requires-Dist: sqlglot[c]>=30.0.3
33
33
  Requires-Dist: textual>=0.80
34
34
  Dynamic: license-file
35
35
 
36
- # matchlab
36
+ <p align="center">
37
+ <picture>
38
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/uktrade/matchbox/refs/heads/matchlab/docs/assets/matchlab-logo-dark.svg">
39
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/uktrade/matchbox/refs/heads/matchlab/docs/assets/matchlab-logo-light.svg">
40
+ <img alt="Shows the matchlab logo in light or dark color mode." src="https://raw.githubusercontent.com/uktrade/matchbox/refs/heads/matchlab/docs/assets/matchlab-logo-light.svg">
41
+ </picture>
42
+ </p>
37
43
 
38
44
  **A local-first library for building, running and evaluating entity resolution pipelines.**
39
45
 
@@ -83,7 +89,7 @@ pip install matchlab
83
89
 
84
90
  ## Coming from Matchbox?
85
91
 
86
- matchlab is the successor to `matchbox-db`, with the server removed and the client API rebuilt. It's a hard break — see the [migration guide](https://uktrade.github.io/matchlab/migration/matchbox-to-matchlab/).
92
+ matchlab is the successor to `matchbox-db`, with the server removed and the client API rebuilt. It's a hard break — see the [migration guide](https://uktrade.github.io/matchlab/guide/matchbox-to-matchlab/).
87
93
 
88
94
  ## Development
89
95
 
@@ -1,4 +1,10 @@
1
- # matchlab
1
+ <p align="center">
2
+ <picture>
3
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/uktrade/matchbox/refs/heads/matchlab/docs/assets/matchlab-logo-dark.svg">
4
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/uktrade/matchbox/refs/heads/matchlab/docs/assets/matchlab-logo-light.svg">
5
+ <img alt="Shows the matchlab logo in light or dark color mode." src="https://raw.githubusercontent.com/uktrade/matchbox/refs/heads/matchlab/docs/assets/matchlab-logo-light.svg">
6
+ </picture>
7
+ </p>
2
8
 
3
9
  **A local-first library for building, running and evaluating entity resolution pipelines.**
4
10
 
@@ -48,7 +54,7 @@ pip install matchlab
48
54
 
49
55
  ## Coming from Matchbox?
50
56
 
51
- matchlab is the successor to `matchbox-db`, with the server removed and the client API rebuilt. It's a hard break — see the [migration guide](https://uktrade.github.io/matchlab/migration/matchbox-to-matchlab/).
57
+ matchlab is the successor to `matchbox-db`, with the server removed and the client API rebuilt. It's a hard break — see the [migration guide](https://uktrade.github.io/matchlab/guide/matchbox-to-matchlab/).
52
58
 
53
59
  ## Development
54
60
 
@@ -24,7 +24,7 @@ from benchmarks.data import Warehouse
24
24
  from benchmarks.measurements import Environment, Run, SweepResult
25
25
  from benchmarks.runner import CaseFailed
26
26
  from benchmarks.topologies import Topology
27
- from matchlab.adapters.base import format_bytes
27
+ from matchlab.stores.base import format_bytes
28
28
 
29
29
  RESULTS = "benchmarks/results"
30
30
 
@@ -18,7 +18,7 @@ from pathlib import Path
18
18
  from benchmarks.cases import Case, Store
19
19
  from benchmarks.measurements import Measurement
20
20
  from benchmarks.topologies import build, declare
21
- from matchlab.adapters import DuckDBAdapter
21
+ from matchlab.stores import DuckDBStore
22
22
 
23
23
 
24
24
  def peak_rss() -> int:
@@ -58,7 +58,7 @@ def measure(case: Case, path: Path, warehouse_rows: int) -> Measurement:
58
58
  if case.store is Store.MEMORY
59
59
  else str(Path(directory) / "store.duckdb")
60
60
  )
61
- store = DuckDBAdapter(location)
61
+ store = DuckDBStore(location)
62
62
  try:
63
63
  plan = build(case.topology, declare(path, case.warehouse.sources))
64
64
 
@@ -13,7 +13,7 @@ from rich.text import Text
13
13
 
14
14
  from benchmarks.measurements import Result, Run, SweepResult
15
15
  from benchmarks.topologies import Topology
16
- from matchlab.adapters.base import format_bytes
16
+ from matchlab.stores.base import format_bytes
17
17
 
18
18
  # The narrowest a run may be rendered. The sweep tables carry eleven columns
19
19
  # because eleven things are worth comparing side by side, and wrapping them into
@@ -1,3 +1,7 @@
1
+ # Steps
2
+
3
+ The basic building block of a matchlab plan.
4
+
1
5
  ::: matchlab.steps
2
6
  options:
3
7
  show_root_heading: true
@@ -0,0 +1,16 @@
1
+ # Dedupers
2
+
3
+ Model methodologies that deduplicate a [`RecordStep`][matchlab.recordstep].
4
+
5
+ ::: matchlab.models.dedupers.base
6
+ options:
7
+ show_root_heading: true
8
+ show_root_full_path: true
9
+ members_order: source
10
+ show_if_no_docstring: true
11
+ docstring_style: google
12
+ show_signature_annotations: true
13
+ separate_signature: true
14
+ filters:
15
+ - "!^[A-Z]$"
16
+ - "!^_"
@@ -0,0 +1,12 @@
1
+ ::: matchlab.models.dedupers.naive
2
+ options:
3
+ show_root_heading: true
4
+ show_root_full_path: true
5
+ members_order: source
6
+ show_if_no_docstring: true
7
+ docstring_style: google
8
+ show_signature_annotations: true
9
+ separate_signature: true
10
+ filters:
11
+ - "!^[A-Z]$"
12
+ - "!^_"
@@ -1,8 +1,8 @@
1
1
  # Models
2
2
 
3
- The `Model` step, and the methodologies it runs. A model wraps exactly one [deduper](#matchlab.models.dedupers) or [linker](#matchlab.models.linkers), named by `model_class` and configured by `model_settings`.
3
+ The `Model` step, and the methodologies it runs. Methodologies are either [dedupers](./dedupers) or [linkers](./linkers).
4
4
 
5
- ::: matchlab.models
5
+ ::: matchlab.models.models
6
6
  options:
7
7
  show_root_heading: true
8
8
  show_root_full_path: true
@@ -15,24 +15,7 @@ The `Model` step, and the methodologies it runs. A model wraps exactly one [dedu
15
15
  - "!^[A-Z]$"
16
16
  - "!^_"
17
17
 
18
- ## Dedupers
19
-
20
- ::: matchlab.models.dedupers
21
- options:
22
- show_root_heading: true
23
- show_root_full_path: true
24
- members_order: source
25
- show_if_no_docstring: true
26
- docstring_style: google
27
- show_signature_annotations: true
28
- separate_signature: true
29
- filters:
30
- - "!^[A-Z]$"
31
- - "!^_"
32
-
33
- ## Linkers
34
-
35
- ::: matchlab.models.linkers
18
+ ::: matchlab.models.comparison
36
19
  options:
37
20
  show_root_heading: true
38
21
  show_root_full_path: true
@@ -0,0 +1,12 @@
1
+ ::: matchlab.models.linkers.deterministic
2
+ options:
3
+ show_root_heading: true
4
+ show_root_full_path: true
5
+ members_order: source
6
+ show_if_no_docstring: true
7
+ docstring_style: google
8
+ show_signature_annotations: true
9
+ separate_signature: true
10
+ filters:
11
+ - "!^[A-Z]$"
12
+ - "!^_"
@@ -0,0 +1,16 @@
1
+ # Linkers
2
+
3
+ Model methodologies that link two [`RecordStep`s][matchlab.recordstep].
4
+
5
+ ::: matchlab.models.linkers.base
6
+ options:
7
+ show_root_heading: true
8
+ show_root_full_path: true
9
+ members_order: source
10
+ show_if_no_docstring: true
11
+ docstring_style: google
12
+ show_signature_annotations: true
13
+ separate_signature: true
14
+ filters:
15
+ - "!^[A-Z]$"
16
+ - "!^_"
@@ -0,0 +1,12 @@
1
+ ::: matchlab.models.linkers.splinklinker
2
+ options:
3
+ show_root_heading: true
4
+ show_root_full_path: true
5
+ members_order: source
6
+ show_if_no_docstring: true
7
+ docstring_style: google
8
+ show_signature_annotations: true
9
+ separate_signature: true
10
+ filters:
11
+ - "!^[A-Z]$"
12
+ - "!^_"
@@ -0,0 +1,12 @@
1
+ ::: matchlab.models.linkers.weighteddeterministic
2
+ options:
3
+ show_root_heading: true
4
+ show_root_full_path: true
5
+ members_order: source
6
+ show_if_no_docstring: true
7
+ docstring_style: google
8
+ show_signature_annotations: true
9
+ separate_signature: true
10
+ filters:
11
+ - "!^[A-Z]$"
12
+ - "!^_"
@@ -0,0 +1,12 @@
1
+ ::: matchlab.resolvers.components
2
+ options:
3
+ show_root_heading: true
4
+ show_root_full_path: true
5
+ members_order: source
6
+ show_if_no_docstring: true
7
+ docstring_style: google
8
+ show_signature_annotations: true
9
+ separate_signature: true
10
+ filters:
11
+ - "!^[A-Z]$"
12
+ - "!^_"
@@ -1,8 +1,8 @@
1
- # Sources
1
+ # Resolvers
2
2
 
3
- The `Source` step, and the shorthands that build one. A source reads rows through a [location](locations.md) and content-addresses them, so it is where data enters a plan.
3
+ The `Resolver` step. A resolver's methodology takes the output of a [model][matchlab.models.models] and resolves it into entities. It is a [`RecordStep`][matchlab.recordstep] that can be used in further entity resolution processes, or output as your final lookup.
4
4
 
5
- ::: matchlab.sources.sources
5
+ ::: matchlab.resolvers.resolvers
6
6
  options:
7
7
  show_root_heading: true
8
8
  show_root_full_path: true
@@ -0,0 +1,12 @@
1
+ ::: matchlab.sources.dataframe
2
+ options:
3
+ show_root_heading: true
4
+ show_root_full_path: true
5
+ members_order: source
6
+ show_if_no_docstring: true
7
+ docstring_style: google
8
+ show_signature_annotations: true
9
+ separate_signature: true
10
+ filters:
11
+ - "!^[A-Z]$"
12
+ - "!^_"
@@ -0,0 +1,29 @@
1
+ # Sources
2
+
3
+ The `Source` step, and the shorthands that build one. A source's methodology is a location, which it reads rows through and content-addresses them. It is where data enters a plan.
4
+
5
+ ::: matchlab.sources.sources
6
+ options:
7
+ show_root_heading: true
8
+ show_root_full_path: true
9
+ members_order: source
10
+ show_if_no_docstring: true
11
+ docstring_style: google
12
+ show_signature_annotations: true
13
+ separate_signature: true
14
+ filters:
15
+ - "!^[A-Z]$"
16
+ - "!^_"
17
+
18
+ ::: matchlab.sources.base
19
+ options:
20
+ show_root_heading: true
21
+ show_root_full_path: true
22
+ members_order: source
23
+ show_if_no_docstring: true
24
+ docstring_style: google
25
+ show_signature_annotations: true
26
+ separate_signature: true
27
+ filters:
28
+ - "!^[A-Z]$"
29
+ - "!^_"
@@ -0,0 +1,12 @@
1
+ ::: matchlab.sources.relational
2
+ options:
3
+ show_root_heading: true
4
+ show_root_full_path: true
5
+ members_order: source
6
+ show_if_no_docstring: true
7
+ docstring_style: google
8
+ show_signature_annotations: true
9
+ separate_signature: true
10
+ filters:
11
+ - "!^[A-Z]$"
12
+ - "!^_"
@@ -0,0 +1,12 @@
1
+ ::: matchlab.transformers.clean
2
+ options:
3
+ show_root_heading: true
4
+ show_root_full_path: true
5
+ members_order: source
6
+ show_if_no_docstring: true
7
+ docstring_style: google
8
+ show_signature_annotations: true
9
+ separate_signature: true
10
+ filters:
11
+ - "!^[A-Z]$"
12
+ - "!^_"
@@ -0,0 +1,12 @@
1
+ ::: matchlab.transformers.explode
2
+ options:
3
+ show_root_heading: true
4
+ show_root_full_path: true
5
+ members_order: source
6
+ show_if_no_docstring: true
7
+ docstring_style: google
8
+ show_signature_annotations: true
9
+ separate_signature: true
10
+ filters:
11
+ - "!^[A-Z]$"
12
+ - "!^_"
@@ -0,0 +1,12 @@
1
+ ::: matchlab.transformers.group
2
+ options:
3
+ show_root_heading: true
4
+ show_root_full_path: true
5
+ members_order: source
6
+ show_if_no_docstring: true
7
+ docstring_style: google
8
+ show_signature_annotations: true
9
+ separate_signature: true
10
+ filters:
11
+ - "!^[A-Z]$"
12
+ - "!^_"
@@ -0,0 +1,29 @@
1
+ # Transformers
2
+
3
+ The `Transformer` step. A transformer's methodology is a location, which it reads rows through and content-addresses them. It is where data enters a plan.
4
+
5
+ ::: matchlab.transformers.transform
6
+ options:
7
+ show_root_heading: true
8
+ show_root_full_path: true
9
+ members_order: source
10
+ show_if_no_docstring: true
11
+ docstring_style: google
12
+ show_signature_annotations: true
13
+ separate_signature: true
14
+ filters:
15
+ - "!^[A-Z]$"
16
+ - "!^_"
17
+
18
+ ::: matchlab.transformers.base
19
+ options:
20
+ show_root_heading: true
21
+ show_root_full_path: true
22
+ members_order: source
23
+ show_if_no_docstring: true
24
+ docstring_style: google
25
+ show_signature_annotations: true
26
+ separate_signature: true
27
+ filters:
28
+ - "!^[A-Z]$"
29
+ - "!^_"
@@ -0,0 +1,12 @@
1
+ ::: matchlab.transformers.select
2
+ options:
3
+ show_root_heading: true
4
+ show_root_full_path: true
5
+ members_order: source
6
+ show_if_no_docstring: true
7
+ docstring_style: google
8
+ show_signature_annotations: true
9
+ separate_signature: true
10
+ filters:
11
+ - "!^[A-Z]$"
12
+ - "!^_"
@@ -1,4 +1,4 @@
1
- ::: matchlab.adapters
1
+ ::: matchlab.stores.duckdb
2
2
  options:
3
3
  show_root_heading: true
4
4
  show_root_full_path: true
@@ -0,0 +1,29 @@
1
+ # Stores
2
+
3
+ Entity resolution is iterative, long-running, and can easily explode in compute and memory. matchlab uses caching for stability and sharing. Stores are how you configure it.
4
+
5
+ ::: matchlab.stores.default
6
+ options:
7
+ show_root_heading: true
8
+ show_root_full_path: true
9
+ members_order: source
10
+ show_if_no_docstring: true
11
+ docstring_style: google
12
+ show_signature_annotations: true
13
+ separate_signature: true
14
+ filters:
15
+ - "!^[A-Z]$"
16
+ - "!^_"
17
+
18
+ ::: matchlab.stores.base
19
+ options:
20
+ show_root_heading: true
21
+ show_root_full_path: true
22
+ members_order: source
23
+ show_if_no_docstring: true
24
+ docstring_style: google
25
+ show_signature_annotations: true
26
+ separate_signature: true
27
+ filters:
28
+ - "!^[A-Z]$"
29
+ - "!^_"
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="1444.3" height="490.16" viewBox="0 0 1444.3 490.16"><defs><style>.cls-1{fill:#fff;}.cls-2{fill:#e4a242;}.cls-3{fill:#f64419;}</style></defs><path class="cls-2" d="M345.26,215.05v114h-39v-71.47c2.58-3.65,4-8.48,4-13.53,0-10.45-6.03-20-16-20s-16,9.55-16,20c0,5.05,1.42,9.88,4,13.53v71.47h-42v-71.47c2.58-3.65,4-8.48,4-13.53,0-10.45-6.03-20-16-20s-16,9.55-16,20c0,5.05,1.42,9.88,4,13.53v71.47h-39v-114h-24v138h216v-138h-24Z"/><path class="cls-3" d="M369.25,212.24c0-32.96-19.22-47.45-47.93-47.45h-24c-15.36,0-22.33-5.39-24.06-27.74h-24c-1.73,22.35-8.7,27.74-24.06,27.74h-24c-28.71,0-47.93,14.48-47.93,47.45,0,.6,0,1.12-.01,2.82h24c0-1.51.02-2.23.02-2.82,0-11.58,8.85-20.21,24.01-20.21h23.91c20.38,0,31.3-8.61,36.06-25.67,4.76,17.07,15.68,25.67,36.06,25.67h23.91c15.15,0,24.01,8.63,24.01,20.21,0,.59.02,1.3.02,2.82h24c0-1.7-.01-2.22-.01-2.82Z"/><path class="cls-1" d="M561.52,190.55c-4.81-.47-9.88-.61-14.35,0-9.23,1.26-19,8.38-24.59,14.17-5.23-5.69-15.43-12.99-24.71-14.26-4.47-.61-9.54-.47-14.35,0-22.13,2.16-37.62,16.84-37.62,37.62v98.98h28v-98.98c0-5.31,5.33-8.6,9.62-9.62,4.21-1,11.51-1.06,15.35,0,3.54.98,9.62,4.32,9.62,9.62v98.98h.06v.09h28v-98.98c0-5.31,6.08-8.64,9.62-9.62,3.84-1.06,11.15-1,15.35,0,4.29,1.02,9.62,4.32,9.62,9.62v98.98h28v-98.98c0-20.78-15.5-35.46-37.62-37.62Z"/><path class="cls-1" d="M646.92,329.55c-3.47,0-7.17-.4-11.1-1.2-3.93-.8-7.63-2.23-11.1-4.3-3.47-2.07-6.3-5.07-8.5-9-2.2-3.93-3.3-8.96-3.3-15.1,0-7.33,1.6-13.4,4.8-18.2,3.2-4.8,7.77-8.57,13.7-11.3,5.93-2.73,13.03-4.63,21.3-5.7,8.27-1.07,17.4-1.6,27.4-1.6v-7.8c0-3.07-.5-5.73-1.5-8-1-2.27-2.73-4.07-5.2-5.4-2.47-1.33-5.9-2-10.3-2s-7.97.53-10.7,1.6c-2.73,1.07-4.67,2.43-5.8,4.1-1.13,1.67-1.7,3.5-1.7,5.5v2.4h-27c-.13-.67-.2-1.3-.2-1.9v-2.3c0-6.13,1.87-11.43,5.6-15.9,3.73-4.47,9-7.9,15.8-10.3,6.8-2.4,14.73-3.6,23.8-3.6,9.73,0,17.9,1.27,24.5,3.8,6.6,2.53,11.67,6.27,15.2,11.2,3.53,4.93,5.3,11.13,5.3,18.6v47.8c0,2.4.7,4.17,2.1,5.3,1.4,1.13,2.97,1.7,4.7,1.7h6.6v18.2c-1.33.67-3.4,1.37-6.2,2.1-2.8.73-6.2,1.1-10.2,1.1s-7.3-.57-10.3-1.7c-3-1.13-5.5-2.73-7.5-4.8-2-2.07-3.4-4.57-4.2-7.5h-1.4c-2.27,2.8-5.03,5.27-8.3,7.4-3.27,2.13-7.07,3.8-11.4,5-4.33,1.2-9.3,1.8-14.9,1.8ZM656.32,308.55c3.73,0,7.07-.57,10-1.7,2.93-1.13,5.4-2.67,7.4-4.6,2-1.93,3.57-4.3,4.7-7.1,1.13-2.8,1.7-5.8,1.7-9v-5.8c-7.47,0-14.13.5-20,1.5-5.87,1-10.5,2.7-13.9,5.1-3.4,2.4-5.1,5.73-5.1,10,0,2.4.6,4.47,1.8,6.2,1.2,1.73,2.93,3.07,5.2,4,2.27.93,5,1.4,8.2,1.4Z"/><path class="cls-1" d="M762.52,329.55c-6.67,0-12.07-1.2-16.2-3.6-4.13-2.4-7.13-5.63-9-9.7-1.87-4.07-2.8-8.57-2.8-13.5v-59.4h-13v-21.4h14l5.2-30h21.6v30h19.2v21.4h-19.2v54.8c0,3.2.73,5.63,2.2,7.3,1.47,1.67,3.87,2.5,7.2,2.5h9.8v18.4c-1.6.53-3.47,1.03-5.6,1.5-2.13.46-4.4.87-6.8,1.2-2.4.33-4.6.5-6.6.5Z"/><path class="cls-1" d="M840.71,329.55c-11.2,0-20.6-1.97-28.2-5.9-7.6-3.93-13.37-10-17.3-18.2-3.93-8.2-5.9-18.5-5.9-30.9s1.97-23.03,5.9-31.1c3.93-8.07,9.73-14.1,17.4-18.1,7.67-4,17.03-6,28.1-6,7.2,0,13.7.87,19.5,2.6,5.8,1.73,10.83,4.4,15.1,8,4.27,3.6,7.5,8.03,9.7,13.3,2.2,5.27,3.3,11.5,3.3,18.7h-27.8c0-4.8-.73-8.73-2.2-11.8-1.47-3.07-3.7-5.4-6.7-7-3-1.6-6.77-2.4-11.3-2.4-5.33,0-9.67,1.2-13,3.6-3.33,2.4-5.8,5.93-7.4,10.6-1.6,4.67-2.4,10.47-2.4,17.4v4.6c0,6.8.83,12.53,2.5,17.2,1.67,4.67,4.23,8.17,7.7,10.5,3.47,2.33,8,3.5,13.6,3.5,4.53,0,8.3-.8,11.3-2.4,3-1.6,5.3-4,6.9-7.2,1.6-3.2,2.4-7.07,2.4-11.6h26.4c0,6.8-1.1,12.87-3.3,18.2-2.2,5.33-5.4,9.8-9.6,13.4-4.2,3.6-9.23,6.33-15.1,8.2-5.87,1.87-12.4,2.8-19.6,2.8Z"/><path class="cls-1" d="M901.11,327.15v-144.6h27.8v51h1.4c2.27-2.8,4.97-5.23,8.1-7.3,3.13-2.07,6.67-3.7,10.6-4.9,3.93-1.2,8.23-1.8,12.9-1.8,6.93,0,13,1.27,18.2,3.8,5.2,2.53,9.23,6.53,12.1,12,2.87,5.47,4.3,12.6,4.3,21.4v70.4h-27.8v-66c0-3.33-.4-6.17-1.2-8.5-.8-2.33-1.97-4.27-3.5-5.8-1.53-1.53-3.43-2.63-5.7-3.3-2.27-.67-4.8-1-7.6-1-4.13,0-7.87,1-11.2,3-3.33,2-5.93,4.73-7.8,8.2-1.87,3.47-2.8,7.47-2.8,12v61.4h-27.8Z"/><path class="cls-1" d="M1031.5,327.15c3.19.95,6.88,1.42,11.07,1.42,2,0,4.2-.17,6.6-.5,2.4-.33,4.67-.73,6.8-1.2,2.13-.47,4-.97,5.6-1.5v-18.4h-9.8c-3.33,0-5.73-.83-7.2-2.5-1.47-1.67-2.2-4.1-2.2-7.3v-114.63s-27.8,0-27.8,0v119.22c0,4.93.93,9.43,2.8,13.5,1.87,4.07,4.87,7.3,9,9.7,1.53.89,3.24,1.62,5.13,2.18"/><path class="cls-1" d="M1103.65,329.55c-3.47,0-7.17-.4-11.1-1.2-3.93-.8-7.63-2.23-11.1-4.3-3.47-2.07-6.3-5.07-8.5-9-2.2-3.93-3.3-8.96-3.3-15.1,0-7.33,1.6-13.4,4.8-18.2,3.2-4.8,7.77-8.57,13.7-11.3,5.93-2.73,13.03-4.63,21.3-5.7,8.27-1.07,17.4-1.6,27.4-1.6v-7.8c0-3.07-.5-5.73-1.5-8-1-2.27-2.73-4.07-5.2-5.4-2.47-1.33-5.9-2-10.3-2s-7.97.53-10.7,1.6c-2.73,1.07-4.67,2.43-5.8,4.1-1.13,1.67-1.7,3.5-1.7,5.5v2.4h-27c-.13-.67-.2-1.3-.2-1.9v-2.3c0-6.13,1.87-11.43,5.6-15.9,3.73-4.47,9-7.9,15.8-10.3,6.8-2.4,14.73-3.6,23.8-3.6,9.73,0,17.9,1.27,24.5,3.8,6.6,2.53,11.67,6.27,15.2,11.2,3.53,4.93,5.3,11.13,5.3,18.6v47.8c0,2.4.7,4.17,2.1,5.3,1.4,1.13,2.97,1.7,4.7,1.7h6.6v18.2c-1.33.67-3.4,1.37-6.2,2.1-2.8.73-6.2,1.1-10.2,1.1s-7.3-.57-10.3-1.7c-3-1.13-5.5-2.73-7.5-4.8-2-2.07-3.4-4.57-4.2-7.5h-1.4c-2.27,2.8-5.03,5.27-8.3,7.4-3.27,2.13-7.07,3.8-11.4,5-4.33,1.2-9.3,1.8-14.9,1.8ZM1113.05,308.55c3.73,0,7.07-.57,10-1.7,2.93-1.13,5.4-2.67,7.4-4.6,2-1.93,3.57-4.3,4.7-7.1,1.13-2.8,1.7-5.8,1.7-9v-5.8c-7.47,0-14.13.5-20,1.5-5.87,1-10.5,2.7-13.9,5.1-3.4,2.4-5.1,5.73-5.1,10,0,2.4.6,4.47,1.8,6.2,1.2,1.73,2.93,3.07,5.2,4,2.27.93,5,1.4,8.2,1.4Z"/><path class="cls-1" d="M1248.64,329.55c-6.8,0-13.03-1.37-18.7-4.1-5.67-2.73-10.23-6.9-13.7-12.5h-1.4l-2.2,14.2h-22.8v-144.6h27.8v51h1.2c2.13-3.07,4.73-5.67,7.8-7.8,3.07-2.13,6.53-3.7,10.4-4.7,3.87-1,8.07-1.5,12.6-1.5,8.27,0,15.5,1.93,21.7,5.8,6.2,3.87,11.03,9.83,14.5,17.9,3.47,8.07,5.2,18.43,5.2,31.1s-1.7,23.07-5.1,31.2c-3.4,8.13-8.27,14.17-14.6,18.1-6.33,3.93-13.9,5.9-22.7,5.9ZM1240.04,306.75c5.6,0,10.03-1.1,13.3-3.3,3.27-2.2,5.63-5.5,7.1-9.9,1.46-4.4,2.2-9.93,2.2-16.6v-4.6c0-6.67-.73-12.23-2.2-16.7-1.47-4.47-3.83-7.8-7.1-10-3.27-2.2-7.7-3.3-13.3-3.3-4,0-7.4.7-10.2,2.1s-5.1,3.4-6.9,6c-1.8,2.6-3.17,5.83-4.1,9.7-.93,3.87-1.4,8.13-1.4,12.8v3.6c0,6.27.8,11.67,2.4,16.2,1.6,4.53,4.07,8,7.4,10.4,3.33,2.4,7.6,3.6,12.8,3.6Z"/></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="1444.3" height="490.16" viewBox="0 0 1444.3 490.16"><defs><style>.cls-1{fill:#1b2e46;}.cls-2{fill:#e4a242;}.cls-3{fill:#f64419;}</style></defs><path class="cls-2" d="M345.26,215.05v114h-39v-71.47c2.58-3.65,4-8.48,4-13.53,0-10.45-6.03-20-16-20s-16,9.55-16,20c0,5.05,1.42,9.88,4,13.53v71.47h-42v-71.47c2.58-3.65,4-8.48,4-13.53,0-10.45-6.03-20-16-20s-16,9.55-16,20c0,5.05,1.42,9.88,4,13.53v71.47h-39v-114h-24v138h216v-138h-24Z"/><path class="cls-3" d="M369.25,212.24c0-32.96-19.22-47.45-47.93-47.45h-24c-15.36,0-22.33-5.39-24.06-27.74h-24c-1.73,22.35-8.7,27.74-24.06,27.74h-24c-28.71,0-47.93,14.48-47.93,47.45,0,.6,0,1.12-.01,2.82h24c0-1.51.02-2.23.02-2.82,0-11.58,8.85-20.21,24.01-20.21h23.91c20.38,0,31.3-8.61,36.06-25.67,4.76,17.07,15.68,25.67,36.06,25.67h23.91c15.15,0,24.01,8.63,24.01,20.21,0,.59.02,1.3.02,2.82h24c0-1.7-.01-2.22-.01-2.82Z"/><path class="cls-1" d="M561.52,190.55c-4.81-.47-9.88-.61-14.35,0-9.23,1.26-19,8.38-24.59,14.17-5.23-5.69-15.43-12.99-24.71-14.26-4.47-.61-9.54-.47-14.35,0-22.13,2.16-37.62,16.84-37.62,37.62v98.98h28v-98.98c0-5.31,5.33-8.6,9.62-9.62,4.21-1,11.51-1.06,15.35,0,3.54.98,9.62,4.32,9.62,9.62v98.98h.06v.09h28v-98.98c0-5.31,6.08-8.64,9.62-9.62,3.84-1.06,11.15-1,15.35,0,4.29,1.02,9.62,4.32,9.62,9.62v98.98h28v-98.98c0-20.78-15.5-35.46-37.62-37.62Z"/><path class="cls-1" d="M646.92,329.55c-3.47,0-7.17-.4-11.1-1.2-3.93-.8-7.63-2.23-11.1-4.3-3.47-2.07-6.3-5.07-8.5-9-2.2-3.93-3.3-8.96-3.3-15.1,0-7.33,1.6-13.4,4.8-18.2,3.2-4.8,7.77-8.57,13.7-11.3,5.93-2.73,13.03-4.63,21.3-5.7,8.27-1.07,17.4-1.6,27.4-1.6v-7.8c0-3.07-.5-5.73-1.5-8-1-2.27-2.73-4.07-5.2-5.4-2.47-1.33-5.9-2-10.3-2s-7.97.53-10.7,1.6c-2.73,1.07-4.67,2.43-5.8,4.1-1.13,1.67-1.7,3.5-1.7,5.5v2.4h-27c-.13-.67-.2-1.3-.2-1.9v-2.3c0-6.13,1.87-11.43,5.6-15.9,3.73-4.47,9-7.9,15.8-10.3,6.8-2.4,14.73-3.6,23.8-3.6,9.73,0,17.9,1.27,24.5,3.8,6.6,2.53,11.67,6.27,15.2,11.2,3.53,4.93,5.3,11.13,5.3,18.6v47.8c0,2.4.7,4.17,2.1,5.3,1.4,1.13,2.97,1.7,4.7,1.7h6.6v18.2c-1.33.67-3.4,1.37-6.2,2.1-2.8.73-6.2,1.1-10.2,1.1s-7.3-.57-10.3-1.7c-3-1.13-5.5-2.73-7.5-4.8-2-2.07-3.4-4.57-4.2-7.5h-1.4c-2.27,2.8-5.03,5.27-8.3,7.4-3.27,2.13-7.07,3.8-11.4,5-4.33,1.2-9.3,1.8-14.9,1.8ZM656.32,308.55c3.73,0,7.07-.57,10-1.7,2.93-1.13,5.4-2.67,7.4-4.6,2-1.93,3.57-4.3,4.7-7.1,1.13-2.8,1.7-5.8,1.7-9v-5.8c-7.47,0-14.13.5-20,1.5-5.87,1-10.5,2.7-13.9,5.1-3.4,2.4-5.1,5.73-5.1,10,0,2.4.6,4.47,1.8,6.2,1.2,1.73,2.93,3.07,5.2,4,2.27.93,5,1.4,8.2,1.4Z"/><path class="cls-1" d="M762.52,329.55c-6.67,0-12.07-1.2-16.2-3.6-4.13-2.4-7.13-5.63-9-9.7-1.87-4.07-2.8-8.57-2.8-13.5v-59.4h-13v-21.4h14l5.2-30h21.6v30h19.2v21.4h-19.2v54.8c0,3.2.73,5.63,2.2,7.3,1.47,1.67,3.87,2.5,7.2,2.5h9.8v18.4c-1.6.53-3.47,1.03-5.6,1.5-2.13.46-4.4.87-6.8,1.2-2.4.33-4.6.5-6.6.5Z"/><path class="cls-1" d="M840.71,329.55c-11.2,0-20.6-1.97-28.2-5.9-7.6-3.93-13.37-10-17.3-18.2-3.93-8.2-5.9-18.5-5.9-30.9s1.97-23.03,5.9-31.1c3.93-8.07,9.73-14.1,17.4-18.1,7.67-4,17.03-6,28.1-6,7.2,0,13.7.87,19.5,2.6,5.8,1.73,10.83,4.4,15.1,8,4.27,3.6,7.5,8.03,9.7,13.3,2.2,5.27,3.3,11.5,3.3,18.7h-27.8c0-4.8-.73-8.73-2.2-11.8-1.47-3.07-3.7-5.4-6.7-7-3-1.6-6.77-2.4-11.3-2.4-5.33,0-9.67,1.2-13,3.6-3.33,2.4-5.8,5.93-7.4,10.6-1.6,4.67-2.4,10.47-2.4,17.4v4.6c0,6.8.83,12.53,2.5,17.2,1.67,4.67,4.23,8.17,7.7,10.5,3.47,2.33,8,3.5,13.6,3.5,4.53,0,8.3-.8,11.3-2.4,3-1.6,5.3-4,6.9-7.2,1.6-3.2,2.4-7.07,2.4-11.6h26.4c0,6.8-1.1,12.87-3.3,18.2-2.2,5.33-5.4,9.8-9.6,13.4-4.2,3.6-9.23,6.33-15.1,8.2-5.87,1.87-12.4,2.8-19.6,2.8Z"/><path class="cls-1" d="M901.11,327.15v-144.6h27.8v51h1.4c2.27-2.8,4.97-5.23,8.1-7.3,3.13-2.07,6.67-3.7,10.6-4.9,3.93-1.2,8.23-1.8,12.9-1.8,6.93,0,13,1.27,18.2,3.8,5.2,2.53,9.23,6.53,12.1,12,2.87,5.47,4.3,12.6,4.3,21.4v70.4h-27.8v-66c0-3.33-.4-6.17-1.2-8.5-.8-2.33-1.97-4.27-3.5-5.8-1.53-1.53-3.43-2.63-5.7-3.3-2.27-.67-4.8-1-7.6-1-4.13,0-7.87,1-11.2,3-3.33,2-5.93,4.73-7.8,8.2-1.87,3.47-2.8,7.47-2.8,12v61.4h-27.8Z"/><path class="cls-1" d="M1031.5,327.15c3.19.95,6.88,1.42,11.07,1.42,2,0,4.2-.17,6.6-.5,2.4-.33,4.67-.73,6.8-1.2,2.13-.47,4-.97,5.6-1.5v-18.4h-9.8c-3.33,0-5.73-.83-7.2-2.5-1.47-1.67-2.2-4.1-2.2-7.3v-114.63s-27.8,0-27.8,0v119.22c0,4.93.93,9.43,2.8,13.5,1.87,4.07,4.87,7.3,9,9.7,1.53.89,3.24,1.62,5.13,2.18"/><path class="cls-1" d="M1103.65,329.55c-3.47,0-7.17-.4-11.1-1.2-3.93-.8-7.63-2.23-11.1-4.3-3.47-2.07-6.3-5.07-8.5-9-2.2-3.93-3.3-8.96-3.3-15.1,0-7.33,1.6-13.4,4.8-18.2,3.2-4.8,7.77-8.57,13.7-11.3,5.93-2.73,13.03-4.63,21.3-5.7,8.27-1.07,17.4-1.6,27.4-1.6v-7.8c0-3.07-.5-5.73-1.5-8-1-2.27-2.73-4.07-5.2-5.4-2.47-1.33-5.9-2-10.3-2s-7.97.53-10.7,1.6c-2.73,1.07-4.67,2.43-5.8,4.1-1.13,1.67-1.7,3.5-1.7,5.5v2.4h-27c-.13-.67-.2-1.3-.2-1.9v-2.3c0-6.13,1.87-11.43,5.6-15.9,3.73-4.47,9-7.9,15.8-10.3,6.8-2.4,14.73-3.6,23.8-3.6,9.73,0,17.9,1.27,24.5,3.8,6.6,2.53,11.67,6.27,15.2,11.2,3.53,4.93,5.3,11.13,5.3,18.6v47.8c0,2.4.7,4.17,2.1,5.3,1.4,1.13,2.97,1.7,4.7,1.7h6.6v18.2c-1.33.67-3.4,1.37-6.2,2.1-2.8.73-6.2,1.1-10.2,1.1s-7.3-.57-10.3-1.7c-3-1.13-5.5-2.73-7.5-4.8-2-2.07-3.4-4.57-4.2-7.5h-1.4c-2.27,2.8-5.03,5.27-8.3,7.4-3.27,2.13-7.07,3.8-11.4,5-4.33,1.2-9.3,1.8-14.9,1.8ZM1113.05,308.55c3.73,0,7.07-.57,10-1.7,2.93-1.13,5.4-2.67,7.4-4.6,2-1.93,3.57-4.3,4.7-7.1,1.13-2.8,1.7-5.8,1.7-9v-5.8c-7.47,0-14.13.5-20,1.5-5.87,1-10.5,2.7-13.9,5.1-3.4,2.4-5.1,5.73-5.1,10,0,2.4.6,4.47,1.8,6.2,1.2,1.73,2.93,3.07,5.2,4,2.27.93,5,1.4,8.2,1.4Z"/><path class="cls-1" d="M1248.64,329.55c-6.8,0-13.03-1.37-18.7-4.1-5.67-2.73-10.23-6.9-13.7-12.5h-1.4l-2.2,14.2h-22.8v-144.6h27.8v51h1.2c2.13-3.07,4.73-5.67,7.8-7.8,3.07-2.13,6.53-3.7,10.4-4.7,3.87-1,8.07-1.5,12.6-1.5,8.27,0,15.5,1.93,21.7,5.8,6.2,3.87,11.03,9.83,14.5,17.9,3.47,8.07,5.2,18.43,5.2,31.1s-1.7,23.07-5.1,31.2c-3.4,8.13-8.27,14.17-14.6,18.1-6.33,3.93-13.9,5.9-22.7,5.9ZM1240.04,306.75c5.6,0,10.03-1.1,13.3-3.3,3.27-2.2,5.63-5.5,7.1-9.9,1.46-4.4,2.2-9.93,2.2-16.6v-4.6c0-6.67-.73-12.23-2.2-16.7-1.47-4.47-3.83-7.8-7.1-10-3.27-2.2-7.7-3.3-13.3-3.3-4,0-7.4.7-10.2,2.1s-5.1,3.4-6.9,6c-1.8,2.6-3.17,5.83-4.1,9.7-.93,3.87-1.4,8.13-1.4,12.8v3.6c0,6.27.8,11.67,2.4,16.2,1.6,4.53,4.07,8,7.4,10.4,3.33,2.4,7.6,3.6,12.8,3.6Z"/></svg>