parse-bench 1.0.1__tar.gz → 1.0.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 (356) hide show
  1. {parse_bench-1.0.1 → parse_bench-1.0.2}/CHANGELOG.md +18 -0
  2. {parse_bench-1.0.1 → parse_bench-1.0.2}/PKG-INFO +1 -1
  3. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/__init__.py +1 -1
  4. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/layout_adapters/adapters.py +46 -3
  5. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rules_chart.py +85 -12
  6. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_chart_data_point_rule.py +74 -0
  7. {parse_bench-1.0.1 → parse_bench-1.0.2}/.gitignore +0 -0
  8. {parse_bench-1.0.1 → parse_bench-1.0.2}/LICENSE +0 -0
  9. {parse_bench-1.0.1 → parse_bench-1.0.2}/README.md +0 -0
  10. {parse_bench-1.0.1 → parse_bench-1.0.2}/pyproject.toml +0 -0
  11. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/analysis/__init__.py +0 -0
  12. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/analysis/aggregation_report.py +0 -0
  13. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/analysis/cli.py +0 -0
  14. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/analysis/comparison.py +0 -0
  15. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/analysis/comparison_core.py +0 -0
  16. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/analysis/comparison_report.py +0 -0
  17. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/analysis/detailed_report.py +0 -0
  18. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/analysis/leaderboard_report.py +0 -0
  19. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/analysis/metric_definitions.py +0 -0
  20. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/cli.py +0 -0
  21. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/data/__init__.py +0 -0
  22. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/data/cli.py +0 -0
  23. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/data/download.py +0 -0
  24. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/__init__.py +0 -0
  25. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/cli.py +0 -0
  26. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/evaluators/__init__.py +0 -0
  27. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/evaluators/base.py +0 -0
  28. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/evaluators/extract.py +0 -0
  29. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/evaluators/layoutdet.py +0 -0
  30. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/evaluators/parse.py +0 -0
  31. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/evaluators/qa.py +0 -0
  32. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/layout_adapters/__init__.py +0 -0
  33. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/layout_adapters/base.py +0 -0
  34. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/layout_adapters/registry.py +0 -0
  35. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/layout_label_mappers/__init__.py +0 -0
  36. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/layout_label_mappers/base.py +0 -0
  37. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/layout_label_mappers/mappers.py +0 -0
  38. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/layout_label_mappers/projection.py +0 -0
  39. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/layout_label_mappers/registry.py +0 -0
  40. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metric_aggregation.py +0 -0
  41. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/__init__.py +0 -0
  42. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/attribution/__init__.py +0 -0
  43. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/attribution/constants.py +0 -0
  44. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/attribution/core.py +0 -0
  45. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/attribution/evaluate.py +0 -0
  46. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/attribution/geometry.py +0 -0
  47. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/attribution/text_utils.py +0 -0
  48. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/base.py +0 -0
  49. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/downstream/__init__.py +0 -0
  50. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/extract/__init__.py +0 -0
  51. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/extract/json_subset_match.py +0 -0
  52. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/extract/json_subset_match_metric.py +0 -0
  53. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/extract/list_unwrap.py +0 -0
  54. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/extract/rule_based_metric.py +0 -0
  55. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/extract/test_rules.py +0 -0
  56. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/extract/test_types.py +0 -0
  57. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/field_grounding/__init__.py +0 -0
  58. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/field_grounding/core.py +0 -0
  59. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/field_grounding/extract_adapter.py +0 -0
  60. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/field_grounding/parse_adapter.py +0 -0
  61. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/field_grounding/rule_filters.py +0 -0
  62. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/field_grounding/value_compare.py +0 -0
  63. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/layoutdet/__init__.py +0 -0
  64. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/layoutdet/classification_utils.py +0 -0
  65. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/layoutdet/iou.py +0 -0
  66. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/__init__.py +0 -0
  67. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/_vendor_grits_reference.py +0 -0
  68. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/cross_page_table_consistency.py +0 -0
  69. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/emphasis_spans.py +0 -0
  70. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/fast_tree_edit.py +0 -0
  71. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/grits_metric.py +0 -0
  72. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/grits_reference_metric.py +0 -0
  73. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/header_accuracy_metric.py +0 -0
  74. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/llm_normalization/__init__.py +0 -0
  75. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/llm_normalization/base.py +0 -0
  76. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/llm_normalization/config.py +0 -0
  77. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/llm_normalization/postprocess.py +0 -0
  78. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/llm_normalization/strategy_judge.py +0 -0
  79. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/mermaid_graph.py +0 -0
  80. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rule_based_judge_metric.py +0 -0
  81. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rule_based_metric.py +0 -0
  82. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rules_bag.py +0 -0
  83. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rules_base.py +0 -0
  84. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rules_diagram.py +0 -0
  85. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rules_form.py +0 -0
  86. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rules_formatting.py +0 -0
  87. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rules_heading.py +0 -0
  88. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rules_list.py +0 -0
  89. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rules_page_decoration.py +0 -0
  90. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rules_table.py +0 -0
  91. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rules_text.py +0 -0
  92. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/rules_watermark.py +0 -0
  93. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/structural_consistency_metric.py +0 -0
  94. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/table_extraction.py +0 -0
  95. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/table_merging.py +0 -0
  96. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/table_pairing.py +0 -0
  97. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/table_parsing.py +0 -0
  98. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/table_record_match_metric.py +0 -0
  99. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/table_splitting.py +0 -0
  100. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/table_title_stripping.py +0 -0
  101. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/teds_metric.py +0 -0
  102. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/test_rules.py +0 -0
  103. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/test_types.py +0 -0
  104. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/text_content_projection.py +0 -0
  105. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/text_similarity_metric.py +0 -0
  106. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/parse/utils.py +0 -0
  107. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/qa/__init__.py +0 -0
  108. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/metrics/qa/answer_comparison.py +0 -0
  109. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/qa/__init__.py +0 -0
  110. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/qa/llm_service.py +0 -0
  111. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/reports/__init__.py +0 -0
  112. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/reports/csv.py +0 -0
  113. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/reports/html.py +0 -0
  114. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/reports/markdown.py +0 -0
  115. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/reports/rule_csv.py +0 -0
  116. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/runner.py +0 -0
  117. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/evaluation/stats.py +0 -0
  118. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/extensions.py +0 -0
  119. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/geometry/__init__.py +0 -0
  120. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/geometry/rotated_bbox.py +0 -0
  121. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/__init__.py +0 -0
  122. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/chunkr_layout_extraction.py +0 -0
  123. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/cli.py +0 -0
  124. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/layout_extraction.py +0 -0
  125. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/pipelines/__init__.py +0 -0
  126. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/pipelines/extract.py +0 -0
  127. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/pipelines/layout.py +0 -0
  128. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/pipelines/parse.py +0 -0
  129. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/pipelines.py +0 -0
  130. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/__init__.py +0 -0
  131. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/base.py +0 -0
  132. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/cancellation.py +0 -0
  133. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/extract/__init__.py +0 -0
  134. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/extract/citations.py +0 -0
  135. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/extract/extend.py +0 -0
  136. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/extract/llamaextract_v2_api.py +0 -0
  137. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/layoutdet/__init__.py +0 -0
  138. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/layoutdet/adapters.py +0 -0
  139. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/layoutdet/base.py +0 -0
  140. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/layoutdet/chandra.py +0 -0
  141. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/layoutdet/docling.py +0 -0
  142. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/layoutdet/dots_ocr.py +0 -0
  143. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/layoutdet/layout_v3.py +0 -0
  144. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/layoutdet/layout_v3_byoc.py +0 -0
  145. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/layoutdet/paddle.py +0 -0
  146. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/layoutdet/qwen3vl.py +0 -0
  147. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/layoutdet/surya.py +0 -0
  148. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/layoutdet/yolo.py +0 -0
  149. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/__init__.py +0 -0
  150. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/_docling_common.py +0 -0
  151. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/_layout_utils.py +0 -0
  152. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/amazon_nova.py +0 -0
  153. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/anthropic.py +0 -0
  154. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/azure_document_intelligence.py +0 -0
  155. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/chandra2.py +0 -0
  156. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/chunkr.py +0 -0
  157. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/databricks_ai_parse.py +0 -0
  158. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/datalab.py +0 -0
  159. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/deepseekocr2.py +0 -0
  160. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/docling.py +0 -0
  161. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/docling_serve.py +0 -0
  162. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/dots_ocr.py +0 -0
  163. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/extend_parse.py +0 -0
  164. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/falconocr.py +0 -0
  165. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/florin_parser_nano.py +0 -0
  166. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/gemma4.py +0 -0
  167. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/glm_zai.py +0 -0
  168. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/google.py +0 -0
  169. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/google_agentic_vision.py +0 -0
  170. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/google_docai.py +0 -0
  171. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/google_docai_layout_normalization.py +0 -0
  172. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/granite_vision.py +0 -0
  173. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/infinity_parser2.py +0 -0
  174. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/kdl_frontier_nano.py +0 -0
  175. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/landingai.py +0 -0
  176. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/liteparse.py +0 -0
  177. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/llamaparse.py +0 -0
  178. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/llamaparse_v2_normalization.py +0 -0
  179. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/markitdown.py +0 -0
  180. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/mineru25.py +0 -0
  181. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/mineru2605pro.py +0 -0
  182. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/mineru_diffusion.py +0 -0
  183. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/mistral_ocr.py +0 -0
  184. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/nemotron_omni.py +0 -0
  185. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/oi_parser.py +0 -0
  186. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/openai.py +0 -0
  187. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/opendataloader.py +0 -0
  188. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/paddleocr.py +0 -0
  189. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/pdf_inspector.py +0 -0
  190. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/pulse.py +0 -0
  191. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/pymupdf.py +0 -0
  192. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/pymupdf4llm.py +0 -0
  193. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/pypdf.py +0 -0
  194. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/qwen.py +0 -0
  195. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/rakedoc_nano.py +0 -0
  196. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/reducto.py +0 -0
  197. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/surya2.py +0 -0
  198. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/tesseract.py +0 -0
  199. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/textract.py +0 -0
  200. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/unlimitedocr.py +0 -0
  201. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/unstructured.py +0 -0
  202. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/parse/warp_ingest.py +0 -0
  203. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/providers/registry.py +0 -0
  204. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/renormalize.py +0 -0
  205. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/inference/runner.py +0 -0
  206. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/layout_label_mapping.py +0 -0
  207. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/layout_projection.py +0 -0
  208. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/pipeline/__init__.py +0 -0
  209. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/pipeline/cli.py +0 -0
  210. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/py.typed +0 -0
  211. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/schemas/__init__.py +0 -0
  212. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/schemas/evaluation.py +0 -0
  213. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/schemas/extract_output.py +0 -0
  214. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/schemas/layout_detection_output.py +0 -0
  215. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/schemas/layout_ontology.py +0 -0
  216. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/schemas/metrics.py +0 -0
  217. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/schemas/parse_output.py +0 -0
  218. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/schemas/pipeline.py +0 -0
  219. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/schemas/pipeline_io.py +0 -0
  220. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/schemas/product.py +0 -0
  221. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/test_cases/__init__.py +0 -0
  222. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/test_cases/bbox_value_strict_comparator.py +0 -0
  223. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/test_cases/extract_field_paths.py +0 -0
  224. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/test_cases/layout_attribution_generation.py +0 -0
  225. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/test_cases/loader.py +0 -0
  226. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/test_cases/parse_rule_schemas.py +0 -0
  227. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/test_cases/rule_filters.py +0 -0
  228. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/test_cases/rule_ids.py +0 -0
  229. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/test_cases/schema.py +0 -0
  230. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/utils/__init__.py +0 -0
  231. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/utils/gemini_layout_utils.py +0 -0
  232. {parse_bench-1.0.1 → parse_bench-1.0.2}/src/parse_bench/utils/text_aggregation.py +0 -0
  233. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/analysis/test_comparison_consistency.py +0 -0
  234. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/analysis/test_comparison_core.py +0 -0
  235. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/analysis/test_comparison_directory_suffix.py +0 -0
  236. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/analysis/test_detailed_report.py +0 -0
  237. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/evaluators/test_extract_empty_expected_output.py +0 -0
  238. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/evaluators/test_parse_evaluator_layout_rule_filter.py +0 -0
  239. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/evaluators/test_parse_evaluator_styling_rollup.py +0 -0
  240. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/evaluators/test_parse_evaluator_table_pages.py +0 -0
  241. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/layout_adapters/test_docling_parse_layout_adapter.py +0 -0
  242. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/layout_adapters/test_llamaparse_attribution_scope.py +0 -0
  243. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/layout_adapters/test_llamaparse_canonical_layout_pages.py +0 -0
  244. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/layout_label_mappers/test_llamaparse_label_mapper.py +0 -0
  245. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/layout_label_mappers/test_projection_attributes.py +0 -0
  246. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/layout_label_mappers/test_projection_dual_read.py +0 -0
  247. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/layout_label_mappers/test_pymupdf4llm_label_mapper.py +0 -0
  248. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/attribution/test_attribution_overclaim.py +0 -0
  249. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/extract/test_json_subset_match.py +0 -0
  250. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/field_grounding/test_extract_adapter.py +0 -0
  251. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/layoutdet/test_classification_utils_paging.py +0 -0
  252. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/layoutdet/test_rotated_iou.py +0 -0
  253. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_chart_label_punctuation.py +0 -0
  254. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_cross_page_table_consistency_metric.py +0 -0
  255. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_degenerate_marker_rules.py +0 -0
  256. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_diagram_rules.py +0 -0
  257. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_fast_table_parity.py +0 -0
  258. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_form_field_rule.py +0 -0
  259. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_formatting_rule_adjacent_spans.py +0 -0
  260. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_grits_metric.py +0 -0
  261. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_grits_perf_equivalence.py +0 -0
  262. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_grits_trm_composite.py +0 -0
  263. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_header_accuracy_metric.py +0 -0
  264. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_heading_structure_rule.py +0 -0
  265. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_merge_preceding_titles.py +0 -0
  266. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_normalize_cell_text.py +0 -0
  267. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_normalize_text_inline_tag_separator.py +0 -0
  268. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_page_decoration_rule.py +0 -0
  269. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_parse_combining_mark_tokenization.py +0 -0
  270. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_parse_formatting_rule_paragraph_spans.py +0 -0
  271. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_parse_formatting_rule_quotes.py +0 -0
  272. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_parse_formatting_rule_span_scope.py +0 -0
  273. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_parse_list_level_rule.py +0 -0
  274. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_parse_table_cell_augmentation.py +0 -0
  275. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_parse_text_order_rule_html.py +0 -0
  276. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_parse_text_presence_rule.py +0 -0
  277. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_relaxed_normalize_cell_text.py +0 -0
  278. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_rule_metric_budget_and_bag_images.py +0 -0
  279. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_rule_metric_side_inputs.py +0 -0
  280. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_table_caption_title_band.py +0 -0
  281. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_table_cell_inline_marker_separator.py +0 -0
  282. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_table_dot_leaders.py +0 -0
  283. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_table_extraction.py +0 -0
  284. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_table_marker_cells_rule.py +0 -0
  285. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_table_merging_metric.py +0 -0
  286. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_table_pairing.py +0 -0
  287. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_table_record_match_metric.py +0 -0
  288. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_table_row_header_th.py +0 -0
  289. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_table_splitting.py +0 -0
  290. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_table_tbody_provenance.py +0 -0
  291. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_table_title_stripping.py +0 -0
  292. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_teds_metric.py +0 -0
  293. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_text_color_rule.py +0 -0
  294. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_text_content_projection.py +0 -0
  295. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_text_similarity_metric.py +0 -0
  296. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_title_hierarchy_inapplicable.py +0 -0
  297. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/parse/test_watermark_removal_rule.py +0 -0
  298. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/metrics/qa/test_answer_comparison_exact_choice.py +0 -0
  299. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/test_cli_detailed_report_nonfatal.py +0 -0
  300. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/test_runner_aggregation.py +0 -0
  301. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/test_runner_result_files.py +0 -0
  302. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/test_runner_worker_timeout.py +0 -0
  303. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/evaluation/test_stats.py +0 -0
  304. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/geometry/test_rotated_bbox.py +0 -0
  305. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/extract/test_extend_cost_stats.py +0 -0
  306. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/extract/test_extend_schema_adapter.py +0 -0
  307. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_amazon_nova.py +0 -0
  308. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_anthropic_pricing.py +0 -0
  309. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_azure_document_intelligence_layout.py +0 -0
  310. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_chandra2_multipage.py +0 -0
  311. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_datalab.py +0 -0
  312. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_deepseekocr2_multipage.py +0 -0
  313. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_extend_parse_pages.py +0 -0
  314. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_falconocr_multipage.py +0 -0
  315. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_gemma4_multipage.py +0 -0
  316. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_glm_zai.py +0 -0
  317. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_google_parse_pricing.py +0 -0
  318. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_granite_vision_multipage.py +0 -0
  319. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_infinity_parser2.py +0 -0
  320. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_kdl_frontier_nano.py +0 -0
  321. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_layout_coordinate_frames.py +0 -0
  322. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_layout_utils.py +0 -0
  323. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_liteparse_layout.py +0 -0
  324. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_llamaparse_picture_type.py +0 -0
  325. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_llamaparse_polling.py +0 -0
  326. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_llamaparse_usage_metadata.py +0 -0
  327. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_llamaparse_v2_normalization.py +0 -0
  328. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_llamaparse_v2_null_page_fields.py +0 -0
  329. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_mineru25_multipage.py +0 -0
  330. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_mineru2605pro_multipage.py +0 -0
  331. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_mineru_diffusion_multipage.py +0 -0
  332. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_nemotron_omni_multipage.py +0 -0
  333. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_openai_parse_errors.py +0 -0
  334. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_paddleocr_multipage.py +0 -0
  335. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_pymupdf4llm.py +0 -0
  336. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_qwen.py +0 -0
  337. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_reducto_normalize.py +0 -0
  338. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_surya2_multipage.py +0 -0
  339. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_textract_cost.py +0 -0
  340. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_unlimitedocr_multipage.py +0 -0
  341. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/providers/parse/test_warp_ingest.py +0 -0
  342. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/test_cli.py +0 -0
  343. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/test_layout_extraction.py +0 -0
  344. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/test_parse_pipelines.py +0 -0
  345. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/test_renormalize.py +0 -0
  346. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/inference/test_runner.py +0 -0
  347. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/test_cases/test_loader_stem_twins.py +0 -0
  348. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/test_cases/test_parse_rule_schemas.py +0 -0
  349. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/test_cases/test_rule_ids.py +0 -0
  350. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/test_evaluation_schema_extra_fields.py +0 -0
  351. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/test_extensions.py +0 -0
  352. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/parse_bench/test_layout_label_mapping_code_alias.py +0 -0
  353. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/test_data_dir_routing.py +0 -0
  354. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/test_extract_integration.py +0 -0
  355. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/test_llamaparse_base_url.py +0 -0
  356. {parse_bench-1.0.1 → parse_bench-1.0.2}/tests/test_pulse_public_api.py +0 -0
@@ -4,6 +4,24 @@ All notable changes to `parse-bench` are recorded here. The format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
5
5
  [Semantic Versioning](https://semver.org/).
6
6
 
7
+ ## [1.0.2] - 2026-09-04
8
+
9
+ Ports two fixes that landed in the internal harness while 1.0.1 was being cut.
10
+
11
+ ### Scoring (changes evaluation numbers)
12
+ - `chart_data_point`: number parsing accepts accounting negatives (`(4)`,
13
+ `$(4)`, `($4)`, trailing minus), the `bn` billion suffix, and no longer
14
+ reads a comma followed by a space as a decimal separator. A numeric rule
15
+ value no longer fuzzy-matches a compound cell (`249` vs `249, 188`); a cell
16
+ that carries one numeric token plus an axis unit (`68.7 days`) does match.
17
+ A repeated column header after a body section label counts as local scope
18
+ only when the complete pair precedes the candidate.
19
+
20
+ ### Added
21
+ - Granular pages carry a `cells` layer; the LlamaParse adapter reads the
22
+ provider-neutral `granular_layers` on normalized pages before falling back
23
+ to the grounded-page payload.
24
+
7
25
  ## [1.0.1] - 2026-09-03
8
26
 
9
27
  Harness-facing release: no evaluation number changes. Everything here lets a
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: parse-bench
3
- Version: 1.0.1
3
+ Version: 1.0.2
4
4
  Summary: ParseBench: a benchmark and evaluation harness for document parsing systems on real-world enterprise documents
5
5
  Project-URL: Homepage, https://parsebench.ai
6
6
  Project-URL: Repository, https://github.com/run-llama/ParseBench
@@ -1,3 +1,3 @@
1
1
  """Document parsing evaluation system for competitive benchmarking."""
2
2
 
3
- __version__ = "1.0.1"
3
+ __version__ = "1.0.2"
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import re
6
6
  from collections.abc import Sequence
7
- from dataclasses import dataclass
7
+ from dataclasses import dataclass, field
8
8
  from typing import Any, cast
9
9
 
10
10
  from parse_bench.evaluation.layout_adapters.base import LayoutAdapter
@@ -60,6 +60,7 @@ class _GranularPage:
60
60
  page_number: int
61
61
  lines: list[_GranularTextUnit]
62
62
  words: list[_GranularTextUnit]
63
+ cells: list[_GranularTextUnit] = field(default_factory=list)
63
64
 
64
65
 
65
66
  @register_layout_adapter("__default__", priority=-100)
@@ -213,8 +214,12 @@ class LlamaParseLayoutAdapter(LayoutAdapter):
213
214
  )
214
215
 
215
216
  def to_granular_pages(self, inference_result: InferenceResult) -> list[_GranularPage]:
216
- if isinstance(inference_result.output, ParseOutput) and inference_result.output.grounded_pages:
217
- return _build_llamaparse_granular_pages_from_payload(inference_result.output.grounded_pages)
217
+ if isinstance(inference_result.output, ParseOutput):
218
+ normalized_pages = _build_normalized_granular_pages(inference_result.output.layout_pages)
219
+ if normalized_pages:
220
+ return normalized_pages
221
+ if inference_result.output.grounded_pages:
222
+ return _build_llamaparse_granular_pages_from_payload(inference_result.output.grounded_pages)
218
223
 
219
224
  raw_output = inference_result.raw_output if isinstance(inference_result.raw_output, dict) else {}
220
225
  grounded_pages = raw_output.get("v2_grounded_items", raw_output.get("grounded_items"))
@@ -284,6 +289,44 @@ class WarpIngestLayoutAdapter(LayoutAdapter):
284
289
  )
285
290
 
286
291
 
292
+ def _build_normalized_granular_pages(layout_pages: list[Any]) -> list[_GranularPage]:
293
+ """Read provider-neutral granular layers retained on normalized Parse pages."""
294
+ pages: list[_GranularPage] = []
295
+ for page in layout_pages:
296
+ units_by_granularity: dict[str, list[_GranularTextUnit]] = {
297
+ "line": [],
298
+ "word": [],
299
+ "cell": [],
300
+ }
301
+ for layer in page.granular_layers:
302
+ if layer.granularity not in units_by_granularity:
303
+ continue
304
+ for unit in layer.units:
305
+ units_by_granularity[layer.granularity].append(
306
+ _GranularTextUnit(
307
+ text=unit.text,
308
+ bbox=_GranularSegment(
309
+ x=unit.bbox.x,
310
+ y=unit.bbox.y,
311
+ w=unit.bbox.w,
312
+ h=unit.bbox.h,
313
+ r=unit.bbox.r,
314
+ ),
315
+ order_index=unit.order_index,
316
+ )
317
+ )
318
+ if any(units_by_granularity.values()):
319
+ pages.append(
320
+ _GranularPage(
321
+ page_number=page.page_number,
322
+ lines=units_by_granularity["line"],
323
+ words=units_by_granularity["word"],
324
+ cells=units_by_granularity["cell"],
325
+ )
326
+ )
327
+ return pages
328
+
329
+
287
330
  def _build_llamaparse_granular_pages_from_payload(grounded_pages: Any) -> list[_GranularPage]:
288
331
  if not isinstance(grounded_pages, list):
289
332
  return []
@@ -45,6 +45,7 @@ def normalize_number_string(s: str) -> float | None:
45
45
 
46
46
  Handles:
47
47
  - Currency symbols: $, €, £, ¥
48
+ - Accounting negatives: (4), $(4), ($4), and trailing minus
48
49
  - Thousands separators: commas
49
50
  - Suffixes: k, K, m, M, million, billion, b, B, etc.
50
51
  - Percentage signs
@@ -61,15 +62,19 @@ def normalize_number_string(s: str) -> float | None:
61
62
  if not s:
62
63
  return None
63
64
 
64
- # Remove whitespace and normalize
65
- s = s.strip()
65
+ # Remove whitespace / approximate prefixes and normalize sign glyphs.
66
+ s = re.sub(r"^[~≈]\s*", "", s.strip().replace("−", "-"))
66
67
 
67
- # Remove currency symbols
68
- s = re.sub(r"^[$€£¥]\s*", "", s)
69
- s = re.sub(r"\s*[$€£¥]$", "", s)
70
-
71
- # Remove approximate prefixes
72
- s = re.sub(r"^[~≈]\s*", "", s)
68
+ # Accounting reports commonly print negatives with parentheses, sometimes with
69
+ # the currency symbol outside them ("$(4)") and sometimes inside ("($4)").
70
+ negative = False
71
+ s = re.sub(r"[$€£¥]", "", s).strip()
72
+ if len(s) >= 2 and s.startswith("(") and s.endswith(")"):
73
+ negative = True
74
+ s = s[1:-1].strip()
75
+ if s.endswith("-"):
76
+ negative = not negative
77
+ s = s[:-1].strip()
73
78
 
74
79
  # Remove percentage sign (but remember the value)
75
80
  s = s.rstrip("%")
@@ -85,7 +90,7 @@ def normalize_number_string(s: str) -> float | None:
85
90
  multiplier = 1.0
86
91
  suffix_patterns = [
87
92
  (r"(?i)\s*(trillion|trill|trn)$", 1e12),
88
- (r"(?i)\s*(billion|bill|bln)$", 1e9),
93
+ (r"(?i)\s*(billion|bill|bln|bn)$", 1e9),
89
94
  (r"(?i)\s*(million|mill|mln)$", 1e6),
90
95
  (r"(?i)\s*t$", 1e12),
91
96
  (r"(?i)\s*g$", 1e9), # G = giga = billion
@@ -102,7 +107,8 @@ def normalize_number_string(s: str) -> float | None:
102
107
 
103
108
  # Try to parse as float
104
109
  try:
105
- return float(s) * multiplier
110
+ value = float(s) * multiplier
111
+ return -value if negative else value
106
112
  except ValueError:
107
113
  return None
108
114
 
@@ -120,7 +126,7 @@ def _normalize_number_candidates(s: str) -> list[float]:
120
126
  if val is not None:
121
127
  candidates.append(val)
122
128
  # If s contains a comma, also try the decimal-separator interpretation.
123
- if "," in s:
129
+ if "," in s and not re.search(r",\s", s):
124
130
  val2 = normalize_number_string(s.replace(",", "."))
125
131
  if val2 is not None and val2 not in candidates:
126
132
  candidates.append(val2)
@@ -264,11 +270,28 @@ class ChartDataPointRule(ParseTestRule):
264
270
  # Try exact fuzzy match first
265
271
  threshold = max(0.5, 1.0 - (self.max_diffs / max(len(value), 1)))
266
272
  similarity = fuzz.ratio(value, cell_text) / 100.0
273
+ numeric_rule = self.normalize_numbers and bool(extract_numeric_parts(value))
267
274
 
268
- if similarity >= threshold:
275
+ # Fuzzy text distance is not meaningful for numeric rules:
276
+ # ``249`` must not match the compound cell ``249, 188``.
277
+ if not numeric_rule and similarity >= threshold:
269
278
  matches.append((row_idx, col_idx))
270
279
  elif self.normalize_numbers and numbers_match(value, cell_text, self.relative_tolerance):
271
280
  matches.append((row_idx, col_idx))
281
+ elif self.normalize_numbers:
282
+ # Parsers often retain the axis unit in a numeric cell
283
+ # (for example ``68.7 days``) even when the chart rule
284
+ # stores only the numeric datum. Accept that form only
285
+ # when the cell contains one numeric token; a cell such as
286
+ # ``249, 188`` remains ambiguous and must not satisfy
287
+ # either value independently.
288
+ numeric_parts = extract_numeric_parts(cell_text)
289
+ if len(numeric_parts) == 1 and numbers_match(
290
+ value,
291
+ numeric_parts[0],
292
+ self.relative_tolerance,
293
+ ):
294
+ matches.append((row_idx, col_idx))
272
295
 
273
296
  # Fallback: try composite value decomposition for values like "25 (13.0%)"
274
297
  # where the number and percentage are in adjacent cells.
@@ -499,8 +522,58 @@ class ChartDataPointRule(ParseTestRule):
499
522
  if (header_row, value_col) not in table_data.header_cells:
500
523
  add(table_array[header_row, value_col])
501
524
 
525
+ # A chart data table may repeat a column header after a body section
526
+ # label, for example ``Urban`` followed by ``[blank], Total, Rural``.
527
+ # Some parsers preserve both rows as ``td`` cells. Treat them as local
528
+ # scope only when the complete pair occurs before this candidate. A
529
+ # lone body row or a lone header-like row is never allowed to leak.
530
+ body_section_scope = self._candidate_body_section_scope(
531
+ table_array,
532
+ value_row,
533
+ value_col,
534
+ table_data,
535
+ )
536
+ for item in body_section_scope:
537
+ add(item)
538
+
502
539
  return scope
503
540
 
541
+ def _candidate_body_section_scope( # type: ignore[no-untyped-def]
542
+ self,
543
+ table_array,
544
+ value_row: int,
545
+ value_col: int,
546
+ table_data: TableData,
547
+ ) -> list[str]:
548
+ """Return a paired body section label and repeated column header."""
549
+ if value_row not in table_data.tbody_rows:
550
+ return []
551
+
552
+ _, cols = table_array.shape
553
+ repeated_header: str | None = None
554
+
555
+ for row_idx in range(value_row - 1, -1, -1):
556
+ if row_idx not in table_data.tbody_rows:
557
+ break
558
+
559
+ cells = [normalize_text(str(table_array[row_idx, col_idx])) for col_idx in range(cols)]
560
+ nonempty = [cell for cell in cells if cell]
561
+ if not nonempty:
562
+ continue
563
+
564
+ all_text = all(not extract_numeric_parts(cell) for cell in nonempty)
565
+ if repeated_header is None:
566
+ if all_text and not cells[0] and value_col < cols and cells[value_col]:
567
+ repeated_header = cells[value_col]
568
+ continue
569
+
570
+ # Colspan expansion may repeat the section label in every cell,
571
+ # so compare unique non-empty text rather than physical cells.
572
+ if all_text and len(set(nonempty)) == 1:
573
+ return [nonempty[0], repeated_header]
574
+
575
+ return []
576
+
504
577
  def _labels_match_candidate_scope( # type: ignore[no-untyped-def]
505
578
  self,
506
579
  table_array,
@@ -5,6 +5,7 @@ import pytest
5
5
  from parse_bench.evaluation.metrics.parse.rules_chart import (
6
6
  ChartDataPointRule,
7
7
  extract_numeric_parts,
8
+ numbers_match,
8
9
  )
9
10
  from parse_bench.evaluation.metrics.parse.table_parsing import (
10
11
  parse_html_tables,
@@ -37,6 +38,9 @@ class TestExtractNumericParts:
37
38
  def test_thousands_separator(self):
38
39
  assert extract_numeric_parts("1,234 (56.7%)") == ["1,234", "56.7%"]
39
40
 
41
+ def test_billion_abbreviation_matches_full_value(self):
42
+ assert numbers_match("$4.2bn", "4,200,000,000", tolerance=0)
43
+
40
44
 
41
45
  # ---------------------------------------------------------------------------
42
46
  # parse_html_tables – colspan/rowspan grid alignment
@@ -810,6 +814,76 @@ class TestChartDataPointRuleCandidateScope:
810
814
  assert rule.run(within)[0]
811
815
  assert not rule.run(outside)[0]
812
816
 
817
+ def test_single_numeric_token_with_axis_unit_matches(self) -> None:
818
+ table = """\
819
+ | Category | Actual |
820
+ | --- | --- |
821
+ | Series A | 68.7 days |
822
+ """
823
+
824
+ passed, message, score = _chart_rule(
825
+ "68.7",
826
+ ["Series A", "Actual"],
827
+ normalize_numbers=True,
828
+ ).run(table)
829
+
830
+ assert passed, message
831
+ assert score == 1.0
832
+
833
+ def test_multiple_numeric_tokens_in_one_cell_stay_ambiguous(self) -> None:
834
+ table = """\
835
+ | Country | Panel A |
836
+ | --- | --- |
837
+ | Finland | 249, 188 |
838
+ """
839
+
840
+ passed, message, score = _chart_rule(
841
+ "249",
842
+ ["Finland", "Panel A"],
843
+ normalize_numbers=True,
844
+ ).run(table)
845
+
846
+ assert not passed, message
847
+ assert score == 0.0
848
+
849
+ def test_paired_body_section_and_repeated_header_supply_local_scope(self) -> None:
850
+ table = """\
851
+ <table>
852
+ <thead><tr><th></th><th>Total</th><th>Rural</th></tr></thead>
853
+ <tbody>
854
+ <tr><td>FY2016</td><td>926</td><td>637</td></tr>
855
+ <tr><td>Urban</td><td></td><td></td></tr>
856
+ <tr><td></td><td>Total</td><td>Rural</td></tr>
857
+ <tr><td>FY2016</td><td>960</td><td>715</td></tr>
858
+ <tr><td>Rural</td><td></td><td></td></tr>
859
+ <tr><td></td><td>Total</td><td>Rural</td></tr>
860
+ <tr><td>FY2016</td><td>1,042</td><td>774</td></tr>
861
+ </tbody>
862
+ </table>
863
+ """
864
+
865
+ urban_passed, urban_message, _ = _chart_rule("960", ["Urban", "FY2016", "Total"]).run(table)
866
+ rural_passed, rural_message, _ = _chart_rule("774", ["Rural", "FY2016", "Rural"]).run(table)
867
+ stale_passed, _, stale_score = _chart_rule("774", ["Urban", "FY2016", "Rural"]).run(table)
868
+
869
+ assert urban_passed, urban_message
870
+ assert rural_passed, rural_message
871
+ assert not stale_passed
872
+ assert stale_score == 0.0
873
+
874
+ def test_body_section_without_repeated_header_does_not_leak(self) -> None:
875
+ table = """\
876
+ <table><tbody>
877
+ <tr><td>Urban</td><td></td></tr>
878
+ <tr><td>FY2016</td><td>960</td></tr>
879
+ </tbody></table>
880
+ """
881
+
882
+ passed, message, score = _chart_rule("960", ["Urban", "FY2016"]).run(table)
883
+
884
+ assert not passed, message
885
+ assert score == 0.0
886
+
813
887
  def test_later_correct_duplicate_value_is_selected(self) -> None:
814
888
  table = """\
815
889
  | Country | Year | Value |
File without changes
File without changes
File without changes
File without changes