table-stitcher 0.4.1__tar.gz → 0.4.2__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 (133) hide show
  1. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/CHANGELOG.md +13 -0
  2. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/PKG-INFO +1 -1
  3. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/pyproject.toml +1 -1
  4. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/scripts/release_gate.sh +8 -0
  5. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/src/table_stitcher/__init__.py +8 -1
  6. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/.claude/settings.json +0 -0
  7. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  8. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  9. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  10. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/.github/dependabot.yml +0 -0
  11. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/.github/pull_request_template.md +0 -0
  12. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/.github/workflows/ci.yml +0 -0
  13. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/.github/workflows/release.yml +0 -0
  14. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/.github/workflows/upstream-smoke.yml +0 -0
  15. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/.gitignore +0 -0
  16. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/.pre-commit-config.yaml +0 -0
  17. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/CONTRIBUTING.md +0 -0
  18. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/LICENSE +0 -0
  19. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/README.md +0 -0
  20. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/SECURITY.md +0 -0
  21. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/examples/basic_pipeline.py +0 -0
  22. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/examples/system_controller.py +0 -0
  23. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/scripts/regenerate_docling_snapshots.py +0 -0
  24. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/src/table_stitcher/adapters/README.md +0 -0
  25. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/src/table_stitcher/adapters/__init__.py +0 -0
  26. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/src/table_stitcher/adapters/base.py +0 -0
  27. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/src/table_stitcher/adapters/docling.py +0 -0
  28. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/src/table_stitcher/merger.py +0 -0
  29. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/src/table_stitcher/models.py +0 -0
  30. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/src/table_stitcher/py.typed +0 -0
  31. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/README.md +0 -0
  32. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/__init__.py +0 -0
  33. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/fixtures/tablemeta/headerless-width-drift.yaml +0 -0
  34. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/__init__.py +0 -0
  35. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/_tools/__init__.py +0 -0
  36. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/_tools/regenerate_expected.py +0 -0
  37. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/conftest.py +0 -0
  38. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/_synth/__init__.py +0 -0
  39. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/_synth/generate.py +0 -0
  40. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/distinct-tables-no-merge/.gitkeep +0 -0
  41. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/distinct-tables-no-merge/kaop-study-mixed-3pg.pt2.docling.json +0 -0
  42. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/distinct-tables-no-merge/kaop-study-mixed-3pg.pt2.expected.yaml +0 -0
  43. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/distinct-tables-no-merge/kaop-study-mixed-3pg.pt2.pdf +0 -0
  44. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/distinct-tables-no-merge/lab-panels-3pg.corp.docling.json +0 -0
  45. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/distinct-tables-no-merge/lab-panels-3pg.corp.expected.yaml +0 -0
  46. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/distinct-tables-no-merge/lab-panels-3pg.corp.pdf +0 -0
  47. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/false-merge/category-rows-thematic-2pg.corp.docling.json +0 -0
  48. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/false-merge/category-rows-thematic-2pg.corp.expected.yaml +0 -0
  49. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/false-merge/category-rows-thematic-2pg.corp.pdf +0 -0
  50. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/15-page-druglist.corp.docling.json +0 -0
  51. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/15-page-druglist.corp.expected.yaml +0 -0
  52. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/15-page-druglist.corp.pdf +0 -0
  53. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/gene-symbols-6pg.pt2.docling.json +0 -0
  54. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/gene-symbols-6pg.pt2.expected.yaml +0 -0
  55. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/gene-symbols-6pg.pt2.pdf +0 -0
  56. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/rct-study-table-5pg.pt2.docling.json +0 -0
  57. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/rct-study-table-5pg.pt2.expected.yaml +0 -0
  58. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/rct-study-table-5pg.pt2.pdf +0 -0
  59. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/rrt-outcomes-2pg.pt2.docling.json +0 -0
  60. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/rrt-outcomes-2pg.pt2.expected.yaml +0 -0
  61. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/rrt-outcomes-2pg.pt2.pdf +0 -0
  62. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/uveitis-case-series-5pg.pt2.docling.json +0 -0
  63. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/uveitis-case-series-5pg.pt2.expected.yaml +0 -0
  64. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/headerless-continuation/uveitis-case-series-5pg.pt2.pdf +0 -0
  65. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/inconsistent-header-detection/covid-misc-labs-4pg.pt2.docling.json +0 -0
  66. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/inconsistent-header-detection/covid-misc-labs-4pg.pt2.expected.yaml +0 -0
  67. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/inconsistent-header-detection/covid-misc-labs-4pg.pt2.pdf +0 -0
  68. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/inconsistent-header-detection/lit-review-3pg.pt2.docling.json +0 -0
  69. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/inconsistent-header-detection/lit-review-3pg.pt2.expected.yaml +0 -0
  70. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/inconsistent-header-detection/lit-review-3pg.pt2.pdf +0 -0
  71. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/inconsistent-header-detection/retirement-portfolio.corp.docling.json +0 -0
  72. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/inconsistent-header-detection/retirement-portfolio.corp.expected.yaml +0 -0
  73. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/inconsistent-header-detection/retirement-portfolio.corp.pdf +0 -0
  74. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/loose-header-layout/.gitkeep +0 -0
  75. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/loose-header-layout/biological-process-2pg.pt2.docling.json +0 -0
  76. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/loose-header-layout/biological-process-2pg.pt2.expected.yaml +0 -0
  77. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/loose-header-layout/biological-process-2pg.pt2.pdf +0 -0
  78. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/loose-header-layout/symptoms-mediators-4pg.pt2.docling.json +0 -0
  79. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/loose-header-layout/symptoms-mediators-4pg.pt2.expected.yaml +0 -0
  80. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/loose-header-layout/symptoms-mediators-4pg.pt2.pdf +0 -0
  81. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/multilingual/corporate-history-2pg.edinet.docling.json +0 -0
  82. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/multilingual/corporate-history-2pg.edinet.expected.yaml +0 -0
  83. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/multilingual/corporate-history-2pg.edinet.pdf +0 -0
  84. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/multilingual/subsidiaries-4pg.edinet.docling.json +0 -0
  85. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/multilingual/subsidiaries-4pg.edinet.expected.yaml +0 -0
  86. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/multilingual/subsidiaries-4pg.edinet.pdf +0 -0
  87. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/orphan-pair/.gitkeep +0 -0
  88. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/orphan-pair/varicose-veins-new-table-header-7pg.pt2.docling.json +0 -0
  89. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/orphan-pair/varicose-veins-new-table-header-7pg.pt2.expected.yaml +0 -0
  90. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/orphan-pair/varicose-veins-new-table-header-7pg.pt2.pdf +0 -0
  91. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/page-gap-too-large/unrelated-tables-gap4.synth.docling.json +0 -0
  92. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/page-gap-too-large/unrelated-tables-gap4.synth.expected.yaml +0 -0
  93. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/page-gap-too-large/unrelated-tables-gap4.synth.pdf +0 -0
  94. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/4-page-substance-list.corp.docling.json +0 -0
  95. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/4-page-substance-list.corp.expected.yaml +0 -0
  96. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/4-page-substance-list.corp.pdf +0 -0
  97. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/cell-markers-4pg.pt2.docling.json +0 -0
  98. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/cell-markers-4pg.pt2.expected.yaml +0 -0
  99. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/cell-markers-4pg.pt2.pdf +0 -0
  100. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/challenge-categories-2pg.pt2.docling.json +0 -0
  101. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/challenge-categories-2pg.pt2.expected.yaml +0 -0
  102. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/challenge-categories-2pg.pt2.pdf +0 -0
  103. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/fungal-taxonomy-4pg.pt2.docling.json +0 -0
  104. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/fungal-taxonomy-4pg.pt2.expected.yaml +0 -0
  105. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/fungal-taxonomy-4pg.pt2.pdf +0 -0
  106. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/rowspan-insurance-payout.corp.docling.json +0 -0
  107. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/rowspan-insurance-payout.corp.expected.yaml +0 -0
  108. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/rowspan-insurance-payout.corp.pdf +0 -0
  109. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/search-strategies-2pg.pt2.docling.json +0 -0
  110. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/search-strategies-2pg.pt2.expected.yaml +0 -0
  111. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/search-strategies-2pg.pt2.pdf +0 -0
  112. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/study-sample-7pg.pt2.docling.json +0 -0
  113. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/study-sample-7pg.pt2.expected.yaml +0 -0
  114. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/study-sample-7pg.pt2.pdf +0 -0
  115. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/themes-exemplars-3pg.pt2.docling.json +0 -0
  116. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/themes-exemplars-3pg.pt2.expected.yaml +0 -0
  117. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/repeated-header/themes-exemplars-3pg.pt2.pdf +0 -0
  118. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/simple-continuation/sample-table.corp.docling.json +0 -0
  119. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/simple-continuation/sample-table.corp.expected.yaml +0 -0
  120. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/simple-continuation/sample-table.corp.pdf +0 -0
  121. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/spillover/note-overflow.synth.docling.json +0 -0
  122. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/spillover/note-overflow.synth.expected.yaml +0 -0
  123. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/spillover/note-overflow.synth.pdf +0 -0
  124. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/width-drift/.gitkeep +0 -0
  125. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/width-drift/abx-literature-review-7pg.pt2.docling.json +0 -0
  126. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/width-drift/abx-literature-review-7pg.pt2.expected.yaml +0 -0
  127. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/fixtures/width-drift/abx-literature-review-7pg.pt2.pdf +0 -0
  128. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/integration/test_fixtures.py +0 -0
  129. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/test_docling_adapter.py +0 -0
  130. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/test_intervening_content_guard.py +0 -0
  131. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/test_merger.py +0 -0
  132. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/test_public_api.py +0 -0
  133. {table_stitcher-0.4.1 → table_stitcher-0.4.2}/tests/test_tablemeta_fixtures.py +0 -0
@@ -7,6 +7,19 @@ the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.2] — 2026-06-08
11
+
12
+ ### Fixed
13
+
14
+ - **`__version__` was hardcoded and stale** (`__init__.py`). It read `"0.2.0"`
15
+ regardless of the installed release, since nothing tied it to the version in
16
+ `pyproject.toml`. It is now derived from the installed distribution metadata
17
+ via `importlib.metadata.version("table-stitcher")`, so it always reflects the
18
+ actual release (falling back to `"0.0.0+unknown"` when run from an
19
+ uninstalled source tree). The release gate now also asserts
20
+ `__version__` matches the `pyproject.toml` version, so the two can't drift
21
+ again.
22
+
10
23
  ## [0.4.1] — 2026-06-08
11
24
 
12
25
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: table-stitcher
3
- Version: 0.4.1
3
+ Version: 0.4.2
4
4
  Summary: Reassemble tables split across page boundaries in PDF extraction
5
5
  Project-URL: Homepage, https://github.com/pebbleroad/table-stitcher
6
6
  Project-URL: Repository, https://github.com/pebbleroad/table-stitcher
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "table-stitcher"
7
- version = "0.4.1"
7
+ version = "0.4.2"
8
8
  description = "Reassemble tables split across page boundaries in PDF extraction"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -69,15 +69,23 @@ else
69
69
  fi
70
70
 
71
71
  echo "==> Smoke-testing installed wheel outside checkout"
72
+ EXPECTED_VERSION="$(grep -E '^version = ' pyproject.toml | head -1 | sed -E 's/.*"([^"]+)".*/\1/')"
73
+ export EXPECTED_VERSION
72
74
  (
73
75
  cd "$TMP_ENV"
74
76
  "$TMP_ENV/venv/bin/python" - <<'PY'
77
+ import os
75
78
  import pathlib
79
+
76
80
  import table_stitcher
77
81
 
78
82
  package_path = pathlib.Path(table_stitcher.__file__).resolve()
83
+ expected = os.environ["EXPECTED_VERSION"]
79
84
  assert "site-packages" in str(package_path), package_path
80
85
  assert table_stitcher.__version__, "missing __version__"
86
+ assert table_stitcher.__version__ == expected, (
87
+ f"__version__ {table_stitcher.__version__!r} != pyproject version {expected!r}"
88
+ )
81
89
  assert callable(table_stitcher.stitch_tables)
82
90
  print(f"installed {table_stitcher.__version__} from {package_path}")
83
91
  PY
@@ -24,13 +24,20 @@ Usage (custom parser):
24
24
 
25
25
  import logging
26
26
  import time
27
+ from importlib.metadata import PackageNotFoundError
28
+ from importlib.metadata import version as _pkg_version
27
29
  from typing import Any, Optional
28
30
 
29
31
  from .adapters.base import TableStitcherAdapter
30
32
  from .merger import merge_multipage_tables
31
33
  from .models import LogicalTable, MergeTrace, MultiPageConfig, TableMeta
32
34
 
33
- __version__ = "0.2.0"
35
+ # Single source of truth: the installed distribution's version (from
36
+ # pyproject.toml). Derived rather than hardcoded so it can never drift.
37
+ try:
38
+ __version__ = _pkg_version("table-stitcher")
39
+ except PackageNotFoundError: # running from a source tree without an install
40
+ __version__ = "0.0.0+unknown"
34
41
  __all__ = [
35
42
  "stitch_tables",
36
43
  "extract_table_meta",
File without changes
File without changes