python-docx-oss 0.1.1__tar.gz → 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.
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/HISTORY.md +11 -0
- {python_docx_oss-0.1.1/src/python_docx_oss.egg-info → python_docx_oss-0.2.0}/PKG-INFO +15 -12
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/README.md +15 -12
- python_docx_oss-0.2.0/docs/_static/img/oss.png +0 -0
- python_docx_oss-0.2.0/docs/dev/upstream-maintenance.rst +95 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/index.rst +2 -1
- python_docx_oss-0.2.0/docs/user/compatibility.rst +48 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/custom-xml.rst +9 -1
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/documents.rst +27 -4
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/__init__.py +1 -1
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/api.py +6 -3
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/document.py +12 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/image/constants.py +1 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/image/emf.py +1 -2
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/rel.py +5 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/parts/customxml.py +1 -1
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/parts/document.py +18 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0/src/python_docx_oss.egg-info}/PKG-INFO +15 -12
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/python_docx_oss.egg-info/SOURCES.txt +2 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/integration/customxml/test_custom_xml_roundtrip.py +30 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/integration/test_word_roundtrip.py +51 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/test_rel.py +9 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_api.py +20 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_document.py +8 -0
- python_docx_oss-0.1.1/docs/_static/img/oss.png +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/LICENSE +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/MANIFEST.in +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/Makefile +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/_static/.gitignore +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/_static/img/comment-parts.png +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/_static/img/example-docx-01.png +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/_static/img/hdrftr-01.png +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/_static/img/hdrftr-02.png +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/_templates/layout.html +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/_templates/sidebarlinks.html +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/_themes/armstrong/LICENSE +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/_themes/armstrong/layout.html +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/_themes/armstrong/rtd-themes.conf +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/_themes/armstrong/static/rtd.css_t +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/_themes/armstrong/theme.conf +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/_themes/armstrong/theme.conf.orig +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/comments.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/dml.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/document.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/MsoColorType.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/MsoThemeColorIndex.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdAlignParagraph.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdBuiltinStyle.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdCellVerticalAlignment.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdColorIndex.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdLineSpacing.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdOrientation.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdRowAlignment.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdRowHeightRule.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdSectionStart.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdStyleType.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdTabAlignment.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdTabLeader.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdTableDirection.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/WdUnderline.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/enum/index.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/section.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/settings.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/shape.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/shared.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/style.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/table.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/api/text.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/conf.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/comments.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/coreprops.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/header.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/numbering.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/sections.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/settings.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/shapes/index.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/shapes/picture.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/shapes/shapes-inline-size.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/shapes/shapes-inline.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/styles/character-style.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/styles/index.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/styles/latent-styles.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/styles/paragraph-style.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/styles/style.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/styles/styles.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/table/cell-merge.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/table/index.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/table/table-cell.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/table/table-props.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/table/table-row.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/text/breaks.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/text/font-color.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/text/font-highlight-color.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/text/font.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/text/hyperlink.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/text/index.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/text/paragraph-format.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/text/run-content.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/text/tab-stops.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/features/text/underline.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/index.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/schema/ct_body.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/schema/ct_document.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/dev/analysis/schema/ct_p.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/requirements.txt +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/api-concepts.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/comments.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/custom-properties.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/hdrftr.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/install.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/quickstart.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/sections.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/shapes.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/styles-understanding.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/styles-using.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/tables.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/docs/user/text.rst +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/api-open-document.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/blk-add-paragraph.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/blk-add-table.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/blk-iter-inner-content.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/cmt-mutations.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/cmt-props.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-access-collections.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-access-sections.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-add-comment.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-add-heading.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-add-page-break.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-add-paragraph.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-add-picture.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-add-section.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-add-table.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-comments.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-coreprops.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-customprops.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-settings.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/doc-styles.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/environment.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/hdr-header-footer.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/hlk-props.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/img-characterize-image.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/num-access-numbering-part.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/par-access-inner-content.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/par-access-parfmt.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/par-add-run.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/par-alignment-prop.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/par-clear-paragraph.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/par-insert-paragraph.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/par-set-text.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/par-style-prop.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/pbk-split-para.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/run-access-font.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/run-access-inner-content.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/run-add-content.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/run-add-picture.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/run-char-style.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/run-clear-run.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/run-enum-props.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/sct-section.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/shp-inline-shape-access.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/shp-inline-shape-size.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/api.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/block.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/comments.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/coreprops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/customprops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/document.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/font.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/hdrftr.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/helpers.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/hyperlink.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/image.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/numbering.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/pagebreak.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/paragraph.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/parfmt.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/section.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/settings.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/shape.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/shared.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/styles.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/table.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/tabstops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/blk-containing-table.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/blk-paras-and-tables.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/comments-rich-para.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/court-exif.jpg +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/doc-access-sections.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/doc-add-section.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/doc-coreprops.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/doc-customprops-legacy.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/doc-customprops.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/doc-default.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/doc-no-coreprops.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/doc-no-customprops.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/doc-odd-even-hdrs.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/doc-word-default-blank.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/fnt-color.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/hdr-header-footer.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/jfif-300-dpi.jpg +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/jpeg420exif.jpg +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/lena.bmp +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/lena.gif +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/lena.tif +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/lena_std.jpg +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/monty-truth.png +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/mountain.bmp +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/num-having-numbering-part.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/par-alignment.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/par-hlink-frags.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/par-hyperlinks.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/par-known-paragraphs.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/par-known-styles.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/par-rendered-page-breaks.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/python-icon.jpeg +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/run-char-style.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/run-enumerated-props.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/sample.tif +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/sct-first-page-hdrftr.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/sct-inner-content.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/sct-section-props.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/set-no-settings-part.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/shp-inline-shape-access.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/sty-behav-props.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/sty-having-no-styles-part.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/sty-having-styles-part.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/sty-known-styles.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/tab-stops.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/tbl-2x2-table.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/tbl-cell-access.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/tbl-cell-props.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/tbl-col-props.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/tbl-having-applied-style.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/tbl-having-tables.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/tbl-on-off-props.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/tbl-props.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/test.png +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/txt-font-highlight-color.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/test_files/txt-font-props.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/steps/text.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/sty-access-font.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/sty-access-latent-styles.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/sty-access-parfmt.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/sty-add-style.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/sty-delete-style.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/sty-latent-add-del.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/sty-latent-props.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/sty-style-props.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/tab-access-tabs.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/tab-tabstop-props.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/tbl-add-row-or-col.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/tbl-cell-access.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/tbl-cell-add-table.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/tbl-cell-props.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/tbl-cell-text.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/tbl-col-props.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/tbl-item-access.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/tbl-merge-cells.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/tbl-props.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/tbl-row-props.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/tbl-style.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/txt-add-break.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/txt-font-color.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/txt-font-props.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/features/txt-parfmt-props.feature +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/pyproject.toml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/requirements-dev.txt +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/requirements-docs.txt +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/requirements-test.txt +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/requirements.txt +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/setup.cfg +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/blkcntnr.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/comments.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/dml/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/dml/color.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/drawing/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/enum/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/enum/base.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/enum/dml.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/enum/section.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/enum/shape.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/enum/style.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/enum/table.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/enum/text.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/exceptions.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/image/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/image/bmp.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/image/exceptions.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/image/gif.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/image/helpers.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/image/image.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/image/jpeg.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/image/png.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/image/svg.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/image/tiff.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/constants.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/coreprops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/customprops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/exceptions.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/oxml.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/package.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/packuri.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/part.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/parts/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/parts/coreprops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/parts/customprops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/phys_pkg.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/pkgreader.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/pkgwriter.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/shared.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/opc/spec.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/comments.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/coreprops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/customprops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/dml/CT_ExtensionList.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/document.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/drawing.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/exceptions.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/ns.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/numbering.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/parser.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/section.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/settings.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/shape.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/shared.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/simpletypes.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/styles.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/table.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/text/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/text/font.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/text/hyperlink.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/text/pagebreak.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/text/paragraph.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/text/parfmt.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/text/run.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/oxml/xmlchemy.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/package.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/parts/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/parts/comments.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/parts/hdrftr.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/parts/image.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/parts/numbering.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/parts/settings.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/parts/story.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/parts/styles.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/py.typed +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/section.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/settings.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/shape.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/shared.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/styles/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/styles/latent.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/styles/style.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/styles/styles.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/table.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-comments.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/[Content_Types].xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/_rels/.rels +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/customXml/_rels/item1.xml.rels +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/customXml/item1.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/customXml/itemProps1.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/docProps/app.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/docProps/core.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/docProps/thumbnail.jpeg +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/word/_rels/document.xml.rels +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/word/document.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/word/fontTable.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/word/numbering.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/word/settings.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/word/styles.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/word/stylesWithEffects.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/word/theme/theme1.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-docx-template/word/webSettings.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-footer.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-header.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-numbering.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-settings.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default-styles.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/templates/default.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/text/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/text/font.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/text/hyperlink.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/text/pagebreak.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/text/paragraph.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/text/parfmt.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/text/run.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/text/tabstops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/docx/types.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/python_docx_oss.egg-info/dependency_links.txt +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/python_docx_oss.egg-info/requires.txt +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/src/python_docx_oss.egg-info/top_level.txt +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/conftest.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/dml/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/dml/test_color.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/fixtures/README.md +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/fixtures/customxml/generate_fixture.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/fixtures/customxml/multiple-custom-xml-parts.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/fixtures/documents/word-blank.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/fixtures/drawing/word-floating-picture.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/fixtures/fonts/word-east-asian-fonts.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/fixtures/images/word-svg-image.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/image/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/image/test_bmp.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/image/test_emf.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/image/test_gif.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/image/test_helpers.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/image/test_image.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/image/test_jpeg.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/image/test_png.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/image/test_svg.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/image/test_tiff.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/integration/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/integration/customxml/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/parts/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/parts/test_coreprops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/parts/test_customprops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/test_coreprops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/test_customprops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/test_oxml.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/test_package.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/test_packuri.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/test_part.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/test_phys_pkg.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/test_pkgreader.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/test_pkgwriter.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/unitdata/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/unitdata/rels.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/opc/unitdata/types.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/parts/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/parts/test_document.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/parts/unitdata/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/parts/unitdata/document.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/test__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/test_comments.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/test_document.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/test_ns.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/test_section.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/test_styles.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/test_table.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/test_xmlchemy.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/text/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/text/test_hyperlink.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/text/test_run.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/unitdata/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/unitdata/dml.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/unitdata/numbering.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/unitdata/section.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/unitdata/shared.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/unitdata/styles.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/unitdata/table.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/oxml/unitdata/text.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/parts/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/parts/test_comments.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/parts/test_customxml.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/parts/test_document.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/parts/test_hdrftr.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/parts/test_image.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/parts/test_numbering.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/parts/test_settings.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/parts/test_story.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/parts/test_styles.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/styles/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/styles/test_latent.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/styles/test_style.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/styles/test_styles.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_blkcntnr.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_comments.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_drawing.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_enum.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/150-dpi.png +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/300-dpi.TIF +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/300-dpi.jpg +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/300-dpi.png +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/72-dpi.tiff +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/CVS_LOGO.WMF +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/blk-inner-content.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/exif-420-dpi.jpg +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/[Content_Types].xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/_rels/.rels +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/customXml/_rels/item1.xml.rels +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/customXml/item1.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/customXml/itemProps1.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/docProps/app.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/docProps/core.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/docProps/thumbnail.jpeg +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/word/_rels/document.xml.rels +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/word/document.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/word/fontTable.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/word/numbering.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/word/settings.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/word/styles.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/word/stylesWithEffects.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/word/theme/theme1.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/expanded_docx/word/webSettings.xml +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/having-images.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/jfif-iguana.jpg +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/jpeg_without_app0_and_app1.jpg +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/little-endian.tif +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/monty-truth.png +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/python-icon.jpeg +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/python-icon.png +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/python-powered.png +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/python.bmp +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/sct-inner-content.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/snippets/add-row-col.txt +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/snippets/inline.txt +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/snippets/new-tbl.txt +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/snippets/tbl-cells.txt +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/sonic.emf +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/sonic.gif +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_files/test.docx +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_package.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_section.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_settings.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_shape.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_shared.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/test_table.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/text/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/text/test_font.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/text/test_hyperlink.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/text/test_pagebreak.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/text/test_paragraph.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/text/test_parfmt.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/text/test_run.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/text/test_tabstops.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/unitdata.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/unitutil/__init__.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/unitutil/cxml.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/unitutil/file.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tests/unitutil/mock.py +0 -0
- {python_docx_oss-0.1.1 → python_docx_oss-0.2.0}/tox.ini +0 -0
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
## Release History
|
|
2
2
|
|
|
3
|
+
**0.2.0 (2026-08-24)**
|
|
4
|
+
|
|
5
|
+
- Added direct loading from raw DOCX bytes with ``Document(bytes)``.
|
|
6
|
+
- Added ``Document.to_bytes()`` for in-memory export and ``Document.copy()``
|
|
7
|
+
for independent document snapshots.
|
|
8
|
+
- Added safe removal of Custom XML parts, including their document and property
|
|
9
|
+
relationships.
|
|
10
|
+
- Added real-document EMF round-trip coverage and corrected the EMF MIME type.
|
|
11
|
+
- Documented the capability matrix, upstream maintenance policy, and
|
|
12
|
+
compatibility boundary with official ``python-docx``.
|
|
13
|
+
|
|
3
14
|
**0.1.1 (2026-08-21)**
|
|
4
15
|
|
|
5
16
|
- Added Python 3.14 support and CI coverage for Python 3.12 through 3.14.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-docx-oss
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Create, read, and update Microsoft Word .docx files.
|
|
5
5
|
Author: Ethan St Lee
|
|
6
6
|
License-Expression: MIT
|
|
@@ -53,18 +53,19 @@ Use it when an application needs more than basic paragraphs and tables: custom d
|
|
|
53
53
|
metadata, application-owned XML, vector images, floating pictures, East Asian fonts,
|
|
54
54
|
or low-level package and relationship access.
|
|
55
55
|
|
|
56
|
-
##
|
|
56
|
+
## Capability Matrix
|
|
57
57
|
|
|
58
|
-
| Capability |
|
|
59
|
-
| --- | --- |
|
|
60
|
-
| Documents, paragraphs,
|
|
61
|
-
| Custom document properties |
|
|
62
|
-
| Custom XML
|
|
63
|
-
| SVG and EMF images |
|
|
64
|
-
| Inline and floating pictures |
|
|
65
|
-
|
|
|
66
|
-
| Low-level OPC parts and relationships |
|
|
67
|
-
|
|
|
58
|
+
| Capability | Status | Primary API |
|
|
59
|
+
| --- | --- | --- |
|
|
60
|
+
| Documents, paragraphs, tables, styles, sections, headers, and footers | Stable | `Document()` and document object APIs |
|
|
61
|
+
| Custom document properties | Stable | `document.custom_properties` |
|
|
62
|
+
| Custom XML lifecycle | Stable | `add_custom_xml_part()`, `delete_custom_xml_part()` |
|
|
63
|
+
| SVG and EMF images | Stable | `add_picture()` |
|
|
64
|
+
| Inline and floating pictures | Stable | `add_picture()`, `add_float_picture()` |
|
|
65
|
+
| Latin and East Asian font controls | Stable | `run.font.name`, `run.font.hAnsi`, `run.font.eastAsia` |
|
|
66
|
+
| Low-level OPC parts and relationships | Stable | `document.part.package`, `part.rels` |
|
|
67
|
+
| In-memory read, export, and independent copies | Stable | `Document()`, `to_bytes()`, `copy()` |
|
|
68
|
+
| Package inspection, diff, and sanitization | Planned | — |
|
|
68
69
|
|
|
69
70
|
## Installation
|
|
70
71
|
|
|
@@ -170,6 +171,8 @@ available through `Document.add_float_picture()` and `Run.add_float_picture()`.
|
|
|
170
171
|
- [API reference](docs/index.rst#api-documentation)
|
|
171
172
|
- [Custom properties](docs/user/custom-properties.rst)
|
|
172
173
|
- [Custom XML](docs/user/custom-xml.rst)
|
|
174
|
+
- [python-docx compatibility](docs/user/compatibility.rst)
|
|
175
|
+
- [Upstream maintenance](docs/dev/upstream-maintenance.rst)
|
|
173
176
|
- [Release history](HISTORY.md)
|
|
174
177
|
|
|
175
178
|
## Quality and Testing
|
|
@@ -24,18 +24,19 @@ Use it when an application needs more than basic paragraphs and tables: custom d
|
|
|
24
24
|
metadata, application-owned XML, vector images, floating pictures, East Asian fonts,
|
|
25
25
|
or low-level package and relationship access.
|
|
26
26
|
|
|
27
|
-
##
|
|
28
|
-
|
|
29
|
-
| Capability |
|
|
30
|
-
| --- | --- |
|
|
31
|
-
| Documents, paragraphs,
|
|
32
|
-
| Custom document properties |
|
|
33
|
-
| Custom XML
|
|
34
|
-
| SVG and EMF images |
|
|
35
|
-
| Inline and floating pictures |
|
|
36
|
-
|
|
|
37
|
-
| Low-level OPC parts and relationships |
|
|
38
|
-
|
|
|
27
|
+
## Capability Matrix
|
|
28
|
+
|
|
29
|
+
| Capability | Status | Primary API |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| Documents, paragraphs, tables, styles, sections, headers, and footers | Stable | `Document()` and document object APIs |
|
|
32
|
+
| Custom document properties | Stable | `document.custom_properties` |
|
|
33
|
+
| Custom XML lifecycle | Stable | `add_custom_xml_part()`, `delete_custom_xml_part()` |
|
|
34
|
+
| SVG and EMF images | Stable | `add_picture()` |
|
|
35
|
+
| Inline and floating pictures | Stable | `add_picture()`, `add_float_picture()` |
|
|
36
|
+
| Latin and East Asian font controls | Stable | `run.font.name`, `run.font.hAnsi`, `run.font.eastAsia` |
|
|
37
|
+
| Low-level OPC parts and relationships | Stable | `document.part.package`, `part.rels` |
|
|
38
|
+
| In-memory read, export, and independent copies | Stable | `Document()`, `to_bytes()`, `copy()` |
|
|
39
|
+
| Package inspection, diff, and sanitization | Planned | — |
|
|
39
40
|
|
|
40
41
|
## Installation
|
|
41
42
|
|
|
@@ -141,6 +142,8 @@ available through `Document.add_float_picture()` and `Run.add_float_picture()`.
|
|
|
141
142
|
- [API reference](docs/index.rst#api-documentation)
|
|
142
143
|
- [Custom properties](docs/user/custom-properties.rst)
|
|
143
144
|
- [Custom XML](docs/user/custom-xml.rst)
|
|
145
|
+
- [python-docx compatibility](docs/user/compatibility.rst)
|
|
146
|
+
- [Upstream maintenance](docs/dev/upstream-maintenance.rst)
|
|
144
147
|
- [Release history](HISTORY.md)
|
|
145
148
|
|
|
146
149
|
## Quality and Testing
|
|
Binary file
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
Upstream maintenance
|
|
2
|
+
====================
|
|
3
|
+
|
|
4
|
+
``python-docx-oss`` evolves as an independent DOCX SDK. Its source, tests,
|
|
5
|
+
versioning, and releases are authoritative in this repository. The official
|
|
6
|
+
`python-docx repository <https://github.com/python-openxml/python-docx>`_ is an
|
|
7
|
+
upstream source of compatible APIs, bug fixes, and OPC/WordprocessingML
|
|
8
|
+
improvements; it is not the development repository for ``python-docx-oss``.
|
|
9
|
+
|
|
10
|
+
Upstream baseline
|
|
11
|
+
-----------------
|
|
12
|
+
|
|
13
|
+
The current upstream baseline is ``python-docx v1.2.0`` at commit
|
|
14
|
+
``e45454602b53e8e572b179ccf1c91093ec9f4ed7``.
|
|
15
|
+
|
|
16
|
+
This baseline identifies the last official release whose changes have been
|
|
17
|
+
evaluated as a whole. It does not imply compatibility with every private or
|
|
18
|
+
internal upstream API.
|
|
19
|
+
|
|
20
|
+
No local repository layout is required. A maintainer may obtain upstream source
|
|
21
|
+
using a temporary clone, a read-only Git remote, a release archive, or another
|
|
22
|
+
equivalent method. Maintenance instructions and project documentation must not
|
|
23
|
+
depend on sibling directories, personal filesystem paths, or local-only
|
|
24
|
+
branches.
|
|
25
|
+
|
|
26
|
+
When to evaluate upstream
|
|
27
|
+
-------------------------
|
|
28
|
+
|
|
29
|
+
Evaluate upstream changes when:
|
|
30
|
+
|
|
31
|
+
* ``python-docx`` publishes a release;
|
|
32
|
+
* upstream fixes a security, data-loss, or document-compatibility issue;
|
|
33
|
+
* a supported downstream workflow needs a new standard API; or
|
|
34
|
+
* an upcoming ``python-docx-oss`` release needs a baseline refresh.
|
|
35
|
+
|
|
36
|
+
Continuous synchronization with individual upstream commits is not required.
|
|
37
|
+
|
|
38
|
+
Integration workflow
|
|
39
|
+
--------------------
|
|
40
|
+
|
|
41
|
+
#. Obtain the target upstream tag or commit and compare it with the recorded
|
|
42
|
+
baseline.
|
|
43
|
+
#. Review release notes and classify changes to public APIs, OPC packaging,
|
|
44
|
+
XML handling, templates, schemas, tests, and documentation.
|
|
45
|
+
#. Create a dedicated branch in ``python-docx-oss`` for the integration. The
|
|
46
|
+
branch name and the location used to obtain upstream source are not part of
|
|
47
|
+
the public maintenance contract.
|
|
48
|
+
#. Integrate the relevant changes as a reviewable change set. Preserve upstream
|
|
49
|
+
history when practical, but prefer a clear, auditable result over a blind
|
|
50
|
+
merge.
|
|
51
|
+
#. Resolve conflicts according to the compatibility rules below.
|
|
52
|
+
#. Run the full verification gates and review the package artifacts.
|
|
53
|
+
#. Update this baseline, compatibility notes, and ``HISTORY.md`` in the same
|
|
54
|
+
integration change.
|
|
55
|
+
|
|
56
|
+
Compatibility and conflict rules
|
|
57
|
+
--------------------------------
|
|
58
|
+
|
|
59
|
+
Standard public ``python-docx`` behavior is preferred unless adopting it would
|
|
60
|
+
break an API intentionally supported by ``python-docx-oss``. An upstream
|
|
61
|
+
integration must preserve the supported capabilities documented in the
|
|
62
|
+
Capability Matrix and covered by the regression test suite.
|
|
63
|
+
|
|
64
|
+
Compatibility with upstream private APIs is not guaranteed. Intentional public
|
|
65
|
+
API differences must be recorded in compatibility or divergence notes rather
|
|
66
|
+
than hidden in conflict-resolution commits.
|
|
67
|
+
|
|
68
|
+
Verification gates
|
|
69
|
+
------------------
|
|
70
|
+
|
|
71
|
+
An upstream integration is complete only when the repository CI passes. This
|
|
72
|
+
includes:
|
|
73
|
+
|
|
74
|
+
* unit, integration, and acceptance tests on all supported Python versions;
|
|
75
|
+
* lint, formatting, and scoped type checks;
|
|
76
|
+
* documentation and distribution builds; and
|
|
77
|
+
* real-DOCX round trips required by the Capability Matrix and regression test
|
|
78
|
+
suite.
|
|
79
|
+
|
|
80
|
+
The resulting wheel and source distribution must contain the expected package
|
|
81
|
+
data and install without also installing the official ``python-docx``
|
|
82
|
+
distribution, because both projects provide the ``docx`` import namespace.
|
|
83
|
+
|
|
84
|
+
Recording the result
|
|
85
|
+
--------------------
|
|
86
|
+
|
|
87
|
+
For each completed baseline refresh, record:
|
|
88
|
+
|
|
89
|
+
* the upstream tag and resolved commit;
|
|
90
|
+
* the material APIs and fixes adopted;
|
|
91
|
+
* intentionally omitted upstream changes and their rationale; and
|
|
92
|
+
* any new compatibility boundary visible to users.
|
|
93
|
+
|
|
94
|
+
Temporary comparison checkouts, remotes, and branches are local implementation
|
|
95
|
+
details and are not part of the permanent project record.
|
|
@@ -97,6 +97,7 @@ User Guide
|
|
|
97
97
|
user/shapes
|
|
98
98
|
user/custom-properties
|
|
99
99
|
user/custom-xml
|
|
100
|
+
user/compatibility
|
|
100
101
|
|
|
101
102
|
|
|
102
103
|
API Documentation
|
|
@@ -117,11 +118,11 @@ API Documentation
|
|
|
117
118
|
api/shared
|
|
118
119
|
api/enum/index
|
|
119
120
|
|
|
120
|
-
|
|
121
121
|
Contributor Guide
|
|
122
122
|
-----------------
|
|
123
123
|
|
|
124
124
|
.. toctree::
|
|
125
125
|
:maxdepth: 1
|
|
126
126
|
|
|
127
|
+
dev/upstream-maintenance
|
|
127
128
|
dev/analysis/index
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
python-docx compatibility
|
|
2
|
+
=========================
|
|
3
|
+
|
|
4
|
+
``python-docx-oss`` and the official ``python-docx`` project share the
|
|
5
|
+
``docx`` import namespace and a common code lineage. They are separate Python
|
|
6
|
+
distributions with independent versions and release schedules.
|
|
7
|
+
|
|
8
|
+
Compatibility target
|
|
9
|
+
--------------------
|
|
10
|
+
|
|
11
|
+
The current upstream baseline is ``python-docx v1.2.0`` at commit
|
|
12
|
+
``e45454602b53e8e572b179ccf1c91093ec9f4ed7``.
|
|
13
|
+
|
|
14
|
+
Public APIs inherited from that baseline are compatibility targets unless an
|
|
15
|
+
intentional difference is documented. Compatibility with private modules,
|
|
16
|
+
private attributes, undocumented XML internals, or implementation details is
|
|
17
|
+
not guaranteed.
|
|
18
|
+
|
|
19
|
+
Extensions provided by ``python-docx-oss`` are additive where practical. The
|
|
20
|
+
project's current supported and planned features are maintained in the
|
|
21
|
+
Capability Matrix rather than duplicated here.
|
|
22
|
+
|
|
23
|
+
Distribution boundary
|
|
24
|
+
---------------------
|
|
25
|
+
|
|
26
|
+
Do not install ``python-docx`` and ``python-docx-oss`` into the same Python
|
|
27
|
+
environment. Both distributions provide the ``docx`` package, so installing
|
|
28
|
+
both can produce an environment whose imported files depend on installation
|
|
29
|
+
order.
|
|
30
|
+
|
|
31
|
+
Applications should declare exactly one of the two distributions as a direct
|
|
32
|
+
dependency. Migrating an existing application normally does not require import
|
|
33
|
+
changes, but its use of undocumented upstream internals must be reviewed.
|
|
34
|
+
|
|
35
|
+
Intentional differences
|
|
36
|
+
-----------------------
|
|
37
|
+
|
|
38
|
+
An intentional difference is recorded when ``python-docx-oss`` changes a
|
|
39
|
+
public inherited API or its observable behavior. Each record must identify:
|
|
40
|
+
|
|
41
|
+
* the affected public API;
|
|
42
|
+
* the behavior of the recorded upstream baseline;
|
|
43
|
+
* the ``python-docx-oss`` behavior and rationale; and
|
|
44
|
+
* any migration action required by callers.
|
|
45
|
+
|
|
46
|
+
Additive APIs and capabilities do not require individual divergence records;
|
|
47
|
+
they belong in the API documentation and Capability Matrix. Upstream baseline
|
|
48
|
+
changes follow the :doc:`../dev/upstream-maintenance` policy.
|
|
@@ -89,7 +89,15 @@ Delete a child by passing the element itself::
|
|
|
89
89
|
customers.delete_item(customer)
|
|
90
90
|
|
|
91
91
|
The indexes in ``items`` can change after deletion. Removing an entire Custom
|
|
92
|
-
XML part
|
|
92
|
+
XML part uses the main document part::
|
|
93
|
+
|
|
94
|
+
document.part.delete_custom_xml_part(customers)
|
|
95
|
+
|
|
96
|
+
The Custom XML part, its relationship from the main document, and any related
|
|
97
|
+
``itemPropsN.xml`` property part are omitted the next time the document is
|
|
98
|
+
saved. The deleted ``itemN.xml`` name becomes available for later additions.
|
|
99
|
+
Attempting to delete a part that is not related to the document, including a
|
|
100
|
+
part that has already been deleted, raises ``ValueError``.
|
|
93
101
|
|
|
94
102
|
Existing relationships to Custom XML property parts, such as
|
|
95
103
|
``itemPropsN.xml``, are preserved during load/save round trips.
|
|
@@ -67,13 +67,18 @@ Opening a file-like document
|
|
|
67
67
|
|docx| can open a document from a so-called *file-like* object. It can also
|
|
68
68
|
save to a file-like object. This can be handy when you want to get the source
|
|
69
69
|
or target document over a network connection or from a database and don't want
|
|
70
|
-
to (or aren't allowed to) interact with the file system.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
from io import BytesIO
|
|
70
|
+
to (or aren't allowed to) interact with the file system. Raw DOCX bytes can be
|
|
71
|
+
opened directly::
|
|
74
72
|
|
|
75
73
|
from docx import Document
|
|
76
74
|
|
|
75
|
+
with open("foobar.docx", "rb") as file:
|
|
76
|
+
document = Document(file.read())
|
|
77
|
+
|
|
78
|
+
A binary file-like object such as :class:`io.BytesIO` is also supported::
|
|
79
|
+
|
|
80
|
+
from io import BytesIO
|
|
81
|
+
|
|
77
82
|
with open("foobar.docx", "rb") as file:
|
|
78
83
|
source_stream = BytesIO(file.read())
|
|
79
84
|
document = Document(source_stream)
|
|
@@ -92,5 +97,23 @@ After saving, rewind the output stream before reading it or opening it again::
|
|
|
92
97
|
Always open ``.docx`` files in binary mode (``"rb"`` for reading and ``"wb"``
|
|
93
98
|
for writing).
|
|
94
99
|
|
|
100
|
+
Exporting and copying in memory
|
|
101
|
+
-------------------------------
|
|
102
|
+
|
|
103
|
+
Use :meth:`Document.to_bytes <docx.document.Document.to_bytes>` when the complete
|
|
104
|
+
DOCX package needs to be uploaded, cached, returned over HTTP, or stored in a
|
|
105
|
+
database::
|
|
106
|
+
|
|
107
|
+
content = document.to_bytes()
|
|
108
|
+
|
|
109
|
+
Use :meth:`Document.copy <docx.document.Document.copy>` to create an independent
|
|
110
|
+
snapshot that can be modified without changing the source document::
|
|
111
|
+
|
|
112
|
+
customer_document = document.copy()
|
|
113
|
+
customer_document.add_paragraph("Customer-specific content")
|
|
114
|
+
|
|
115
|
+
The copy has its own XML trees, parts, and relationships. Both operations stay
|
|
116
|
+
in memory and do not create temporary files.
|
|
117
|
+
|
|
95
118
|
Okay, so you've got a document open and are pretty sure you can save it
|
|
96
119
|
somewhere later. Next step is to get some content in there ...
|
|
@@ -5,6 +5,7 @@ Provides a syntactically more convenient API for interacting with the OpcPackage
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
+
import io
|
|
8
9
|
import os
|
|
9
10
|
from typing import IO, TYPE_CHECKING, cast
|
|
10
11
|
|
|
@@ -16,18 +17,20 @@ if TYPE_CHECKING:
|
|
|
16
17
|
from docx.parts.document import DocumentPart
|
|
17
18
|
|
|
18
19
|
|
|
19
|
-
def Document(docx: str | IO[bytes] | None = None) -> DocumentObject:
|
|
20
|
+
def Document(docx: str | bytes | IO[bytes] | None = None) -> DocumentObject:
|
|
20
21
|
"""Return a |Document| object loaded from `docx`, where `docx` can be either a path
|
|
21
|
-
to a ``.docx`` file
|
|
22
|
+
to a ``.docx`` file, raw DOCX bytes, or a binary file-like object.
|
|
22
23
|
|
|
23
24
|
If `docx` is missing or ``None``, the built-in default document "template" is
|
|
24
25
|
loaded.
|
|
25
26
|
"""
|
|
26
27
|
docx = _default_docx_path() if docx is None else docx
|
|
28
|
+
source_name = "<bytes>" if isinstance(docx, bytes) else docx
|
|
29
|
+
docx = io.BytesIO(docx) if isinstance(docx, bytes) else docx
|
|
27
30
|
document_part = cast("DocumentPart", Package.open(docx).main_document_part)
|
|
28
31
|
if document_part.content_type != CT.WML_DOCUMENT_MAIN:
|
|
29
32
|
tmpl = "file '%s' is not a Word file, content type is '%s'"
|
|
30
|
-
raise ValueError(tmpl % (
|
|
33
|
+
raise ValueError(tmpl % (source_name, document_part.content_type))
|
|
31
34
|
return document_part.document
|
|
32
35
|
|
|
33
36
|
|
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
+
import io
|
|
8
9
|
from typing import IO, TYPE_CHECKING, Iterator, List, Sequence
|
|
9
10
|
|
|
11
|
+
from docx.api import Document as open_document
|
|
10
12
|
from docx.blkcntnr import BlockItemContainer
|
|
11
13
|
from docx.enum.section import WD_SECTION
|
|
12
14
|
from docx.enum.text import WD_BREAK
|
|
@@ -182,6 +184,10 @@ class Document(ElementProxy):
|
|
|
182
184
|
"""A |CoreProperties| object providing Dublin Core properties of document."""
|
|
183
185
|
return self._part.core_properties
|
|
184
186
|
|
|
187
|
+
def copy(self) -> Document:
|
|
188
|
+
"""Return an independent in-memory snapshot of this document."""
|
|
189
|
+
return open_document(io.BytesIO(self.to_bytes()))
|
|
190
|
+
|
|
185
191
|
@property
|
|
186
192
|
def custom_properties(self) -> CustomProperties:
|
|
187
193
|
"""A |CustomProperties| object providing custom properties of document."""
|
|
@@ -249,6 +255,12 @@ class Document(ElementProxy):
|
|
|
249
255
|
"""
|
|
250
256
|
return self._body.tables
|
|
251
257
|
|
|
258
|
+
def to_bytes(self) -> bytes:
|
|
259
|
+
"""Serialize this document as a complete in-memory DOCX package."""
|
|
260
|
+
with io.BytesIO() as stream:
|
|
261
|
+
self.save(stream)
|
|
262
|
+
return stream.getvalue()
|
|
263
|
+
|
|
252
264
|
@property
|
|
253
265
|
def _block_width(self) -> Length:
|
|
254
266
|
"""A |Length| object specifying the space between margins in last section."""
|
|
@@ -13,7 +13,7 @@ class Emf(BaseImageHeader):
|
|
|
13
13
|
@property
|
|
14
14
|
def content_type(self):
|
|
15
15
|
"""
|
|
16
|
-
MIME content type for this image, unconditionally `image/emf` for
|
|
16
|
+
MIME content type for this image, unconditionally `image/x-emf` for
|
|
17
17
|
EMF images.
|
|
18
18
|
"""
|
|
19
19
|
return MIME_TYPE.EMF
|
|
@@ -38,7 +38,6 @@ class Emf(BaseImageHeader):
|
|
|
38
38
|
y1 = stream_rdr.read_long(20)
|
|
39
39
|
|
|
40
40
|
frame = tuple(map(stream_rdr.read_long, (24, 28, 32, 36)))
|
|
41
|
-
size = x1 - x0, y1 - y0
|
|
42
41
|
|
|
43
42
|
xdpi = 2540.0 * (x1 - x0) / (frame[2] - frame[0])
|
|
44
43
|
ydpi = 2540.0 * (y1 - y0) / (frame[3] - frame[1])
|
|
@@ -28,6 +28,11 @@ class Relationships(Dict[str, "_Relationship"]):
|
|
|
28
28
|
self._target_parts_by_rId[rId] = target
|
|
29
29
|
return rel
|
|
30
30
|
|
|
31
|
+
def __delitem__(self, rId: str) -> None:
|
|
32
|
+
"""Remove the relationship and its cached target-part reference."""
|
|
33
|
+
super().__delitem__(rId)
|
|
34
|
+
self._target_parts_by_rId.pop(rId, None)
|
|
35
|
+
|
|
31
36
|
def get_or_add(self, reltype: str, target_part: Part) -> _Relationship:
|
|
32
37
|
"""Return relationship of `reltype` to `target_part`, newly added if not already
|
|
33
38
|
present in collection."""
|
|
@@ -54,6 +54,24 @@ class DocumentPart(StoryPart):
|
|
|
54
54
|
rId = self.relate_to(header_part, RT.HEADER)
|
|
55
55
|
return header_part, rId
|
|
56
56
|
|
|
57
|
+
def delete_custom_xml_part(self, part: CustomXmlPart) -> None:
|
|
58
|
+
"""Delete a Custom XML part related to this document.
|
|
59
|
+
|
|
60
|
+
Related Custom XML property parts are detached with the part and omitted from
|
|
61
|
+
the package when it is next saved.
|
|
62
|
+
"""
|
|
63
|
+
matching_rIds = [
|
|
64
|
+
rId
|
|
65
|
+
for rId, rel in self.rels.items()
|
|
66
|
+
if rel.reltype == RT.CUSTOM_XML and not rel.is_external and rel.target_part is part
|
|
67
|
+
]
|
|
68
|
+
if not matching_rIds:
|
|
69
|
+
raise ValueError(f"part '{part.partname}' is not related to this document")
|
|
70
|
+
|
|
71
|
+
part.drop_rels(lambda rel: rel.reltype == RT.CUSTOM_XML_PROPS)
|
|
72
|
+
for rId in matching_rIds:
|
|
73
|
+
del self.rels[rId]
|
|
74
|
+
|
|
57
75
|
@property
|
|
58
76
|
def comments(self) -> Comments:
|
|
59
77
|
"""|Comments| object providing access to the comments added to this document."""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-docx-oss
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Create, read, and update Microsoft Word .docx files.
|
|
5
5
|
Author: Ethan St Lee
|
|
6
6
|
License-Expression: MIT
|
|
@@ -53,18 +53,19 @@ Use it when an application needs more than basic paragraphs and tables: custom d
|
|
|
53
53
|
metadata, application-owned XML, vector images, floating pictures, East Asian fonts,
|
|
54
54
|
or low-level package and relationship access.
|
|
55
55
|
|
|
56
|
-
##
|
|
56
|
+
## Capability Matrix
|
|
57
57
|
|
|
58
|
-
| Capability |
|
|
59
|
-
| --- | --- |
|
|
60
|
-
| Documents, paragraphs,
|
|
61
|
-
| Custom document properties |
|
|
62
|
-
| Custom XML
|
|
63
|
-
| SVG and EMF images |
|
|
64
|
-
| Inline and floating pictures |
|
|
65
|
-
|
|
|
66
|
-
| Low-level OPC parts and relationships |
|
|
67
|
-
|
|
|
58
|
+
| Capability | Status | Primary API |
|
|
59
|
+
| --- | --- | --- |
|
|
60
|
+
| Documents, paragraphs, tables, styles, sections, headers, and footers | Stable | `Document()` and document object APIs |
|
|
61
|
+
| Custom document properties | Stable | `document.custom_properties` |
|
|
62
|
+
| Custom XML lifecycle | Stable | `add_custom_xml_part()`, `delete_custom_xml_part()` |
|
|
63
|
+
| SVG and EMF images | Stable | `add_picture()` |
|
|
64
|
+
| Inline and floating pictures | Stable | `add_picture()`, `add_float_picture()` |
|
|
65
|
+
| Latin and East Asian font controls | Stable | `run.font.name`, `run.font.hAnsi`, `run.font.eastAsia` |
|
|
66
|
+
| Low-level OPC parts and relationships | Stable | `document.part.package`, `part.rels` |
|
|
67
|
+
| In-memory read, export, and independent copies | Stable | `Document()`, `to_bytes()`, `copy()` |
|
|
68
|
+
| Package inspection, diff, and sanitization | Planned | — |
|
|
68
69
|
|
|
69
70
|
## Installation
|
|
70
71
|
|
|
@@ -170,6 +171,8 @@ available through `Document.add_float_picture()` and `Run.add_float_picture()`.
|
|
|
170
171
|
- [API reference](docs/index.rst#api-documentation)
|
|
171
172
|
- [Custom properties](docs/user/custom-properties.rst)
|
|
172
173
|
- [Custom XML](docs/user/custom-xml.rst)
|
|
174
|
+
- [python-docx compatibility](docs/user/compatibility.rst)
|
|
175
|
+
- [Upstream maintenance](docs/dev/upstream-maintenance.rst)
|
|
173
176
|
- [Release history](HISTORY.md)
|
|
174
177
|
|
|
175
178
|
## Quality and Testing
|
|
@@ -53,6 +53,7 @@ docs/api/enum/WdTabLeader.rst
|
|
|
53
53
|
docs/api/enum/WdTableDirection.rst
|
|
54
54
|
docs/api/enum/WdUnderline.rst
|
|
55
55
|
docs/api/enum/index.rst
|
|
56
|
+
docs/dev/upstream-maintenance.rst
|
|
56
57
|
docs/dev/analysis/index.rst
|
|
57
58
|
docs/dev/analysis/features/comments.rst
|
|
58
59
|
docs/dev/analysis/features/coreprops.rst
|
|
@@ -90,6 +91,7 @@ docs/dev/analysis/schema/ct_document.rst
|
|
|
90
91
|
docs/dev/analysis/schema/ct_p.rst
|
|
91
92
|
docs/user/api-concepts.rst
|
|
92
93
|
docs/user/comments.rst
|
|
94
|
+
docs/user/compatibility.rst
|
|
93
95
|
docs/user/custom-properties.rst
|
|
94
96
|
docs/user/custom-xml.rst
|
|
95
97
|
docs/user/documents.rst
|
|
@@ -88,3 +88,33 @@ class DescribeMultipleCustomXmlParts:
|
|
|
88
88
|
|
|
89
89
|
with pytest.raises(ValueError, match="part already exists at '/customXml/item1.xml'"):
|
|
90
90
|
document.part.add_custom_xml_part("<duplicate/>", file_name="item1")
|
|
91
|
+
|
|
92
|
+
def it_round_trips_deleting_a_part_and_reuses_its_partname(self):
|
|
93
|
+
document = Document(io.BytesIO(FIXTURE.read_bytes()))
|
|
94
|
+
customers = _parts_by_name(document)["/customXml/item1.xml"]
|
|
95
|
+
|
|
96
|
+
document.part.delete_custom_xml_part(customers)
|
|
97
|
+
replacement = document.part.add_custom_xml_part(f'<audit xmlns="{AUDIT_NS}"/>')
|
|
98
|
+
assert str(replacement.partname) == "/customXml/item1.xml"
|
|
99
|
+
|
|
100
|
+
output = io.BytesIO()
|
|
101
|
+
document.save(output)
|
|
102
|
+
reopened = Document(io.BytesIO(output.getvalue()))
|
|
103
|
+
reopened_parts = _parts_by_name(reopened)
|
|
104
|
+
|
|
105
|
+
assert set(reopened_parts) == {"/customXml/item1.xml", "/customXml/item3.xml"}
|
|
106
|
+
assert reopened_parts["/customXml/item1.xml"].tag == f"{{{AUDIT_NS}}}audit"
|
|
107
|
+
with ZipFile(io.BytesIO(output.getvalue())) as package:
|
|
108
|
+
names = set(package.namelist())
|
|
109
|
+
assert "customXml/itemProps1.xml" not in names
|
|
110
|
+
assert "customXml/_rels/item1.xml.rels" not in names
|
|
111
|
+
assert "customXml/itemProps3.xml" in names
|
|
112
|
+
assert "customXml/_rels/item3.xml.rels" in names
|
|
113
|
+
|
|
114
|
+
def it_rejects_deleting_a_part_twice(self):
|
|
115
|
+
document = Document(io.BytesIO(FIXTURE.read_bytes()))
|
|
116
|
+
customers = _parts_by_name(document)["/customXml/item1.xml"]
|
|
117
|
+
document.part.delete_custom_xml_part(customers)
|
|
118
|
+
|
|
119
|
+
with pytest.raises(ValueError, match="is not related to this document"):
|
|
120
|
+
document.part.delete_custom_xml_part(customers)
|