openxml-audit 0.2.0__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 (500) hide show
  1. openxml_audit-0.2.0/.github/FUNDING.yml +1 -0
  2. openxml_audit-0.2.0/.github/ISSUE_TEMPLATE/bug_report.yml +39 -0
  3. openxml_audit-0.2.0/.github/ISSUE_TEMPLATE/feature_request.yml +16 -0
  4. openxml_audit-0.2.0/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  5. openxml_audit-0.2.0/.github/workflows/calibrate-parity.yml +112 -0
  6. openxml_audit-0.2.0/.github/workflows/odf-reference-calibration.yml +151 -0
  7. openxml_audit-0.2.0/.github/workflows/pages.yml +90 -0
  8. openxml_audit-0.2.0/.github/workflows/parity-gate.yml +147 -0
  9. openxml_audit-0.2.0/.github/workflows/release.yml +90 -0
  10. openxml_audit-0.2.0/.github/workflows/sdk-update.yml +79 -0
  11. openxml_audit-0.2.0/.github/workflows/validate-inputs.yml +153 -0
  12. openxml_audit-0.2.0/.gitignore +20 -0
  13. openxml_audit-0.2.0/CLAUDE.md +72 -0
  14. openxml_audit-0.2.0/CONTRIBUTING.md +46 -0
  15. openxml_audit-0.2.0/LICENSE +21 -0
  16. openxml_audit-0.2.0/PKG-INFO +435 -0
  17. openxml_audit-0.2.0/Presentation1.pptx +0 -0
  18. openxml_audit-0.2.0/README.md +380 -0
  19. openxml_audit-0.2.0/SPEC.md +278 -0
  20. openxml_audit-0.2.0/TASKS.md +229 -0
  21. openxml_audit-0.2.0/data/corpus/parity_baseline/v3.4.1/parity_snapshot.json +115 -0
  22. openxml_audit-0.2.0/data/corpus/parity_baseline/v3.4.1/perf_budget.json +9 -0
  23. openxml_audit-0.2.0/data/corpus/parity_baseline/v3.4.1/waivers.json +3 -0
  24. openxml_audit-0.2.0/data/corpus/sdk_seed/manifest.json +9865 -0
  25. openxml_audit-0.2.0/data/odf/reference_baseline/2026-03-09/drift_policy.json +14 -0
  26. openxml_audit-0.2.0/data/odf/reference_baseline/2026-03-09/drift_report.json +135 -0
  27. openxml_audit-0.2.0/data/odf/reference_baseline/2026-03-09/drift_summary.md +21 -0
  28. openxml_audit-0.2.0/data/odf/reference_baseline/2026-03-09/mismatch_report.json +2319 -0
  29. openxml_audit-0.2.0/data/odf/reference_baseline/2026-03-09/mismatch_summary.md +95 -0
  30. openxml_audit-0.2.0/data/odf/reference_baseline/2026-03-09/mismatch_triage.md +95 -0
  31. openxml_audit-0.2.0/data/odf/reference_baseline/2026-03-09/reference_runs.json +4858 -0
  32. openxml_audit-0.2.0/data/odf/reference_baseline/2026-03-09/waivers.json +3 -0
  33. openxml_audit-0.2.0/data/odf/reference_corpus/manifest.json +193 -0
  34. openxml_audit-0.2.0/data/openxml/.sdk_version +1 -0
  35. openxml_audit-0.2.0/data/openxml/namespaces.json +795 -0
  36. openxml_audit-0.2.0/data/openxml/schemas/schemas-microsoft-com_office_excel.json +1525 -0
  37. openxml_audit-0.2.0/data/openxml/schemas/schemas-microsoft-com_office_office.json +2234 -0
  38. openxml_audit-0.2.0/data/openxml/schemas/schemas-microsoft-com_office_powerpoint.json +27 -0
  39. openxml_audit-0.2.0/data/openxml/schemas/schemas-microsoft-com_office_word.json +365 -0
  40. openxml_audit-0.2.0/data/openxml/schemas/schemas-microsoft-com_vml.json +7004 -0
  41. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_ink_2010_main.json +617 -0
  42. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_2006_01_customui.json +21261 -0
  43. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_2006_activeX.json +196 -0
  44. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_2006_coverPageProps.json +108 -0
  45. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_2006_customDocumentInformationPanel.json +135 -0
  46. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_2006_metadata_contentType.json +111 -0
  47. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_2006_metadata_customXsn.json +79 -0
  48. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_2006_metadata_longProperties.json +42 -0
  49. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_2006_metadata_properties_metaAttributes.json +153 -0
  50. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_2009_07_customui.json +35279 -0
  51. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_2019_extlst.json +41 -0
  52. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_2020_mipLabelMetadata.json +210 -0
  53. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2007_8_2_chart.json +474 -0
  54. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2008_diagram.json +1125 -0
  55. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2010_chartDrawing.json +406 -0
  56. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2010_compatibility.json +38 -0
  57. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2010_diagram.json +118 -0
  58. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2010_main.json +3279 -0
  59. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2010_picture.json +82 -0
  60. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2010_slicer.json +80 -0
  61. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2012_chart.json +2745 -0
  62. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2012_chartStyle.json +7010 -0
  63. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2012_main.json +337 -0
  64. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2012_timeslicer.json +80 -0
  65. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2013_main_command.json +5029 -0
  66. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2014_chart.json +1058 -0
  67. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2014_chart_ac.json +52 -0
  68. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2014_chartex.json +6251 -0
  69. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2014_main.json +171 -0
  70. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2016_11_diagram.json +171 -0
  71. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2016_11_main.json +26 -0
  72. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2016_12_diagram.json +360 -0
  73. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2016_SVG_main.json +27 -0
  74. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2016_ink.json +75 -0
  75. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2017_03_chart.json +60 -0
  76. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2017_decorative.json +21 -0
  77. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2017_model3d.json +1924 -0
  78. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2018_animation.json +142 -0
  79. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2018_animation_model3d.json +223 -0
  80. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2018_hyperlinkcolor.json +57 -0
  81. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2018_sketchyshapes.json +246 -0
  82. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2020_classificationShape.json +59 -0
  83. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2021_livefeed.json +281 -0
  84. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2021_oembed.json +90 -0
  85. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2021_scriptlink.json +74 -0
  86. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_drawing_2022_imageformula.json +21 -0
  87. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_excel_2006_main.json +544 -0
  88. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_excel_2010_spreadsheetDrawing.json +406 -0
  89. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2010_main.json +2096 -0
  90. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2012_main.json +447 -0
  91. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2012_roamingSettings.json +54 -0
  92. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2013_main_command.json +481 -0
  93. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2015_main.json +21 -0
  94. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2017_10_main.json +26 -0
  95. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2017_3_main.json +153 -0
  96. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2018_4_main.json +59 -0
  97. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2018_8_main.json +880 -0
  98. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2019_12_main.json +631 -0
  99. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2019_9_main_command.json +141 -0
  100. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2020_02_main.json +148 -0
  101. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2021_06_main.json +631 -0
  102. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2022_03_main.json +167 -0
  103. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2022_08_main.json +556 -0
  104. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_powerpoint_2023_02_main.json +90 -0
  105. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2009_9_main.json +5805 -0
  106. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2010_11_ac.json +27 -0
  107. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2010_11_main.json +3306 -0
  108. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2011_1_ac.json +13 -0
  109. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2014_11_main.json +191 -0
  110. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2014_revision.json +5366 -0
  111. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2015_02_main.json +3 -0
  112. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2015_revision2.json +3 -0
  113. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2016_01_main.json +3 -0
  114. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2016_pivotdefaultlayout.json +33 -0
  115. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2016_revision10.json +3 -0
  116. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2016_revision3.json +3 -0
  117. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2016_revision5.json +3 -0
  118. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2016_revision6.json +3 -0
  119. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2016_revision9.json +3 -0
  120. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2017_dynamicarray.json +85 -0
  121. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2017_revision16.json +3 -0
  122. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2017_richdata.json +371 -0
  123. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2017_richdata2.json +1602 -0
  124. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2018_08_main.json +3 -0
  125. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2018_calcfeatures.json +52 -0
  126. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2018_threadedcomments.json +467 -0
  127. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2019_extlinksprops.json +21 -0
  128. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2019_namedsheetviews.json +884 -0
  129. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2020_pivotNov2020.json +73 -0
  130. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2020_richdatawebimage.json +178 -0
  131. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2020_richvaluerefresh.json +64 -0
  132. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2020_threadedcomments2.json +121 -0
  133. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2021_extlinks2021.json +100 -0
  134. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2022_featurepropertybag.json +1118 -0
  135. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2022_pivotRichData.json +54 -0
  136. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2022_pivotVersionInfo.json +100 -0
  137. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2022_richvaluerel.json +100 -0
  138. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2023_dataSourceVersioning.json +76 -0
  139. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2023_externalCodeService.json +27 -0
  140. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2023_msForms.json +159 -0
  141. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2023_pivot2023Calculation.json +235 -0
  142. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2024_pivotAutoRefresh.json +20 -0
  143. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2024_pivotDynamicArrays.json +26 -0
  144. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2024_workbookCompatibilityVersion.json +27 -0
  145. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2025_externalCodeService2.json +27 -0
  146. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_spreadsheetml_2025_pivotDataSource.json +40 -0
  147. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_tasks_2019_documenttasks.json +667 -0
  148. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_thememl_2012_main.json +295 -0
  149. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_webextensions_taskpanes_2010_11.json +176 -0
  150. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_webextensions_webextension_2010_11.json +567 -0
  151. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2006_wordml.json +1032 -0
  152. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2010_wordml.json +6319 -0
  153. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2010_wordprocessingCanvas.json +339 -0
  154. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2010_wordprocessingDrawing.json +255 -0
  155. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2010_wordprocessingGroup.json +732 -0
  156. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2010_wordprocessingShape.json +1033 -0
  157. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2012_wordml.json +634 -0
  158. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2012_wordprocessingDrawing.json +36 -0
  159. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2015_wordml_symex.json +60 -0
  160. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2016_wordml_cid.json +102 -0
  161. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2018_wordml.json +50 -0
  162. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2018_wordml_cex.json +161 -0
  163. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2020_oembed.json +43 -0
  164. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2020_wordml_sdtdatahash.json +3 -0
  165. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2023_wordml_word16du.json +3 -0
  166. openxml_audit-0.2.0/data/openxml/schemas/schemas_microsoft_com_office_word_2024_wordml_sdtformatlock.json +3 -0
  167. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_drawingml_2006_chart.json +15361 -0
  168. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_drawingml_2006_chartDrawing.json +1753 -0
  169. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_drawingml_2006_compatibility.json +36 -0
  170. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_drawingml_2006_diagram.json +7608 -0
  171. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_drawingml_2006_lockedCanvas.json +97 -0
  172. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_drawingml_2006_main.json +30390 -0
  173. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_drawingml_2006_picture.json +517 -0
  174. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_drawingml_2006_spreadsheetDrawing.json +2201 -0
  175. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_drawingml_2006_wordprocessingDrawing.json +1525 -0
  176. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_officeDocument_2006_bibliography.json +2708 -0
  177. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_officeDocument_2006_characteristics.json +122 -0
  178. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_officeDocument_2006_custom-properties.json +361 -0
  179. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_officeDocument_2006_customXml.json +104 -0
  180. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_officeDocument_2006_docPropsVTypes.json +1316 -0
  181. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_officeDocument_2006_extended-properties.json +775 -0
  182. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_officeDocument_2006_math.json +11040 -0
  183. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_officeDocument_2006_relationships.json +3 -0
  184. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_presentationml_2006_main.json +15692 -0
  185. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_schemaLibrary_2006_main.json +54 -0
  186. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_spreadsheetml_2006_main.json +29150 -0
  187. openxml_audit-0.2.0/data/openxml/schemas/schemas_openxmlformats_org_wordprocessingml_2006_main.json +56249 -0
  188. openxml_audit-0.2.0/data/openxml/schemas/www_w3_org_2003_04_emma.json +2065 -0
  189. openxml_audit-0.2.0/data/openxml/schemas/www_w3_org_2003_InkML.json +2894 -0
  190. openxml_audit-0.2.0/data/openxml/schemas/www_w3_org_XML_1998_namespace.json +19 -0
  191. openxml_audit-0.2.0/data/openxml/schematrons.json +4864 -0
  192. openxml_audit-0.2.0/docs/odf_security_policy.md +74 -0
  193. openxml_audit-0.2.0/docs/odf_validation_contract.md +238 -0
  194. openxml_audit-0.2.0/docs/parity_contract.md +153 -0
  195. openxml_audit-0.2.0/inputs/README.md +7 -0
  196. openxml_audit-0.2.0/pyproject.toml +70 -0
  197. openxml_audit-0.2.0/scripts/benchmark_validation.py +92 -0
  198. openxml_audit-0.2.0/scripts/check_sdk_update.py +166 -0
  199. openxml_audit-0.2.0/scripts/compare_with_sdk.py +226 -0
  200. openxml_audit-0.2.0/scripts/compare_with_sdk_batch.py +332 -0
  201. openxml_audit-0.2.0/scripts/corpus/check_perf_budget.py +209 -0
  202. openxml_audit-0.2.0/scripts/corpus/compare_to_baseline.py +558 -0
  203. openxml_audit-0.2.0/scripts/corpus/extract_sdk_expectations.py +971 -0
  204. openxml_audit-0.2.0/scripts/corpus/import_sdk_assets.py +495 -0
  205. openxml_audit-0.2.0/scripts/corpus/run_parity_snapshot.py +413 -0
  206. openxml_audit-0.2.0/scripts/odf/benchmark_validation.py +115 -0
  207. openxml_audit-0.2.0/scripts/odf/bootstrap_reference_validators.py +488 -0
  208. openxml_audit-0.2.0/scripts/odf/build_mismatch_triage.py +237 -0
  209. openxml_audit-0.2.0/scripts/odf/check_reference_drift.py +783 -0
  210. openxml_audit-0.2.0/scripts/odf/compare_reference_results.py +489 -0
  211. openxml_audit-0.2.0/scripts/odf/run_reference_validators.py +702 -0
  212. openxml_audit-0.2.0/scripts/sdk_check/Program.cs +46 -0
  213. openxml_audit-0.2.0/scripts/sdk_check/sdk_check.csproj +11 -0
  214. openxml_audit-0.2.0/scripts/sdk_compare/OpenXmlSdkValidator.csproj +11 -0
  215. openxml_audit-0.2.0/scripts/sdk_compare/Program.cs +97 -0
  216. openxml_audit-0.2.0/scripts/sync_openxml_data.py +187 -0
  217. openxml_audit-0.2.0/scripts/update_from_sdk.py +193 -0
  218. openxml_audit-0.2.0/specs/001-exhaustive-schematron-validation.md +303 -0
  219. openxml_audit-0.2.0/specs/001-exhaustive-schematron-validation.tasks.md +214 -0
  220. openxml_audit-0.2.0/specs/002-sdk-parity-gap-closure.md +189 -0
  221. openxml_audit-0.2.0/specs/002-sdk-parity-gap-closure.tasks.md +54 -0
  222. openxml_audit-0.2.0/specs/003-odf-validation-foundation.md +182 -0
  223. openxml_audit-0.2.0/specs/003-odf-validation-foundation.tasks.md +59 -0
  224. openxml_audit-0.2.0/specs/004-odf-oasis-conformance-gap-closure.md +199 -0
  225. openxml_audit-0.2.0/specs/004-odf-oasis-conformance-gap-closure.tasks.md +66 -0
  226. openxml_audit-0.2.0/src/openxml_audit/__init__.py +87 -0
  227. openxml_audit-0.2.0/src/openxml_audit/binary.py +266 -0
  228. openxml_audit-0.2.0/src/openxml_audit/cli.py +478 -0
  229. openxml_audit-0.2.0/src/openxml_audit/codegen/__init__.py +45 -0
  230. openxml_audit-0.2.0/src/openxml_audit/codegen/constraint_bridge.py +487 -0
  231. openxml_audit-0.2.0/src/openxml_audit/codegen/schema_loader.py +391 -0
  232. openxml_audit-0.2.0/src/openxml_audit/codegen/schematron_bridge.py +432 -0
  233. openxml_audit-0.2.0/src/openxml_audit/codegen/schematron_loader.py +559 -0
  234. openxml_audit-0.2.0/src/openxml_audit/context.py +212 -0
  235. openxml_audit-0.2.0/src/openxml_audit/core/__init__.py +25 -0
  236. openxml_audit-0.2.0/src/openxml_audit/core/context.py +9 -0
  237. openxml_audit-0.2.0/src/openxml_audit/core/errors.py +19 -0
  238. openxml_audit-0.2.0/src/openxml_audit/core/package.py +141 -0
  239. openxml_audit-0.2.0/src/openxml_audit/errors.py +83 -0
  240. openxml_audit-0.2.0/src/openxml_audit/excel/__init__.py +7 -0
  241. openxml_audit-0.2.0/src/openxml_audit/excel/workbook.py +135 -0
  242. openxml_audit-0.2.0/src/openxml_audit/helpers.py +304 -0
  243. openxml_audit-0.2.0/src/openxml_audit/namespaces.py +188 -0
  244. openxml_audit-0.2.0/src/openxml_audit/odf/__init__.py +20 -0
  245. openxml_audit-0.2.0/src/openxml_audit/odf/_helpers.py +28 -0
  246. openxml_audit-0.2.0/src/openxml_audit/odf/package.py +318 -0
  247. openxml_audit-0.2.0/src/openxml_audit/odf/schema_core.py +259 -0
  248. openxml_audit-0.2.0/src/openxml_audit/odf/security.py +408 -0
  249. openxml_audit-0.2.0/src/openxml_audit/odf/semantic.py +481 -0
  250. openxml_audit-0.2.0/src/openxml_audit/odf/validator.py +415 -0
  251. openxml_audit-0.2.0/src/openxml_audit/package.py +243 -0
  252. openxml_audit-0.2.0/src/openxml_audit/parity_normalization.py +106 -0
  253. openxml_audit-0.2.0/src/openxml_audit/parts.py +227 -0
  254. openxml_audit-0.2.0/src/openxml_audit/pptx/__init__.py +35 -0
  255. openxml_audit-0.2.0/src/openxml_audit/pptx/masters.py +358 -0
  256. openxml_audit-0.2.0/src/openxml_audit/pptx/presentation.py +301 -0
  257. openxml_audit-0.2.0/src/openxml_audit/pptx/slides.py +280 -0
  258. openxml_audit-0.2.0/src/openxml_audit/pptx/themes.py +303 -0
  259. openxml_audit-0.2.0/src/openxml_audit/relationships.py +170 -0
  260. openxml_audit-0.2.0/src/openxml_audit/schema/__init__.py +71 -0
  261. openxml_audit-0.2.0/src/openxml_audit/schema/constraints.py +345 -0
  262. openxml_audit-0.2.0/src/openxml_audit/schema/particle.py +691 -0
  263. openxml_audit-0.2.0/src/openxml_audit/schema/types.py +486 -0
  264. openxml_audit-0.2.0/src/openxml_audit/schema/validator.py +408 -0
  265. openxml_audit-0.2.0/src/openxml_audit/semantic/__init__.py +58 -0
  266. openxml_audit-0.2.0/src/openxml_audit/semantic/attributes.py +401 -0
  267. openxml_audit-0.2.0/src/openxml_audit/semantic/constraints/__init__.py +29 -0
  268. openxml_audit-0.2.0/src/openxml_audit/semantic/constraints/compound.py +112 -0
  269. openxml_audit-0.2.0/src/openxml_audit/semantic/constraints/cross_part.py +287 -0
  270. openxml_audit-0.2.0/src/openxml_audit/semantic/constraints/equality.py +198 -0
  271. openxml_audit-0.2.0/src/openxml_audit/semantic/references.py +283 -0
  272. openxml_audit-0.2.0/src/openxml_audit/semantic/relationships.py +208 -0
  273. openxml_audit-0.2.0/src/openxml_audit/semantic/validator.py +271 -0
  274. openxml_audit-0.2.0/src/openxml_audit/validator.py +1577 -0
  275. openxml_audit-0.2.0/src/openxml_audit/word/__init__.py +7 -0
  276. openxml_audit-0.2.0/src/openxml_audit/word/document.py +88 -0
  277. openxml_audit-0.2.0/tests/__init__.py +1 -0
  278. openxml_audit-0.2.0/tests/conftest.py +548 -0
  279. openxml_audit-0.2.0/tests/fixture_loader.py +17 -0
  280. openxml_audit-0.2.0/tests/fixtures/binary/invalid.emf +1 -0
  281. openxml_audit-0.2.0/tests/fixtures/binary/invalid.jpg +1 -0
  282. openxml_audit-0.2.0/tests/fixtures/binary/invalid.ole +1 -0
  283. openxml_audit-0.2.0/tests/fixtures/binary/invalid.png +1 -0
  284. openxml_audit-0.2.0/tests/fixtures/binary/invalid.ttf +0 -0
  285. openxml_audit-0.2.0/tests/fixtures/binary/invalid.wmf +1 -0
  286. openxml_audit-0.2.0/tests/fixtures/binary/valid.emf +0 -0
  287. openxml_audit-0.2.0/tests/fixtures/binary/valid.jpg +0 -0
  288. openxml_audit-0.2.0/tests/fixtures/binary/valid.odttf +0 -0
  289. openxml_audit-0.2.0/tests/fixtures/binary/valid.ole +0 -0
  290. openxml_audit-0.2.0/tests/fixtures/binary/valid.png +0 -0
  291. openxml_audit-0.2.0/tests/fixtures/binary/valid.ttf +0 -0
  292. openxml_audit-0.2.0/tests/fixtures/binary/valid.wmf +0 -0
  293. openxml_audit-0.2.0/tests/fixtures/content_types/defaults.xml +5 -0
  294. openxml_audit-0.2.0/tests/fixtures/content_types/empty.xml +3 -0
  295. openxml_audit-0.2.0/tests/fixtures/content_types/override.xml +5 -0
  296. openxml_audit-0.2.0/tests/fixtures/cross_part/current.xml +2 -0
  297. openxml_audit-0.2.0/tests/fixtures/cross_part/current_with_items.xml +5 -0
  298. openxml_audit-0.2.0/tests/fixtures/cross_part/target.xml +5 -0
  299. openxml_audit-0.2.0/tests/fixtures/docx/minimal/[Content_Types].xml +6 -0
  300. openxml_audit-0.2.0/tests/fixtures/docx/minimal/_rels/.rels +4 -0
  301. openxml_audit-0.2.0/tests/fixtures/docx/minimal/word/document.xml +11 -0
  302. openxml_audit-0.2.0/tests/fixtures/docx/missing_body/[Content_Types].xml +6 -0
  303. openxml_audit-0.2.0/tests/fixtures/docx/missing_body/_rels/.rels +4 -0
  304. openxml_audit-0.2.0/tests/fixtures/docx/missing_body/word/document.xml +3 -0
  305. openxml_audit-0.2.0/tests/fixtures/docx/missing_styles_with_effects/[Content_Types].xml +12 -0
  306. openxml_audit-0.2.0/tests/fixtures/docx/missing_styles_with_effects/_rels/.rels +4 -0
  307. openxml_audit-0.2.0/tests/fixtures/docx/missing_styles_with_effects/word/_rels/document.xml.rels +9 -0
  308. openxml_audit-0.2.0/tests/fixtures/docx/missing_styles_with_effects/word/document.xml +4 -0
  309. openxml_audit-0.2.0/tests/fixtures/docx/missing_styles_with_effects/word/fontTable.xml +2 -0
  310. openxml_audit-0.2.0/tests/fixtures/docx/missing_styles_with_effects/word/numbering.xml +2 -0
  311. openxml_audit-0.2.0/tests/fixtures/docx/missing_styles_with_effects/word/settings.xml +2 -0
  312. openxml_audit-0.2.0/tests/fixtures/docx/missing_styles_with_effects/word/styles.xml +2 -0
  313. openxml_audit-0.2.0/tests/fixtures/docx/missing_styles_with_effects/word/theme/theme1.xml +2 -0
  314. openxml_audit-0.2.0/tests/fixtures/docx/missing_styles_with_effects/word/webSettings.xml +2 -0
  315. openxml_audit-0.2.0/tests/fixtures/integration/invalid_xml/content_types.xml +6 -0
  316. openxml_audit-0.2.0/tests/fixtures/integration/invalid_xml/invalid_presentation.xml +1 -0
  317. openxml_audit-0.2.0/tests/fixtures/integration/invalid_xml/rels.xml +4 -0
  318. openxml_audit-0.2.0/tests/fixtures/integration/missing_package_rels/content_types.xml +3 -0
  319. openxml_audit-0.2.0/tests/fixtures/odf/invalid/aux_declared_missing_styles/META-INF/manifest.xml +6 -0
  320. openxml_audit-0.2.0/tests/fixtures/odf/invalid/aux_declared_missing_styles/content.xml +11 -0
  321. openxml_audit-0.2.0/tests/fixtures/odf/invalid/aux_declared_missing_styles/mimetype +1 -0
  322. openxml_audit-0.2.0/tests/fixtures/odf/invalid/aux_invalid_styles_xml/META-INF/manifest.xml +6 -0
  323. openxml_audit-0.2.0/tests/fixtures/odf/invalid/aux_invalid_styles_xml/content.xml +11 -0
  324. openxml_audit-0.2.0/tests/fixtures/odf/invalid/aux_invalid_styles_xml/mimetype +1 -0
  325. openxml_audit-0.2.0/tests/fixtures/odf/invalid/aux_invalid_styles_xml/styles.xml +6 -0
  326. openxml_audit-0.2.0/tests/fixtures/odf/invalid/broken_content_xml/META-INF/manifest.xml +5 -0
  327. openxml_audit-0.2.0/tests/fixtures/odf/invalid/broken_content_xml/content.xml +8 -0
  328. openxml_audit-0.2.0/tests/fixtures/odf/invalid/broken_content_xml/mimetype +1 -0
  329. openxml_audit-0.2.0/tests/fixtures/odf/invalid/content_body_mismatch/META-INF/manifest.xml +5 -0
  330. openxml_audit-0.2.0/tests/fixtures/odf/invalid/content_body_mismatch/content.xml +8 -0
  331. openxml_audit-0.2.0/tests/fixtures/odf/invalid/content_body_mismatch/mimetype +1 -0
  332. openxml_audit-0.2.0/tests/fixtures/odf/invalid/content_root_mismatch/META-INF/manifest.xml +5 -0
  333. openxml_audit-0.2.0/tests/fixtures/odf/invalid/content_root_mismatch/content.xml +6 -0
  334. openxml_audit-0.2.0/tests/fixtures/odf/invalid/content_root_mismatch/mimetype +1 -0
  335. openxml_audit-0.2.0/tests/fixtures/odf/invalid/duplicate_manifest_entry/META-INF/manifest.xml +6 -0
  336. openxml_audit-0.2.0/tests/fixtures/odf/invalid/duplicate_manifest_entry/content.xml +2 -0
  337. openxml_audit-0.2.0/tests/fixtures/odf/invalid/duplicate_manifest_entry/mimetype +1 -0
  338. openxml_audit-0.2.0/tests/fixtures/odf/invalid/encrypted_checksum_partial/META-INF/manifest.xml +10 -0
  339. openxml_audit-0.2.0/tests/fixtures/odf/invalid/encrypted_checksum_partial/content.xml +7 -0
  340. openxml_audit-0.2.0/tests/fixtures/odf/invalid/encrypted_checksum_partial/mimetype +1 -0
  341. openxml_audit-0.2.0/tests/fixtures/odf/invalid/encrypted_missing_key_derivation/META-INF/manifest.xml +9 -0
  342. openxml_audit-0.2.0/tests/fixtures/odf/invalid/encrypted_missing_key_derivation/content.xml +7 -0
  343. openxml_audit-0.2.0/tests/fixtures/odf/invalid/encrypted_missing_key_derivation/mimetype +1 -0
  344. openxml_audit-0.2.0/tests/fixtures/odf/invalid/encrypted_root_entry_encrypted/META-INF/manifest.xml +10 -0
  345. openxml_audit-0.2.0/tests/fixtures/odf/invalid/encrypted_root_entry_encrypted/content.xml +7 -0
  346. openxml_audit-0.2.0/tests/fixtures/odf/invalid/encrypted_root_entry_encrypted/mimetype +1 -0
  347. openxml_audit-0.2.0/tests/fixtures/odf/invalid/invalid_mimetype/META-INF/manifest.xml +5 -0
  348. openxml_audit-0.2.0/tests/fixtures/odf/invalid/invalid_mimetype/content.xml +2 -0
  349. openxml_audit-0.2.0/tests/fixtures/odf/invalid/invalid_mimetype/mimetype +1 -0
  350. openxml_audit-0.2.0/tests/fixtures/odf/invalid/malformed_manifest/META-INF/manifest.xml +3 -0
  351. openxml_audit-0.2.0/tests/fixtures/odf/invalid/malformed_manifest/content.xml +2 -0
  352. openxml_audit-0.2.0/tests/fixtures/odf/invalid/malformed_manifest/mimetype +1 -0
  353. openxml_audit-0.2.0/tests/fixtures/odf/invalid/manifest_content_bad_media_type/META-INF/manifest.xml +5 -0
  354. openxml_audit-0.2.0/tests/fixtures/odf/invalid/manifest_content_bad_media_type/content.xml +11 -0
  355. openxml_audit-0.2.0/tests/fixtures/odf/invalid/manifest_content_bad_media_type/mimetype +1 -0
  356. openxml_audit-0.2.0/tests/fixtures/odf/invalid/manifest_missing_part/META-INF/manifest.xml +5 -0
  357. openxml_audit-0.2.0/tests/fixtures/odf/invalid/manifest_missing_part/mimetype +1 -0
  358. openxml_audit-0.2.0/tests/fixtures/odf/invalid/missing_content_xml/META-INF/manifest.xml +4 -0
  359. openxml_audit-0.2.0/tests/fixtures/odf/invalid/missing_content_xml/mimetype +1 -0
  360. openxml_audit-0.2.0/tests/fixtures/odf/invalid/missing_manifest/content.xml +2 -0
  361. openxml_audit-0.2.0/tests/fixtures/odf/invalid/missing_manifest/mimetype +1 -0
  362. openxml_audit-0.2.0/tests/fixtures/odf/invalid/missing_mimetype/META-INF/manifest.xml +5 -0
  363. openxml_audit-0.2.0/tests/fixtures/odf/invalid/missing_mimetype/content.xml +2 -0
  364. openxml_audit-0.2.0/tests/fixtures/odf/invalid/missing_root_entry/META-INF/manifest.xml +4 -0
  365. openxml_audit-0.2.0/tests/fixtures/odf/invalid/missing_root_entry/content.xml +2 -0
  366. openxml_audit-0.2.0/tests/fixtures/odf/invalid/missing_root_entry/mimetype +1 -0
  367. openxml_audit-0.2.0/tests/fixtures/odf/invalid/presentation_duplicate_page_names/META-INF/manifest.xml +5 -0
  368. openxml_audit-0.2.0/tests/fixtures/odf/invalid/presentation_duplicate_page_names/content.xml +12 -0
  369. openxml_audit-0.2.0/tests/fixtures/odf/invalid/presentation_duplicate_page_names/mimetype +1 -0
  370. openxml_audit-0.2.0/tests/fixtures/odf/invalid/presentation_master_page_missing_styles/META-INF/manifest.xml +5 -0
  371. openxml_audit-0.2.0/tests/fixtures/odf/invalid/presentation_master_page_missing_styles/content.xml +11 -0
  372. openxml_audit-0.2.0/tests/fixtures/odf/invalid/presentation_master_page_missing_styles/mimetype +1 -0
  373. openxml_audit-0.2.0/tests/fixtures/odf/invalid/presentation_master_page_unresolved/META-INF/manifest.xml +6 -0
  374. openxml_audit-0.2.0/tests/fixtures/odf/invalid/presentation_master_page_unresolved/content.xml +11 -0
  375. openxml_audit-0.2.0/tests/fixtures/odf/invalid/presentation_master_page_unresolved/mimetype +1 -0
  376. openxml_audit-0.2.0/tests/fixtures/odf/invalid/presentation_master_page_unresolved/styles.xml +9 -0
  377. openxml_audit-0.2.0/tests/fixtures/odf/invalid/root_mimetype_mismatch/META-INF/manifest.xml +5 -0
  378. openxml_audit-0.2.0/tests/fixtures/odf/invalid/root_mimetype_mismatch/content.xml +2 -0
  379. openxml_audit-0.2.0/tests/fixtures/odf/invalid/root_mimetype_mismatch/mimetype +1 -0
  380. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_bad_media_type/META-INF/documentsignatures.xml +10 -0
  381. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_bad_media_type/META-INF/manifest.xml +6 -0
  382. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_bad_media_type/content.xml +7 -0
  383. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_bad_media_type/mimetype +1 -0
  384. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_bad_root/META-INF/documentsignatures.xml +2 -0
  385. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_bad_root/META-INF/manifest.xml +6 -0
  386. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_bad_root/content.xml +7 -0
  387. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_bad_root/mimetype +1 -0
  388. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_manifest_missing_xml/META-INF/manifest.xml +6 -0
  389. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_manifest_missing_xml/content.xml +11 -0
  390. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_manifest_missing_xml/mimetype +1 -0
  391. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_missing_signedinfo/META-INF/documentsignatures.xml +8 -0
  392. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_missing_signedinfo/META-INF/manifest.xml +6 -0
  393. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_missing_signedinfo/content.xml +7 -0
  394. openxml_audit-0.2.0/tests/fixtures/odf/invalid/signature_missing_signedinfo/mimetype +1 -0
  395. openxml_audit-0.2.0/tests/fixtures/odf/invalid/spreadsheet_duplicate_table_names/META-INF/manifest.xml +5 -0
  396. openxml_audit-0.2.0/tests/fixtures/odf/invalid/spreadsheet_duplicate_table_names/content.xml +12 -0
  397. openxml_audit-0.2.0/tests/fixtures/odf/invalid/spreadsheet_duplicate_table_names/mimetype +1 -0
  398. openxml_audit-0.2.0/tests/fixtures/odf/invalid/text_style_reference_missing_styles/META-INF/manifest.xml +5 -0
  399. openxml_audit-0.2.0/tests/fixtures/odf/invalid/text_style_reference_missing_styles/content.xml +11 -0
  400. openxml_audit-0.2.0/tests/fixtures/odf/invalid/text_style_reference_missing_styles/mimetype +1 -0
  401. openxml_audit-0.2.0/tests/fixtures/odf/invalid/unlisted_xml_part/META-INF/manifest.xml +4 -0
  402. openxml_audit-0.2.0/tests/fixtures/odf/invalid/unlisted_xml_part/content.xml +2 -0
  403. openxml_audit-0.2.0/tests/fixtures/odf/invalid/unlisted_xml_part/mimetype +1 -0
  404. openxml_audit-0.2.0/tests/fixtures/odf/valid/encrypted_structural_odt/META-INF/manifest.xml +10 -0
  405. openxml_audit-0.2.0/tests/fixtures/odf/valid/encrypted_structural_odt/content.xml +7 -0
  406. openxml_audit-0.2.0/tests/fixtures/odf/valid/encrypted_structural_odt/mimetype +1 -0
  407. openxml_audit-0.2.0/tests/fixtures/odf/valid/encrypted_stub_odt/META-INF/manifest.xml +7 -0
  408. openxml_audit-0.2.0/tests/fixtures/odf/valid/encrypted_stub_odt/content.xml +11 -0
  409. openxml_audit-0.2.0/tests/fixtures/odf/valid/encrypted_stub_odt/mimetype +1 -0
  410. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odp/META-INF/manifest.xml +5 -0
  411. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odp/content.xml +11 -0
  412. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odp/mimetype +1 -0
  413. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_ods/META-INF/manifest.xml +5 -0
  414. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_ods/content.xml +11 -0
  415. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_ods/mimetype +1 -0
  416. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odt/META-INF/manifest.xml +5 -0
  417. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odt/content.xml +11 -0
  418. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odt/mimetype +1 -0
  419. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odt_v12/META-INF/manifest.xml +5 -0
  420. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odt_v12/content.xml +11 -0
  421. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odt_v12/mimetype +1 -0
  422. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odt_v14/META-INF/manifest.xml +5 -0
  423. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odt_v14/content.xml +11 -0
  424. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odt_v14/mimetype +1 -0
  425. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odt_with_styles/META-INF/manifest.xml +6 -0
  426. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odt_with_styles/content.xml +11 -0
  427. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odt_with_styles/mimetype +1 -0
  428. openxml_audit-0.2.0/tests/fixtures/odf/valid/minimal_odt_with_styles/styles.xml +9 -0
  429. openxml_audit-0.2.0/tests/fixtures/odf/valid/presentation_master_page_resolved/META-INF/manifest.xml +6 -0
  430. openxml_audit-0.2.0/tests/fixtures/odf/valid/presentation_master_page_resolved/content.xml +11 -0
  431. openxml_audit-0.2.0/tests/fixtures/odf/valid/presentation_master_page_resolved/mimetype +1 -0
  432. openxml_audit-0.2.0/tests/fixtures/odf/valid/presentation_master_page_resolved/styles.xml +9 -0
  433. openxml_audit-0.2.0/tests/fixtures/odf/valid/signed_structural_odt/META-INF/documentsignatures.xml +11 -0
  434. openxml_audit-0.2.0/tests/fixtures/odf/valid/signed_structural_odt/META-INF/manifest.xml +6 -0
  435. openxml_audit-0.2.0/tests/fixtures/odf/valid/signed_structural_odt/content.xml +11 -0
  436. openxml_audit-0.2.0/tests/fixtures/odf/valid/signed_structural_odt/mimetype +1 -0
  437. openxml_audit-0.2.0/tests/fixtures/odf/valid/signed_stub_odt/META-INF/documentsignatures.xml +2 -0
  438. openxml_audit-0.2.0/tests/fixtures/odf/valid/signed_stub_odt/META-INF/manifest.xml +6 -0
  439. openxml_audit-0.2.0/tests/fixtures/odf/valid/signed_stub_odt/content.xml +11 -0
  440. openxml_audit-0.2.0/tests/fixtures/odf/valid/signed_stub_odt/mimetype +1 -0
  441. openxml_audit-0.2.0/tests/fixtures/odf/valid/text_style_reference_with_styles/META-INF/manifest.xml +6 -0
  442. openxml_audit-0.2.0/tests/fixtures/odf/valid/text_style_reference_with_styles/content.xml +11 -0
  443. openxml_audit-0.2.0/tests/fixtures/odf/valid/text_style_reference_with_styles/mimetype +1 -0
  444. openxml_audit-0.2.0/tests/fixtures/odf/valid/text_style_reference_with_styles/styles.xml +9 -0
  445. openxml_audit-0.2.0/tests/fixtures/pptx/minimal/[Content_Types].xml +10 -0
  446. openxml_audit-0.2.0/tests/fixtures/pptx/minimal/_rels/.rels +4 -0
  447. openxml_audit-0.2.0/tests/fixtures/pptx/minimal/ppt/_rels/presentation.xml.rels +6 -0
  448. openxml_audit-0.2.0/tests/fixtures/pptx/minimal/ppt/presentation.xml +13 -0
  449. openxml_audit-0.2.0/tests/fixtures/pptx/minimal/ppt/slideLayouts/_rels/slideLayout1.xml.rels +4 -0
  450. openxml_audit-0.2.0/tests/fixtures/pptx/minimal/ppt/slideLayouts/slideLayout1.xml +19 -0
  451. openxml_audit-0.2.0/tests/fixtures/pptx/minimal/ppt/slideMasters/_rels/slideMaster1.xml.rels +5 -0
  452. openxml_audit-0.2.0/tests/fixtures/pptx/minimal/ppt/slideMasters/slideMaster1.xml +21 -0
  453. openxml_audit-0.2.0/tests/fixtures/pptx/minimal/ppt/slides/_rels/slide1.xml.rels +4 -0
  454. openxml_audit-0.2.0/tests/fixtures/pptx/minimal/ppt/slides/slide1.xml +18 -0
  455. openxml_audit-0.2.0/tests/fixtures/pptx/minimal/ppt/theme/theme1.xml +53 -0
  456. openxml_audit-0.2.0/tests/fixtures/pptx/missing_presentation/[Content_Types].xml +5 -0
  457. openxml_audit-0.2.0/tests/fixtures/pptx/missing_presentation/_rels/.rels +3 -0
  458. openxml_audit-0.2.0/tests/fixtures/relationships/by_id.xml +5 -0
  459. openxml_audit-0.2.0/tests/fixtures/relationships/by_type.xml +6 -0
  460. openxml_audit-0.2.0/tests/fixtures/relationships/empty.xml +3 -0
  461. openxml_audit-0.2.0/tests/fixtures/relationships/iteration.xml +5 -0
  462. openxml_audit-0.2.0/tests/fixtures/relationships/resolve_target.xml +4 -0
  463. openxml_audit-0.2.0/tests/fixtures/relationships/two_rels.xml +5 -0
  464. openxml_audit-0.2.0/tests/fixtures/schema/supplemental_font.xml +2 -0
  465. openxml_audit-0.2.0/tests/fixtures/xlsx/minimal/[Content_Types].xml +7 -0
  466. openxml_audit-0.2.0/tests/fixtures/xlsx/minimal/_rels/.rels +4 -0
  467. openxml_audit-0.2.0/tests/fixtures/xlsx/minimal/xl/_rels/workbook.xml.rels +4 -0
  468. openxml_audit-0.2.0/tests/fixtures/xlsx/minimal/xl/workbook.xml +7 -0
  469. openxml_audit-0.2.0/tests/fixtures/xlsx/minimal/xl/worksheets/sheet1.xml +4 -0
  470. openxml_audit-0.2.0/tests/fixtures/xlsx/missing_shared_strings/[Content_Types].xml +9 -0
  471. openxml_audit-0.2.0/tests/fixtures/xlsx/missing_shared_strings/_rels/.rels +4 -0
  472. openxml_audit-0.2.0/tests/fixtures/xlsx/missing_shared_strings/xl/_rels/workbook.xml.rels +6 -0
  473. openxml_audit-0.2.0/tests/fixtures/xlsx/missing_shared_strings/xl/styles.xml +2 -0
  474. openxml_audit-0.2.0/tests/fixtures/xlsx/missing_shared_strings/xl/theme/theme1.xml +2 -0
  475. openxml_audit-0.2.0/tests/fixtures/xlsx/missing_shared_strings/xl/workbook.xml +6 -0
  476. openxml_audit-0.2.0/tests/fixtures/xlsx/missing_shared_strings/xl/worksheets/sheet1.xml +10 -0
  477. openxml_audit-0.2.0/tests/fixtures/xlsx/missing_sheet_rel/[Content_Types].xml +6 -0
  478. openxml_audit-0.2.0/tests/fixtures/xlsx/missing_sheet_rel/_rels/.rels +4 -0
  479. openxml_audit-0.2.0/tests/fixtures/xlsx/missing_sheet_rel/xl/workbook.xml +7 -0
  480. openxml_audit-0.2.0/tests/test_binary_validation.py +108 -0
  481. openxml_audit-0.2.0/tests/test_cli.py +175 -0
  482. openxml_audit-0.2.0/tests/test_cross_part_constraint.py +82 -0
  483. openxml_audit-0.2.0/tests/test_helpers.py +149 -0
  484. openxml_audit-0.2.0/tests/test_integration.py +256 -0
  485. openxml_audit-0.2.0/tests/test_odf_package.py +184 -0
  486. openxml_audit-0.2.0/tests/test_odf_reference_bootstrap.py +94 -0
  487. openxml_audit-0.2.0/tests/test_odf_reference_calibration.py +169 -0
  488. openxml_audit-0.2.0/tests/test_odf_reference_runner.py +135 -0
  489. openxml_audit-0.2.0/tests/test_odf_security.py +169 -0
  490. openxml_audit-0.2.0/tests/test_odf_semantic.py +97 -0
  491. openxml_audit-0.2.0/tests/test_odf_validator.py +505 -0
  492. openxml_audit-0.2.0/tests/test_package.py +157 -0
  493. openxml_audit-0.2.0/tests/test_relationships.py +165 -0
  494. openxml_audit-0.2.0/tests/test_schema_regressions.py +352 -0
  495. openxml_audit-0.2.0/tests/test_schema_types.py +283 -0
  496. openxml_audit-0.2.0/tests/test_schematron_coverage.py +374 -0
  497. openxml_audit-0.2.0/tests/test_semantic_regressions.py +92 -0
  498. openxml_audit-0.2.0/tests/test_validator.py +206 -0
  499. openxml_audit-0.2.0/tests/test_word_excel_integration.py +66 -0
  500. openxml_audit-0.2.0/winsemiusroundtrip.dotx +0 -0
@@ -0,0 +1 @@
1
+ github: BramAlkema
@@ -0,0 +1,39 @@
1
+ name: Bug report
2
+ description: Report a validation issue or unexpected behavior
3
+ labels: [bug]
4
+ body:
5
+ - type: textarea
6
+ id: description
7
+ attributes:
8
+ label: Description
9
+ description: What happened vs what you expected
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: reproduce
14
+ attributes:
15
+ label: Steps to reproduce
16
+ description: Command or code to reproduce the issue
17
+ render: bash
18
+ - type: input
19
+ id: version
20
+ attributes:
21
+ label: Version
22
+ description: "Output of: openxml-audit --version"
23
+ - type: input
24
+ id: python
25
+ attributes:
26
+ label: Python version
27
+ description: "Output of: python --version"
28
+ - type: dropdown
29
+ id: file-type
30
+ attributes:
31
+ label: File type
32
+ options:
33
+ - PPTX
34
+ - DOCX
35
+ - XLSX
36
+ - ODT
37
+ - ODS
38
+ - ODP
39
+ - Other
@@ -0,0 +1,16 @@
1
+ name: Feature request
2
+ description: Suggest a new validation rule or feature
3
+ labels: [enhancement]
4
+ body:
5
+ - type: textarea
6
+ id: description
7
+ attributes:
8
+ label: Description
9
+ description: What would you like added or changed?
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: use-case
14
+ attributes:
15
+ label: Use case
16
+ description: Why is this needed? What problem does it solve?
@@ -0,0 +1,13 @@
1
+ ## What
2
+
3
+ <!-- Brief description of the change -->
4
+
5
+ ## Why
6
+
7
+ <!-- Why is this change needed? -->
8
+
9
+ ## Testing
10
+
11
+ - [ ] `pytest` passes
12
+ - [ ] `ruff check src/ tests/` clean
13
+ - [ ] `mypy src/openxml_audit` clean
@@ -0,0 +1,112 @@
1
+ name: Calibrate parity
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ sdk_ref:
7
+ description: "Open XML SDK tag/branch to calibrate against"
8
+ required: true
9
+ default: "v3.4.1"
10
+ schedule:
11
+ - cron: "17 2 * * 1"
12
+
13
+ jobs:
14
+ calibrate:
15
+ runs-on: ubuntu-latest
16
+ env:
17
+ SDK_REF: ${{ inputs.sdk_ref || 'v3.4.1' }}
18
+ SDK_REPO: https://github.com/dotnet/Open-XML-SDK.git
19
+ SDK_ROOT: /tmp/openxml-sdk-upstream
20
+ CORPUS_ROOT: /tmp/openxml-sdk-seed
21
+ RUNTIME_MANIFEST: /tmp/openxml-runtime-manifest.json
22
+ steps:
23
+ - name: Checkout
24
+ uses: actions/checkout@v4
25
+
26
+ - name: Set up Python
27
+ uses: actions/setup-python@v5
28
+ with:
29
+ python-version: "3.11"
30
+
31
+ - name: Set up .NET SDK
32
+ uses: actions/setup-dotnet@v4
33
+ with:
34
+ dotnet-version: "8.0.x"
35
+
36
+ - name: Install package
37
+ run: |
38
+ python -m pip install --upgrade pip
39
+ pip install -e .
40
+
41
+ - name: Fetch Open XML SDK
42
+ run: |
43
+ rm -rf "$SDK_ROOT"
44
+ git clone --depth 1 --branch "$SDK_REF" "$SDK_REPO" "$SDK_ROOT"
45
+ git -C "$SDK_ROOT" rev-parse HEAD | tee /tmp/openxml-sdk-commit.txt
46
+ printf '%s\n' "$SDK_REF" > /tmp/openxml-sdk-ref.txt
47
+
48
+ - name: Materialize SDK corpus (runtime only)
49
+ run: |
50
+ rm -rf "$CORPUS_ROOT"
51
+ python scripts/corpus/import_sdk_assets.py \
52
+ --sdk-root "$SDK_ROOT" \
53
+ --output-root "$CORPUS_ROOT"
54
+
55
+ - name: Build runtime manifest with extracted expectations
56
+ run: |
57
+ cp data/corpus/sdk_seed/manifest.json "$RUNTIME_MANIFEST"
58
+ python scripts/corpus/extract_sdk_expectations.py \
59
+ --sdk-root "$SDK_ROOT" \
60
+ --manifest "$RUNTIME_MANIFEST" \
61
+ --output "$RUNTIME_MANIFEST"
62
+
63
+ - name: Run parity snapshot
64
+ run: |
65
+ mkdir -p reports
66
+ python scripts/corpus/run_parity_snapshot.py \
67
+ --manifest "$RUNTIME_MANIFEST" \
68
+ --files-root "$CORPUS_ROOT/files" \
69
+ --output reports/parity_snapshot.json
70
+
71
+ - name: Upload parity artifacts
72
+ if: always()
73
+ uses: actions/upload-artifact@v4
74
+ with:
75
+ name: parity-calibration
76
+ path: |
77
+ reports/parity_snapshot.json
78
+ /tmp/openxml-runtime-manifest.json
79
+
80
+ - name: Workflow summary
81
+ if: always()
82
+ run: |
83
+ python - <<'PY'
84
+ import json
85
+ from pathlib import Path
86
+
87
+ report = Path("reports/parity_snapshot.json")
88
+ if not report.exists():
89
+ print("No parity snapshot produced.")
90
+ raise SystemExit(0)
91
+
92
+ data = json.loads(report.read_text(encoding="utf-8"))
93
+ lines = [
94
+ "# Parity Calibration Summary",
95
+ f"- SDK ref: {Path('/tmp/openxml-sdk-ref.txt').read_text(encoding='utf-8').strip()}",
96
+ f"- SDK commit: {Path('/tmp/openxml-sdk-commit.txt').read_text(encoding='utf-8').strip()}",
97
+ f"- Checks total: {data.get('checks_total', 0)}",
98
+ f"- Matched: {data.get('checks_matched', 0)}",
99
+ f"- Mismatched: {data.get('checks_mismatched', 0)}",
100
+ f"- Match rate: {data.get('match_rate_percent', 0)}%",
101
+ ]
102
+
103
+ families = data.get("mismatch_families") or []
104
+ if families:
105
+ lines.append("")
106
+ lines.append("## Top mismatch families")
107
+ for row in families[:10]:
108
+ lines.append(f"- {row.get('count', 0)}x {row.get('description', '')}")
109
+
110
+ Path("/tmp/parity_summary.md").write_text("\n".join(lines), encoding="utf-8")
111
+ PY
112
+ cat /tmp/parity_summary.md >> "$GITHUB_STEP_SUMMARY"
@@ -0,0 +1,151 @@
1
+ name: ODF reference calibration
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ odf_toolkit_ref:
7
+ description: "ODF Toolkit git ref to build."
8
+ required: false
9
+ default: "v0.13.0"
10
+ opf_ref:
11
+ description: "OPF validator git ref to build."
12
+ required: false
13
+ default: "v0.20-alpha-2"
14
+ schedule:
15
+ # Quarterly: 1st of Jan, Apr, Jul, Oct at 03:00 UTC
16
+ - cron: "0 3 1 1,4,7,10 *"
17
+
18
+ jobs:
19
+ odf-reference-drift:
20
+ runs-on: ubuntu-latest
21
+ env:
22
+ BASELINE_COMPARE: data/odf/reference_baseline/2026-03-09/mismatch_report.json
23
+ POLICY_FILE: data/odf/reference_baseline/2026-03-09/drift_policy.json
24
+ WAIVERS_FILE: data/odf/reference_baseline/2026-03-09/waivers.json
25
+ RUN_REPORT: reports/odf/reference_runs.json
26
+ COMPARE_REPORT: reports/odf/reference_compare.json
27
+ COMPARE_SUMMARY: reports/odf/reference_compare.md
28
+ TRIAGE_REPORT: reports/odf/mismatch_triage.md
29
+ DRIFT_REPORT: reports/odf/reference_drift.json
30
+ DRIFT_SUMMARY: /tmp/odf_reference_drift.md
31
+ ODF_TOOLKIT_REF: ${{ github.event.inputs.odf_toolkit_ref || 'v0.13.0' }}
32
+ OPF_REF: ${{ github.event.inputs.opf_ref || 'v0.20-alpha-2' }}
33
+ steps:
34
+ - name: Checkout
35
+ uses: actions/checkout@v4
36
+
37
+ - name: Set up Python
38
+ uses: actions/setup-python@v5
39
+ with:
40
+ python-version: "3.11"
41
+
42
+ - name: Set up Java
43
+ uses: actions/setup-java@v4
44
+ with:
45
+ distribution: temurin
46
+ java-version: "17"
47
+
48
+ - name: Install Maven
49
+ run: |
50
+ sudo apt-get update
51
+ sudo apt-get install -y maven
52
+
53
+ - name: Install package
54
+ run: |
55
+ python -m pip install --upgrade pip
56
+ pip install -e .
57
+
58
+ - name: Prepare reports directory
59
+ run: mkdir -p reports/odf
60
+
61
+ - name: Bootstrap reference validators
62
+ id: bootstrap
63
+ run: |
64
+ python scripts/odf/bootstrap_reference_validators.py \
65
+ --work-root /tmp/openxml_audit_odf_reference_tools \
66
+ --odf-toolkit-ref "$ODF_TOOLKIT_REF" \
67
+ --opf-ref "$OPF_REF" \
68
+ --output-json /tmp/odf_reference_tools.json
69
+
70
+ cp /tmp/odf_reference_tools.json reports/odf/reference_tooling.json
71
+
72
+ python - <<'PY'
73
+ import json
74
+ import os
75
+ from pathlib import Path
76
+
77
+ payload = json.loads(Path("/tmp/odf_reference_tools.json").read_text(encoding="utf-8"))
78
+ output_path = Path(os.environ["GITHUB_OUTPUT"])
79
+ with output_path.open("a", encoding="utf-8") as fh:
80
+ for key, value in {
81
+ "odf_toolkit_cmd": payload["odf_toolkit_cmd"],
82
+ "opf_cmd": payload["opf_cmd"],
83
+ "odf_toolkit_repo": payload["odf_toolkit"]["repo"],
84
+ "odf_toolkit_ref": payload["odf_toolkit"]["ref"],
85
+ "opf_repo": payload["opf"]["repo"],
86
+ "opf_ref": payload["opf"]["ref"],
87
+ }.items():
88
+ fh.write(f"{key}<<EOF\n{value}\nEOF\n")
89
+ PY
90
+
91
+ - name: Run ODF reference validators
92
+ run: |
93
+ python scripts/odf/run_reference_validators.py \
94
+ --corpus-manifest data/odf/reference_corpus/manifest.json \
95
+ --output "$RUN_REPORT" \
96
+ --odf-toolkit-cmd "${{ steps.bootstrap.outputs.odf_toolkit_cmd }}" \
97
+ --opf-cmd "${{ steps.bootstrap.outputs.opf_cmd }}"
98
+
99
+ - name: Compare reference results
100
+ run: |
101
+ python scripts/odf/compare_reference_results.py \
102
+ --input "$RUN_REPORT" \
103
+ --output "$COMPARE_REPORT" \
104
+ --summary "$COMPARE_SUMMARY"
105
+
106
+ - name: Build mismatch triage
107
+ run: |
108
+ python scripts/odf/build_mismatch_triage.py \
109
+ --compare "$COMPARE_REPORT" \
110
+ --runs "$RUN_REPORT" \
111
+ --output "$TRIAGE_REPORT"
112
+
113
+ - name: Enforce reference drift policy
114
+ run: |
115
+ python scripts/odf/check_reference_drift.py \
116
+ --baseline "$BASELINE_COMPARE" \
117
+ --current "$COMPARE_REPORT" \
118
+ --policy "$POLICY_FILE" \
119
+ --waivers "$WAIVERS_FILE" \
120
+ --output "$DRIFT_REPORT" \
121
+ --summary "$DRIFT_SUMMARY"
122
+
123
+ - name: Upload reports
124
+ if: always()
125
+ uses: actions/upload-artifact@v4
126
+ with:
127
+ name: odf-reference-calibration
128
+ path: reports/odf
129
+
130
+ - name: Workflow summary
131
+ if: always()
132
+ run: |
133
+ {
134
+ echo "# ODF Reference Calibration";
135
+ echo "- ODF Toolkit: ${{ steps.bootstrap.outputs.odf_toolkit_repo }} @ ${{ steps.bootstrap.outputs.odf_toolkit_ref }}";
136
+ echo "- OPF: ${{ steps.bootstrap.outputs.opf_repo }} @ ${{ steps.bootstrap.outputs.opf_ref }}";
137
+ echo "";
138
+ } >> "$GITHUB_STEP_SUMMARY"
139
+
140
+ if [ -f "$DRIFT_SUMMARY" ]; then
141
+ cat "$DRIFT_SUMMARY" >> "$GITHUB_STEP_SUMMARY"
142
+ else
143
+ echo "No ODF drift summary produced." >> "$GITHUB_STEP_SUMMARY"
144
+ fi
145
+ if [ -f "$TRIAGE_REPORT" ]; then
146
+ echo "" >> "$GITHUB_STEP_SUMMARY"
147
+ cat "$TRIAGE_REPORT" >> "$GITHUB_STEP_SUMMARY"
148
+ else
149
+ echo "" >> "$GITHUB_STEP_SUMMARY"
150
+ echo "No ODF mismatch triage report produced." >> "$GITHUB_STEP_SUMMARY"
151
+ fi
@@ -0,0 +1,90 @@
1
+ name: Deploy docs
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ paths:
8
+ - "docs/**"
9
+ - "README.md"
10
+ - ".github/workflows/pages.yml"
11
+ workflow_dispatch:
12
+
13
+ permissions:
14
+ contents: read
15
+ pages: write
16
+ id-token: write
17
+
18
+ concurrency:
19
+ group: pages
20
+ cancel-in-progress: true
21
+
22
+ jobs:
23
+ build:
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - name: Checkout
27
+ uses: actions/checkout@v4
28
+
29
+ - name: Build site
30
+ run: |
31
+ mkdir -p _site
32
+ cp README.md _site/index.md
33
+ cp -r docs/* _site/
34
+
35
+ # Convert markdown to HTML with a minimal template
36
+ pip install markdown
37
+ python - <<'PY'
38
+ import markdown
39
+ from pathlib import Path
40
+
41
+ site = Path("_site")
42
+ template = """<!DOCTYPE html>
43
+ <html><head>
44
+ <meta charset="utf-8">
45
+ <meta name="viewport" content="width=device-width, initial-scale=1">
46
+ <title>{title} - openxml-audit</title>
47
+ <style>
48
+ body {{ max-width: 800px; margin: 40px auto; padding: 0 20px; font-family: -apple-system, sans-serif; line-height: 1.6; color: #333; }}
49
+ pre {{ background: #f5f5f5; padding: 16px; overflow-x: auto; border-radius: 4px; }}
50
+ code {{ background: #f5f5f5; padding: 2px 6px; border-radius: 3px; font-size: 0.9em; }}
51
+ pre code {{ background: none; padding: 0; }}
52
+ table {{ border-collapse: collapse; width: 100%; }}
53
+ th, td {{ border: 1px solid #ddd; padding: 8px; text-align: left; }}
54
+ th {{ background: #f5f5f5; }}
55
+ a {{ color: #0366d6; }}
56
+ nav {{ margin-bottom: 2em; padding-bottom: 1em; border-bottom: 1px solid #eee; }}
57
+ nav a {{ margin-right: 1em; }}
58
+ </style>
59
+ </head><body>
60
+ <nav><a href="./">Home</a><a href="./parity_contract.html">OOXML Parity</a><a href="./odf_validation_contract.html">ODF Contract</a><a href="./odf_security_policy.html">ODF Security</a></nav>
61
+ {content}
62
+ </body></html>"""
63
+
64
+ md = markdown.Markdown(extensions=["tables", "fenced_code"])
65
+ for f in site.glob("*.md"):
66
+ html = md.convert(f.read_text(encoding="utf-8"))
67
+ title = f.stem.replace("_", " ").title()
68
+ if f.name == "index.md":
69
+ title = "openxml-audit"
70
+ out = site / f"{f.stem}.html"
71
+ out.write_text(template.format(title=title, content=html), encoding="utf-8")
72
+ md.reset()
73
+ f.unlink()
74
+ PY
75
+
76
+ - name: Upload pages artifact
77
+ uses: actions/upload-pages-artifact@v3
78
+ with:
79
+ path: _site
80
+
81
+ deploy:
82
+ needs: build
83
+ runs-on: ubuntu-latest
84
+ environment:
85
+ name: github-pages
86
+ url: ${{ steps.deployment.outputs.page_url }}
87
+ steps:
88
+ - name: Deploy to GitHub Pages
89
+ id: deployment
90
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,147 @@
1
+ name: Parity gate
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - "src/**"
7
+ - "scripts/corpus/**"
8
+ - "data/corpus/**"
9
+ - ".github/workflows/parity-gate.yml"
10
+ push:
11
+ branches:
12
+ - main
13
+ paths:
14
+ - "src/**"
15
+ - "scripts/corpus/**"
16
+ - "data/corpus/**"
17
+ - ".github/workflows/parity-gate.yml"
18
+ workflow_dispatch:
19
+ inputs:
20
+ corpus_archive_url:
21
+ description: "Optional URL for parity corpus tar.zst (overrides repo variable)."
22
+ required: false
23
+ default: ""
24
+
25
+ jobs:
26
+ parity:
27
+ runs-on: ubuntu-latest
28
+ env:
29
+ SDK_REF: v3.4.1
30
+ SDK_REPO: https://github.com/dotnet/Open-XML-SDK.git
31
+ BASELINE_SNAPSHOT: data/corpus/parity_baseline/v3.4.1/parity_snapshot.json
32
+ WAIVERS_FILE: data/corpus/parity_baseline/v3.4.1/waivers.json
33
+ PERF_BUDGET_FILE: data/corpus/parity_baseline/v3.4.1/perf_budget.json
34
+ CURRENT_SNAPSHOT: reports/parity_current.json
35
+ COMPARE_REPORT: reports/parity_compare.json
36
+ SUMMARY_REPORT: /tmp/parity_compare.md
37
+ PERF_SUMMARY_REPORT: /tmp/parity_perf.md
38
+ CORPUS_ARCHIVE_URL: ${{ github.event.inputs.corpus_archive_url || vars.PARITY_CORPUS_ARCHIVE_URL }}
39
+ steps:
40
+ - name: Checkout
41
+ uses: actions/checkout@v4
42
+
43
+ - name: Set up Python
44
+ uses: actions/setup-python@v5
45
+ with:
46
+ python-version: "3.11"
47
+
48
+ - name: Install package
49
+ run: |
50
+ python -m pip install --upgrade pip
51
+ pip install -e .
52
+
53
+ - name: Prepare reports directory
54
+ run: mkdir -p reports
55
+
56
+ - name: Resolve corpus files root
57
+ id: corpus
58
+ run: |
59
+ set -euo pipefail
60
+
61
+ # 1. Local files checked into the repo
62
+ local_root="$GITHUB_WORKSPACE/data/corpus/sdk_seed/files"
63
+ if [ -d "$local_root" ]; then
64
+ echo "Using local corpus files at $local_root"
65
+ echo "files_root=$local_root" >> "$GITHUB_OUTPUT"
66
+ exit 0
67
+ fi
68
+
69
+ # 2. Pre-built archive from repo variable
70
+ if [ -n "${CORPUS_ARCHIVE_URL:-}" ]; then
71
+ work_root="/tmp/openxml-parity-corpus"
72
+ archive_path="/tmp/openxml-parity-corpus.tar.zst"
73
+ rm -rf "$work_root"
74
+ mkdir -p "$work_root"
75
+ echo "Downloading corpus archive from configured URL"
76
+ curl -fsSL "$CORPUS_ARCHIVE_URL" -o "$archive_path"
77
+ tar --zstd -xf "$archive_path" -C "$work_root"
78
+ files_root="$work_root/files"
79
+ if [ ! -d "$files_root" ]; then
80
+ echo "::error::Corpus archive does not contain expected 'files/' directory."
81
+ exit 2
82
+ fi
83
+ echo "files_root=$files_root" >> "$GITHUB_OUTPUT"
84
+ exit 0
85
+ fi
86
+
87
+ # 3. Build corpus from upstream SDK
88
+ echo "Building corpus from upstream SDK ($SDK_REF)"
89
+ sdk_root="/tmp/openxml-sdk-upstream"
90
+ corpus_root="/tmp/openxml-sdk-seed"
91
+ rm -rf "$sdk_root" "$corpus_root"
92
+ git clone --depth 1 --branch "$SDK_REF" "$SDK_REPO" "$sdk_root"
93
+ python scripts/corpus/import_sdk_assets.py \
94
+ --sdk-root "$sdk_root" \
95
+ --output-root "$corpus_root"
96
+ echo "files_root=$corpus_root/files" >> "$GITHUB_OUTPUT"
97
+
98
+ - name: Run parity snapshot
99
+ run: |
100
+ python scripts/corpus/run_parity_snapshot.py \
101
+ --manifest data/corpus/sdk_seed/manifest.json \
102
+ --files-root "${{ steps.corpus.outputs.files_root }}" \
103
+ --output "$CURRENT_SNAPSHOT"
104
+
105
+ - name: Compare against baseline
106
+ run: |
107
+ python scripts/corpus/compare_to_baseline.py \
108
+ --baseline "$BASELINE_SNAPSHOT" \
109
+ --current "$CURRENT_SNAPSHOT" \
110
+ --waivers "$WAIVERS_FILE" \
111
+ --output "$COMPARE_REPORT" \
112
+ --summary "$SUMMARY_REPORT" \
113
+ --max-mismatch-growth 0 \
114
+ --max-new-families 0 \
115
+ --max-match-rate-drop 0.0 \
116
+ --max-missing-files 0
117
+
118
+ - name: Enforce parity performance budget
119
+ run: |
120
+ python scripts/corpus/check_perf_budget.py \
121
+ --report "$CURRENT_SNAPSHOT" \
122
+ --budget "$PERF_BUDGET_FILE" \
123
+ --output reports/parity_perf.json \
124
+ --summary "$PERF_SUMMARY_REPORT"
125
+
126
+ - name: Upload parity reports
127
+ if: always()
128
+ uses: actions/upload-artifact@v4
129
+ with:
130
+ name: parity-gate-reports
131
+ path: reports
132
+
133
+ - name: Workflow summary
134
+ if: always()
135
+ run: |
136
+ if [ -f "$SUMMARY_REPORT" ]; then
137
+ cat "$SUMMARY_REPORT" >> "$GITHUB_STEP_SUMMARY"
138
+ else
139
+ echo "No parity summary produced." >> "$GITHUB_STEP_SUMMARY"
140
+ fi
141
+ if [ -f "$PERF_SUMMARY_REPORT" ]; then
142
+ echo "" >> "$GITHUB_STEP_SUMMARY"
143
+ cat "$PERF_SUMMARY_REPORT" >> "$GITHUB_STEP_SUMMARY"
144
+ else
145
+ echo "" >> "$GITHUB_STEP_SUMMARY"
146
+ echo "No parity performance summary produced." >> "$GITHUB_STEP_SUMMARY"
147
+ fi
@@ -0,0 +1,90 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ contents: write
10
+ id-token: write
11
+
12
+ jobs:
13
+ build:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Checkout
17
+ uses: actions/checkout@v4
18
+
19
+ - name: Set up Python
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.11"
23
+
24
+ - name: Install build tools
25
+ run: pip install build
26
+
27
+ - name: Build package
28
+ run: python -m build
29
+
30
+ - name: Upload dist artifacts
31
+ uses: actions/upload-artifact@v4
32
+ with:
33
+ name: dist
34
+ path: dist/
35
+
36
+ publish-pypi:
37
+ needs: build
38
+ runs-on: ubuntu-latest
39
+ permissions:
40
+ id-token: write
41
+ steps:
42
+ - name: Download dist artifacts
43
+ uses: actions/download-artifact@v4
44
+ with:
45
+ name: dist
46
+ path: dist/
47
+
48
+ - name: Publish to PyPI
49
+ uses: pypa/gh-action-pypi-publish@release/v1
50
+
51
+ github-release:
52
+ needs: build
53
+ runs-on: ubuntu-latest
54
+ permissions:
55
+ contents: write
56
+ steps:
57
+ - name: Checkout
58
+ uses: actions/checkout@v4
59
+ with:
60
+ fetch-depth: 0
61
+
62
+ - name: Download dist artifacts
63
+ uses: actions/download-artifact@v4
64
+ with:
65
+ name: dist
66
+ path: dist/
67
+
68
+ - name: Generate changelog
69
+ id: changelog
70
+ run: |
71
+ # Get previous tag
72
+ prev_tag=$(git tag --sort=-v:refname | head -2 | tail -1)
73
+ if [ -z "$prev_tag" ]; then
74
+ echo "body=Initial release" >> "$GITHUB_OUTPUT"
75
+ else
76
+ changelog=$(git log --pretty=format:"- %s" "$prev_tag"..HEAD -- src/ scripts/ | head -50)
77
+ # Write multiline output
78
+ {
79
+ echo "body<<EOF"
80
+ echo "$changelog"
81
+ echo "EOF"
82
+ } >> "$GITHUB_OUTPUT"
83
+ fi
84
+
85
+ - name: Create GitHub Release
86
+ uses: softprops/action-gh-release@v2
87
+ with:
88
+ body: ${{ steps.changelog.outputs.body }}
89
+ files: dist/*
90
+ generate_release_notes: true