Skip to content

Commit 595decc

Browse files
committed
comments: package-loader loads CommentsPart
CommentsPart is loaded as XML-part on document deserialization.
1 parent 9c8a2e9 commit 595decc

File tree

4 files changed

+33
-3
lines changed

4 files changed

+33
-3
lines changed

features/doc-comments.feature

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ Feature: Document.comments
55
And I need methods allowing access to the comments in the collection
66

77

8-
@wip
98
Scenario Outline: Access document comments
109
Given a document having <a-or-no> comments part
1110
Then document.comments is a Comments object

src/docx/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from docx.opc.constants import RELATIONSHIP_TYPE as RT
2626
from docx.opc.part import PartFactory
2727
from docx.opc.parts.coreprops import CorePropertiesPart
28+
from docx.parts.comments import CommentsPart
2829
from docx.parts.document import DocumentPart
2930
from docx.parts.hdrftr import FooterPart, HeaderPart
3031
from docx.parts.image import ImagePart
@@ -41,6 +42,7 @@ def part_class_selector(content_type: str, reltype: str) -> Type[Part] | None:
4142

4243
PartFactory.part_class_selector = part_class_selector
4344
PartFactory.part_type_for[CT.OPC_CORE_PROPERTIES] = CorePropertiesPart
45+
PartFactory.part_type_for[CT.WML_COMMENTS] = CommentsPart
4446
PartFactory.part_type_for[CT.WML_DOCUMENT_MAIN] = DocumentPart
4547
PartFactory.part_type_for[CT.WML_FOOTER] = FooterPart
4648
PartFactory.part_type_for[CT.WML_HEADER] = HeaderPart
@@ -51,6 +53,7 @@ def part_class_selector(content_type: str, reltype: str) -> Type[Part] | None:
5153
del (
5254
CT,
5355
CorePropertiesPart,
56+
CommentsPart,
5457
DocumentPart,
5558
FooterPart,
5659
HeaderPart,

src/docx/parts/comments.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from __future__ import annotations
44

55
import os
6-
from typing import cast
6+
from typing import TYPE_CHECKING, cast
77

88
from typing_extensions import Self
99

@@ -15,6 +15,10 @@
1515
from docx.package import Package
1616
from docx.parts.story import StoryPart
1717

18+
if TYPE_CHECKING:
19+
from docx.oxml.comments import CT_Comments
20+
from docx.package import Package
21+
1822

1923
class CommentsPart(StoryPart):
2024
"""Container part for comments added to the document."""

tests/parts/test_comments.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,34 @@
88

99
from docx.comments import Comments
1010
from docx.opc.constants import CONTENT_TYPE as CT
11+
from docx.opc.constants import RELATIONSHIP_TYPE as RT
1112
from docx.opc.packuri import PackURI
13+
from docx.opc.part import PartFactory
1214
from docx.oxml.comments import CT_Comments
1315
from docx.package import Package
1416
from docx.parts.comments import CommentsPart
1517

1618
from ..unitutil.cxml import element
17-
from ..unitutil.mock import FixtureRequest, Mock, class_mock, instance_mock
19+
from ..unitutil.mock import FixtureRequest, Mock, class_mock, instance_mock, method_mock
1820

1921

2022
class DescribeCommentsPart:
2123
"""Unit test suite for `docx.parts.comments.CommentsPart` objects."""
2224

25+
def it_is_used_by_the_part_loader_to_construct_a_comments_part(
26+
self, package_: Mock, CommentsPart_load_: Mock, comments_part_: Mock
27+
):
28+
partname = PackURI("/word/comments.xml")
29+
content_type = CT.WML_COMMENTS
30+
reltype = RT.COMMENTS
31+
blob = b"<w:comments/>"
32+
CommentsPart_load_.return_value = comments_part_
33+
34+
part = PartFactory(partname, content_type, reltype, blob, package_)
35+
36+
CommentsPart_load_.assert_called_once_with(partname, content_type, blob, package_)
37+
assert part is comments_part_
38+
2339
def it_provides_access_to_its_comments_collection(
2440
self, Comments_: Mock, comments_: Mock, package_: Mock
2541
):
@@ -58,6 +74,14 @@ def Comments_(self, request: FixtureRequest) -> Mock:
5874
def comments_(self, request: FixtureRequest) -> Mock:
5975
return instance_mock(request, Comments)
6076

77+
@pytest.fixture
78+
def comments_part_(self, request: FixtureRequest) -> Mock:
79+
return instance_mock(request, CommentsPart)
80+
81+
@pytest.fixture
82+
def CommentsPart_load_(self, request: FixtureRequest) -> Mock:
83+
return method_mock(request, CommentsPart, "load", autospec=False)
84+
6185
@pytest.fixture
6286
def package_(self, request: FixtureRequest) -> Mock:
6387
return instance_mock(request, Package)

0 commit comments

Comments
 (0)