Skip to content

Commit f86ea28

Browse files
Merge pull request #241 from adamtheturtle/move-serializer
Some tidying of the builder helpers
2 parents bc8abde + ddb524d commit f86ea28

File tree

2 files changed

+61
-32
lines changed

2 files changed

+61
-32
lines changed

src/sphinx_notion/__init__.py

Lines changed: 59 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from ultimate_notion import Emoji
3030
from ultimate_notion.blocks import PDF as UnoPDF # noqa: N811
3131
from ultimate_notion.blocks import Audio as UnoAudio
32-
from ultimate_notion.blocks import Block, ChildrenMixin
32+
from ultimate_notion.blocks import Block, ParentBlock
3333
from ultimate_notion.blocks import BulletedItem as UnoBulletedItem
3434
from ultimate_notion.blocks import Callout as UnoCallout
3535
from ultimate_notion.blocks import Code as UnoCode
@@ -67,13 +67,35 @@
6767
from _typeshed import Incomplete
6868

6969

70-
class PdfNode(nodes.Element):
70+
@beartype
71+
def _serialize_block_with_children(
72+
*,
73+
block: Block,
74+
) -> dict[str, Any]:
75+
"""
76+
Convert the block tree to a JSON-serializable format, ignoring IDs from
77+
tuples.
78+
"""
79+
serialized_obj = block.obj_ref.serialize_for_api()
80+
if isinstance(block, ParentBlock) and block.children:
81+
serialized_obj[block.obj_ref.type]["children"] = [
82+
_serialize_block_with_children(
83+
block=child,
84+
)
85+
for child in block.children
86+
]
87+
return serialized_obj
88+
89+
90+
@beartype
91+
class _PdfNode(nodes.Element):
7192
"""
7293
Custom PDF node for Notion PDF blocks.
7394
"""
7495

7596

76-
class NotionPdfIncludeDirective(Directive):
97+
@beartype
98+
class _NotionPdfIncludeDirective(Directive):
7799
"""
78100
PDF include directive that creates Notion PDF blocks.
79101
"""
@@ -89,12 +111,12 @@ class NotionPdfIncludeDirective(Directive):
89111
"toolbar": directives.nonnegative_int,
90112
}
91113

92-
def run(self) -> list[PdfNode]:
114+
def run(self) -> list[_PdfNode]:
93115
"""
94116
Create a Notion PDF block.
95117
"""
96118
(pdf_file,) = self.arguments
97-
node = PdfNode()
119+
node = _PdfNode()
98120
node.attributes["uri"] = pdf_file
99121
return [node]
100122

@@ -423,6 +445,7 @@ def _process_node_to_blocks(
423445
raise NotImplementedError(node)
424446

425447

448+
@beartype
426449
@_process_node_to_blocks.register
427450
def _(
428451
node: nodes.table,
@@ -493,6 +516,7 @@ def _(
493516
return [table]
494517

495518

519+
@beartype
496520
@_process_node_to_blocks.register
497521
def _(
498522
node: nodes.paragraph,
@@ -507,6 +531,7 @@ def _(
507531
return [UnoParagraph(text=rich_text)]
508532

509533

534+
@beartype
510535
@_process_node_to_blocks.register
511536
def _(
512537
node: nodes.block_quote,
@@ -521,6 +546,7 @@ def _(
521546
return [UnoQuote(text=rich_text)]
522547

523548

549+
@beartype
524550
@_process_node_to_blocks.register
525551
def _(
526552
node: nodes.literal_block,
@@ -539,6 +565,7 @@ def _(
539565
return [UnoCode(text=code_text, language=language)]
540566

541567

568+
@beartype
542569
@_process_node_to_blocks.register
543570
def _(
544571
node: nodes.bullet_list,
@@ -560,6 +587,7 @@ def _(
560587
return result
561588

562589

590+
@beartype
563591
@_process_node_to_blocks.register
564592
def _(
565593
node: nodes.enumerated_list,
@@ -586,6 +614,7 @@ def _(
586614
return result
587615

588616

617+
@beartype
589618
@_process_node_to_blocks.register
590619
def _(
591620
node: nodes.topic,
@@ -602,6 +631,7 @@ def _(
602631
return [UnoTableOfContents()]
603632

604633

634+
@beartype
605635
@_process_node_to_blocks.register
606636
def _(
607637
node: nodes.compound,
@@ -619,6 +649,7 @@ def _(
619649
return []
620650

621651

652+
@beartype
622653
@_process_node_to_blocks.register
623654
def _(
624655
node: nodes.title,
@@ -688,6 +719,7 @@ def _create_admonition_callout(
688719
return [block]
689720

690721

722+
@beartype
691723
@_process_node_to_blocks.register
692724
def _(
693725
node: nodes.note,
@@ -705,6 +737,7 @@ def _(
705737
)
706738

707739

740+
@beartype
708741
@_process_node_to_blocks.register
709742
def _(
710743
node: nodes.warning,
@@ -722,6 +755,7 @@ def _(
722755
)
723756

724757

758+
@beartype
725759
@_process_node_to_blocks.register
726760
def _(
727761
node: nodes.tip,
@@ -739,6 +773,7 @@ def _(
739773
)
740774

741775

776+
@beartype
742777
@_process_node_to_blocks.register
743778
def _(
744779
node: nodes.attention,
@@ -756,6 +791,7 @@ def _(
756791
)
757792

758793

794+
@beartype
759795
@_process_node_to_blocks.register
760796
def _(
761797
node: nodes.caution,
@@ -773,6 +809,7 @@ def _(
773809
)
774810

775811

812+
@beartype
776813
@_process_node_to_blocks.register
777814
def _(
778815
node: nodes.danger,
@@ -790,6 +827,7 @@ def _(
790827
)
791828

792829

830+
@beartype
793831
@_process_node_to_blocks.register
794832
def _(
795833
node: nodes.error,
@@ -807,6 +845,7 @@ def _(
807845
)
808846

809847

848+
@beartype
810849
@_process_node_to_blocks.register
811850
def _(
812851
node: nodes.hint,
@@ -824,6 +863,7 @@ def _(
824863
)
825864

826865

866+
@beartype
827867
@_process_node_to_blocks.register
828868
def _(
829869
node: nodes.important,
@@ -841,6 +881,7 @@ def _(
841881
)
842882

843883

884+
@beartype
844885
@_process_node_to_blocks.register
845886
def _(
846887
node: CollapseNode,
@@ -866,6 +907,7 @@ def _(
866907
return [toggle_block]
867908

868909

910+
@beartype
869911
@_process_node_to_blocks.register
870912
def _(
871913
node: nodes.image,
@@ -888,6 +930,7 @@ def _(
888930
return [UnoImage(file=ExternalFile(url=image_url), caption=None)]
889931

890932

933+
@beartype
891934
@_process_node_to_blocks.register
892935
def _(
893936
node: video_node,
@@ -922,6 +965,7 @@ def _(
922965
]
923966

924967

968+
@beartype
925969
@_process_node_to_blocks.register
926970
def _(
927971
node: audio_node,
@@ -944,9 +988,10 @@ def _(
944988
return [UnoAudio(file=ExternalFile(url=audio_url))]
945989

946990

991+
@beartype
947992
@_process_node_to_blocks.register
948993
def _(
949-
node: PdfNode,
994+
node: _PdfNode,
950995
*,
951996
section_level: int,
952997
) -> list[Block]:
@@ -966,6 +1011,7 @@ def _(
9661011
return [UnoPDF(file=ExternalFile(url=pdf_url))]
9671012

9681013

1014+
@beartype
9691015
@_process_node_to_blocks.register
9701016
def _(
9711017
node: nodes.container,
@@ -1001,6 +1047,7 @@ def _(
10011047
]
10021048

10031049

1050+
@beartype
10041051
@_process_node_to_blocks.register
10051052
def _(
10061053
node: nodes.comment,
@@ -1016,6 +1063,7 @@ def _(
10161063
return []
10171064

10181065

1066+
@beartype
10191067
@_process_node_to_blocks.register
10201068
def _(
10211069
node: nodes.document,
@@ -1069,36 +1117,17 @@ def depart_section(self, node: nodes.Element) -> None:
10691117
del node
10701118
self._section_level -= 1
10711119

1072-
@beartype
1073-
def _serialize_blocks(
1074-
self,
1075-
*,
1076-
blocks: list[Block],
1077-
) -> list[dict[str, Any]]:
1078-
"""
1079-
Convert the block tree to a JSON-serializable format, ignoring IDs from
1080-
tuples.
1081-
"""
1082-
result: list[dict[str, Any]] = []
1083-
for block in blocks:
1084-
serialized_obj = block.obj_ref.serialize_for_api()
1085-
if isinstance(block, ChildrenMixin) and block.children:
1086-
serialized_obj[block.obj_ref.type]["children"] = (
1087-
self._serialize_blocks(
1088-
blocks=list(block.children),
1089-
)
1090-
)
1091-
result.append(serialized_obj)
1092-
return result
1093-
10941120
def depart_document(self, node: nodes.Element) -> None:
10951121
"""
10961122
Output collected block tree as JSON at document end.
10971123
"""
10981124
del node
10991125

11001126
json_output = json.dumps(
1101-
obj=self._serialize_blocks(blocks=self._blocks),
1127+
obj=[
1128+
_serialize_block_with_children(block=block)
1129+
for block in self._blocks
1130+
],
11021131
indent=2,
11031132
ensure_ascii=False,
11041133
)
@@ -1125,7 +1154,7 @@ def _notion_register_pdf_include_directive(
11251154
if isinstance(app.builder, NotionBuilder):
11261155
sphinx_docutils.register_directive(
11271156
name="pdf-include",
1128-
directive=NotionPdfIncludeDirective,
1157+
directive=_NotionPdfIncludeDirective,
11291158
)
11301159
# We ignore coverage here but we do have a ``pre-commit`` hook that checks
11311160
# for the HTML builder at least passing.

tests/test_integration.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from ultimate_notion import Emoji
1717
from ultimate_notion.blocks import PDF as UnoPDF # noqa: N811
1818
from ultimate_notion.blocks import Audio as UnoAudio
19-
from ultimate_notion.blocks import Block, ChildrenMixin
19+
from ultimate_notion.blocks import Block, ParentBlock
2020
from ultimate_notion.blocks import BulletedItem as UnoBulletedItem
2121
from ultimate_notion.blocks import Callout as UnoCallout
2222
from ultimate_notion.blocks import Code as UnoCode
@@ -59,7 +59,7 @@ def _details_from_block(
5959
Create a serialized block details from a Block.
6060
"""
6161
serialized_obj = block.obj_ref.serialize_for_api()
62-
if isinstance(block, ChildrenMixin) and block.children:
62+
if isinstance(block, ParentBlock) and block.children:
6363
serialized_obj[block.obj_ref.type]["children"] = [
6464
_details_from_block(block=child) for child in block.children
6565
]

0 commit comments

Comments
 (0)