notionary 0.1.28__py3-none-any.whl → 0.2.0__py3-none-any.whl

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 (59) hide show
  1. notionary/__init__.py +5 -5
  2. notionary/database/notion_database.py +50 -59
  3. notionary/database/notion_database_factory.py +16 -20
  4. notionary/elements/audio_element.py +1 -1
  5. notionary/elements/bookmark_element.py +1 -1
  6. notionary/elements/bulleted_list_element.py +2 -8
  7. notionary/elements/callout_element.py +1 -1
  8. notionary/elements/code_block_element.py +1 -1
  9. notionary/elements/divider_element.py +1 -1
  10. notionary/elements/embed_element.py +1 -1
  11. notionary/elements/heading_element.py +2 -8
  12. notionary/elements/image_element.py +1 -1
  13. notionary/elements/mention_element.py +1 -1
  14. notionary/elements/notion_block_element.py +1 -1
  15. notionary/elements/numbered_list_element.py +2 -7
  16. notionary/elements/paragraph_element.py +1 -1
  17. notionary/elements/qoute_element.py +1 -1
  18. notionary/elements/registry/{block_element_registry.py → block_registry.py} +70 -26
  19. notionary/elements/registry/{block_element_registry_builder.py → block_registry_builder.py} +48 -32
  20. notionary/elements/table_element.py +1 -1
  21. notionary/elements/text_inline_formatter.py +13 -9
  22. notionary/elements/todo_element.py +1 -1
  23. notionary/elements/toggle_element.py +1 -1
  24. notionary/elements/toggleable_heading_element.py +1 -1
  25. notionary/elements/video_element.py +1 -1
  26. notionary/models/notion_block_response.py +264 -0
  27. notionary/models/notion_database_response.py +63 -0
  28. notionary/models/notion_page_response.py +100 -0
  29. notionary/notion_client.py +38 -5
  30. notionary/page/content/page_content_retriever.py +68 -0
  31. notionary/page/content/page_content_writer.py +103 -0
  32. notionary/page/markdown_to_notion_converter.py +5 -5
  33. notionary/page/metadata/metadata_editor.py +91 -63
  34. notionary/page/metadata/notion_icon_manager.py +55 -28
  35. notionary/page/metadata/notion_page_cover_manager.py +23 -20
  36. notionary/page/notion_page.py +223 -218
  37. notionary/page/notion_page_factory.py +102 -151
  38. notionary/page/notion_to_markdown_converter.py +5 -5
  39. notionary/page/properites/database_property_service.py +11 -55
  40. notionary/page/properites/page_property_manager.py +44 -67
  41. notionary/page/properites/property_value_extractor.py +3 -3
  42. notionary/page/relations/notion_page_relation_manager.py +165 -213
  43. notionary/page/relations/notion_page_title_resolver.py +59 -41
  44. notionary/page/relations/page_database_relation.py +7 -9
  45. notionary/{elements/prompts → prompting}/element_prompt_content.py +19 -4
  46. notionary/prompting/markdown_syntax_prompt_generator.py +92 -0
  47. notionary/util/logging_mixin.py +17 -8
  48. notionary/util/warn_direct_constructor_usage.py +54 -0
  49. {notionary-0.1.28.dist-info → notionary-0.2.0.dist-info}/METADATA +2 -1
  50. notionary-0.2.0.dist-info/RECORD +60 -0
  51. {notionary-0.1.28.dist-info → notionary-0.2.0.dist-info}/WHEEL +1 -1
  52. notionary/database/database_info_service.py +0 -43
  53. notionary/elements/prompts/synthax_prompt_builder.py +0 -150
  54. notionary/page/content/page_content_manager.py +0 -180
  55. notionary/page/properites/property_operation_result.py +0 -116
  56. notionary/page/relations/relation_operation_result.py +0 -144
  57. notionary-0.1.28.dist-info/RECORD +0 -58
  58. {notionary-0.1.28.dist-info → notionary-0.2.0.dist-info}/licenses/LICENSE +0 -0
  59. {notionary-0.1.28.dist-info → notionary-0.2.0.dist-info}/top_level.txt +0 -0
@@ -1,180 +0,0 @@
1
- import json
2
- from typing import Any, Dict, List, Optional
3
-
4
- from notionary.elements.registry.block_element_registry import BlockElementRegistry
5
- from notionary.notion_client import NotionClient
6
-
7
- from notionary.page.markdown_to_notion_converter import (
8
- MarkdownToNotionConverter,
9
- )
10
- from notionary.page.notion_to_markdown_converter import (
11
- NotionToMarkdownConverter,
12
- )
13
- from notionary.page.content.notion_page_content_chunker import (
14
- NotionPageContentChunker,
15
- )
16
- from notionary.util.logging_mixin import LoggingMixin
17
-
18
-
19
- class PageContentManager(LoggingMixin):
20
- def __init__(
21
- self,
22
- page_id: str,
23
- client: NotionClient,
24
- block_registry: Optional[BlockElementRegistry] = None,
25
- ):
26
- self.page_id = page_id
27
- self._client = client
28
- self._markdown_to_notion_converter = MarkdownToNotionConverter(
29
- block_registry=block_registry
30
- )
31
- self._notion_to_markdown_converter = NotionToMarkdownConverter(
32
- block_registry=block_registry
33
- )
34
- self._chunker = NotionPageContentChunker()
35
-
36
- async def append_markdown(self, markdown_text: str) -> str:
37
- """
38
- Append markdown text to a Notion page, automatically handling content length limits.
39
- First strips out triple backtick markdown fences if they wrap the entire content.
40
-
41
- Args:
42
- markdown_text: The markdown text to append
43
- append_divider: If True, appends a divider after the markdown content (default: False)
44
- """
45
- try:
46
- blocks = self._markdown_to_notion_converter.convert(markdown_text)
47
- fixed_blocks = self._chunker.fix_blocks_content_length(blocks)
48
-
49
- result = await self._client.patch(
50
- f"blocks/{self.page_id}/children", {"children": fixed_blocks}
51
- )
52
- return (
53
- "Successfully added text to the page."
54
- if result
55
- else "Failed to add text."
56
- )
57
- except Exception as e:
58
- self.logger.error("Error appending markdown: %s", str(e))
59
- raise
60
-
61
- async def has_database_descendant(self, block_id: str) -> bool:
62
- """
63
- Check if a block or any of its descendants is a database.
64
- """
65
- resp = await self._client.get(f"blocks/{block_id}/children")
66
- children = resp.get("results", []) if resp else []
67
-
68
- for child in children:
69
- block_type = child.get("type")
70
- if block_type in ["child_database", "database", "linked_database"]:
71
- return True
72
-
73
- if child.get("has_children", False):
74
- if await self.has_database_descendant(child["id"]):
75
- return True
76
-
77
- return False
78
-
79
- async def delete_block_with_children(
80
- self, block: Dict[str, Any], skip_databases: bool
81
- ) -> tuple[int, int]:
82
- """
83
- Delete a block and all its children, optionally skipping databases.
84
- Returns a tuple of (deleted_count, skipped_count).
85
- """
86
- deleted = 0
87
- skipped = 0
88
-
89
- block_type = block.get("type")
90
- if skip_databases and block_type in [
91
- "child_database",
92
- "database",
93
- "linked_database",
94
- ]:
95
- return 0, 1
96
-
97
- if skip_databases and await self.has_database_descendant(block["id"]):
98
- return 0, 1
99
-
100
- # Process children first
101
- if block.get("has_children", False):
102
- children_resp = await self._client.get(f"blocks/{block['id']}/children")
103
- for child in children_resp.get("results", []):
104
- child_deleted, child_skipped = await self.delete_block_with_children(
105
- child, skip_databases
106
- )
107
- deleted += child_deleted
108
- skipped += child_skipped
109
-
110
- # Then delete the block itself
111
- if await self._client.delete(f"blocks/{block['id']}"):
112
- deleted += 1
113
-
114
- return deleted, skipped
115
-
116
- async def clear(self, skip_databases: bool = True) -> str:
117
- """
118
- Clear the content of the page, optionally preserving databases.
119
- """
120
- blocks_resp = await self._client.get(f"blocks/{self.page_id}/children")
121
- results = blocks_resp.get("results", []) if blocks_resp else []
122
-
123
- total_deleted = 0
124
- total_skipped = 0
125
-
126
- for block in results:
127
- deleted, skipped = await self.delete_block_with_children(
128
- block, skip_databases
129
- )
130
- total_deleted += deleted
131
- total_skipped += skipped
132
-
133
- return (
134
- f"Deleted {total_deleted} blocks. Skipped {total_skipped} database blocks."
135
- )
136
-
137
- async def get_blocks(self) -> List[Dict[str, Any]]:
138
- result = await self._client.get(f"blocks/{self.page_id}/children")
139
- if not result:
140
- self.logger.error("Error retrieving page content: %s", result.error)
141
- return []
142
- return result.get("results", [])
143
-
144
- async def get_block_children(self, block_id: str) -> List[Dict[str, Any]]:
145
- result = await self._client.get(f"blocks/{block_id}/children")
146
- if not result:
147
- self.logger.error("Error retrieving block children: %s", result.error)
148
- return []
149
- return result.get("results", [])
150
-
151
- async def get_page_blocks_with_children(
152
- self, parent_id: Optional[str] = None
153
- ) -> List[Dict[str, Any]]:
154
- blocks = (
155
- await self.get_blocks()
156
- if parent_id is None
157
- else await self.get_block_children(parent_id)
158
- )
159
-
160
- if not blocks:
161
- return []
162
-
163
- for block in blocks:
164
- if not block.get("has_children"):
165
- continue
166
-
167
- block_id = block.get("id")
168
- if not block_id:
169
- continue
170
-
171
- # Recursive call for nested blocks
172
- children = await self.get_page_blocks_with_children(block_id)
173
- if children:
174
- block["children"] = children
175
-
176
- return blocks
177
-
178
- async def get_text(self) -> str:
179
- blocks = await self.get_page_blocks_with_children()
180
- return self._notion_to_markdown_converter.convert(blocks)
@@ -1,116 +0,0 @@
1
- from typing import Any, Dict, List, Optional
2
- from dataclasses import dataclass
3
-
4
-
5
- @dataclass
6
- class PropertyOperationResult:
7
- """
8
- Result of a property operation in Notion.
9
-
10
- Attributes:
11
- success: Whether the operation was successful
12
- property_name: Name of the affected property
13
- value: The value that was set or retrieved
14
- error: Error message, if any
15
- available_options: Available options for select-like properties
16
- api_response: The original API response
17
- """
18
-
19
- success: bool
20
- property_name: str
21
- value: Optional[Any] = None
22
- error: Optional[str] = None
23
- available_options: Optional[List[str]] = None
24
- api_response: Optional[Dict[str, Any]] = None
25
-
26
- # Common error messages
27
- NO_API_RESPONSE = "Failed to set property (no API response)"
28
- RELATION_TYPE_ERROR = "Property '{}' is of type 'relation'. Relations must be set using the RelationManager."
29
-
30
- @classmethod
31
- def from_success(
32
- cls, property_name: str, value: Any, api_response: Dict[str, Any]
33
- ) -> "PropertyOperationResult":
34
- """Creates a success result."""
35
- return cls(
36
- success=True,
37
- property_name=property_name,
38
- value=value,
39
- api_response=api_response,
40
- )
41
-
42
- @classmethod
43
- def from_error(
44
- cls,
45
- property_name: str,
46
- error: str,
47
- value: Optional[Any] = None,
48
- available_options: Optional[List[str]] = None,
49
- ) -> "PropertyOperationResult":
50
- """Creates an error result."""
51
- return cls(
52
- success=False,
53
- property_name=property_name,
54
- value=value,
55
- error=error,
56
- available_options=available_options or [],
57
- )
58
-
59
- @classmethod
60
- def from_api_error(
61
- cls, property_name: str, api_response: Dict[str, Any]
62
- ) -> "PropertyOperationResult":
63
- """Creates a result from an API error response."""
64
- return cls(
65
- success=False,
66
- property_name=property_name,
67
- error=api_response.get("message", "Unknown API error"),
68
- api_response=api_response,
69
- )
70
-
71
- @classmethod
72
- def from_no_api_response(
73
- cls, property_name: str, value: Optional[Any] = None
74
- ) -> "PropertyOperationResult":
75
- """Creates a standardized result for missing API responses."""
76
- return cls.from_error(property_name, cls.NO_API_RESPONSE, value)
77
-
78
- @classmethod
79
- def from_relation_type_error(
80
- cls, property_name: str, value: Optional[Any] = None
81
- ) -> "PropertyOperationResult":
82
- """Creates a standardized error result for relation type properties."""
83
- error_msg = cls.RELATION_TYPE_ERROR.format(property_name)
84
- return cls.from_error(property_name, error_msg, value)
85
-
86
- def to_dict(self) -> Dict[str, Any]:
87
- """Converts the result to a dictionary."""
88
- result = {
89
- "success": self.success,
90
- "property": self.property_name,
91
- }
92
-
93
- if self.value is not None:
94
- result["value"] = self.value
95
-
96
- if not self.success:
97
- result["error"] = self.error
98
-
99
- if self.available_options:
100
- result["available_options"] = self.available_options
101
-
102
- if self.api_response:
103
- result["api_response"] = self.api_response
104
-
105
- return result
106
-
107
- def __str__(self) -> str:
108
- """String representation of the result."""
109
- if self.success:
110
- return f"Success: Property '{self.property_name}' set to '{self.value}'"
111
-
112
- if self.available_options:
113
- options = "', '".join(self.available_options)
114
- return f"Error: {self.error}\nAvailable options for '{self.property_name}': '{options}'"
115
-
116
- return f"Error: {self.error}"
@@ -1,144 +0,0 @@
1
- from typing import Any, Dict, List, Optional
2
- from dataclasses import dataclass, field
3
-
4
-
5
- @dataclass
6
- class RelationOperationResult:
7
- """
8
- Result of a relation operation in Notion.
9
-
10
- Attributes:
11
- success: Whether the operation was successful overall
12
- property_name: Name of the affected relation property
13
- found_pages: List of page titles/IDs that were successfully found
14
- not_found_pages: List of page titles that could not be found
15
- page_ids_added: List of page IDs that were added to the relation
16
- error: Error message, if any
17
- api_response: The original API response
18
- """
19
-
20
- success: bool
21
- property_name: str
22
- found_pages: List[str] = field(default_factory=list)
23
- not_found_pages: List[str] = field(default_factory=list)
24
- page_ids_added: List[str] = field(default_factory=list)
25
- error: Optional[str] = None
26
- api_response: Optional[Dict[str, Any]] = None
27
-
28
- NO_API_RESPONSE = "Failed to update relation (no API response)"
29
- NO_PAGES_FOUND = "No valid pages found for relation"
30
-
31
- @classmethod
32
- def from_success(
33
- cls,
34
- property_name: str,
35
- found_pages: List[str],
36
- page_ids_added: List[str],
37
- api_response: Dict[str, Any],
38
- not_found_pages: Optional[List[str]] = None,
39
- ) -> "RelationOperationResult":
40
- """Creates a success result."""
41
- return cls(
42
- success=True,
43
- property_name=property_name,
44
- found_pages=found_pages,
45
- not_found_pages=not_found_pages or [],
46
- page_ids_added=page_ids_added,
47
- api_response=api_response,
48
- )
49
-
50
- @classmethod
51
- def from_error(
52
- cls,
53
- property_name: str,
54
- error: str,
55
- found_pages: Optional[List[str]] = None,
56
- not_found_pages: Optional[List[str]] = None,
57
- page_ids_added: Optional[List[str]] = None,
58
- ) -> "RelationOperationResult":
59
- """Creates an error result."""
60
- return cls(
61
- success=False,
62
- property_name=property_name,
63
- found_pages=found_pages or [],
64
- not_found_pages=not_found_pages or [],
65
- page_ids_added=page_ids_added or [],
66
- error=error,
67
- )
68
-
69
- @classmethod
70
- def from_no_pages_found(
71
- cls, property_name: str, not_found_pages: List[str]
72
- ) -> "RelationOperationResult":
73
- """Creates a standardized result for when no pages were found."""
74
- return cls.from_error(
75
- property_name=property_name,
76
- error=cls.NO_PAGES_FOUND,
77
- not_found_pages=not_found_pages,
78
- )
79
-
80
- @classmethod
81
- def from_no_api_response(
82
- cls, property_name: str, found_pages: List[str], page_ids_added: List[str]
83
- ) -> "RelationOperationResult":
84
- """Creates a standardized result for a missing API response."""
85
- return cls.from_error(
86
- property_name=property_name,
87
- error=cls.NO_API_RESPONSE,
88
- found_pages=found_pages,
89
- page_ids_added=page_ids_added,
90
- )
91
-
92
- @property
93
- def has_not_found_pages(self) -> bool:
94
- """Returns True if there were any pages that couldn't be found."""
95
- return len(self.not_found_pages) > 0
96
-
97
- @property
98
- def has_found_pages(self) -> bool:
99
- """Returns True if any pages were found."""
100
- return len(self.found_pages) > 0
101
-
102
- def to_dict(self) -> Dict[str, Any]:
103
- """Converts the result to a dictionary."""
104
- result = {
105
- "success": self.success,
106
- "property": self.property_name,
107
- }
108
-
109
- if self.found_pages:
110
- result["found_pages"] = self.found_pages
111
-
112
- if self.not_found_pages:
113
- result["not_found_pages"] = self.not_found_pages
114
-
115
- if self.page_ids_added:
116
- result["page_ids_added"] = self.page_ids_added
117
-
118
- if not self.success:
119
- result["error"] = self.error
120
-
121
- if self.api_response:
122
- result["api_response"] = self.api_response
123
-
124
- return result
125
-
126
- def __str__(self) -> str:
127
- """String representation of the result."""
128
- if self.success:
129
- base = f"Success: Added {len(self.page_ids_added)} relation(s) to property '{self.property_name}'"
130
-
131
- if self.not_found_pages:
132
- pages_str = "', '".join(self.not_found_pages)
133
- base += f"\nWarning: Could not find pages: '{pages_str}'"
134
-
135
- return base
136
-
137
- if not self.found_pages and self.not_found_pages:
138
- pages_str = "', '".join(self.not_found_pages)
139
- return f"Error: {self.error}\nNone of the requested pages were found: '{pages_str}'"
140
-
141
- if self.found_pages and not self.page_ids_added:
142
- return f"Error: {self.error}\nPages were found but could not be added to the relation."
143
-
144
- return f"Error: {self.error}"
@@ -1,58 +0,0 @@
1
- notionary/__init__.py,sha256=ypCkbF1YEcwy5aE2kGFmtJOZq41Vs01lahJNqRO27fU,735
2
- notionary/notion_client.py,sha256=6YhaDK9UjH18Q0f1bxVVNGMbCvpQhatse6WRVIARGCE,6035
3
- notionary/database/database_discovery.py,sha256=qDGFhXG9s-_6CXdRg8tMiwX4dvX7jLjgAUFPSNlYtlI,4506
4
- notionary/database/database_info_service.py,sha256=Ig6gx8jUSPYORJvfgEV5kV6t72pZQsWU8HPMqd43B-o,1336
5
- notionary/database/notion_database.py,sha256=YCOuzrWfKRJvMiWdVfEt8i3NAEqpKDwHj5SX4GUraEk,8017
6
- notionary/database/notion_database_factory.py,sha256=Af57yaUHidD8TKJ8uyXOc2nnqHm7on6VGFdDRjxiq9o,6692
7
- notionary/database/models/page_result.py,sha256=Vmm5_oYpYAkIIJVoTd1ZZGloeC3cmFLMYP255mAmtaw,233
8
- notionary/elements/audio_element.py,sha256=WpcUpIv4U9grZegiCAmyc-Gj3XM3TQVFKr9PQM-QErg,5352
9
- notionary/elements/bookmark_element.py,sha256=MS2K3pD-hMmS4Fmk1W8BwNL_-j4baHF42EoOWMNIfXw,8152
10
- notionary/elements/bulleted_list_element.py,sha256=VdMKlxDlixTeYVQIqwM4vQ55xHqABtqzZDqIUATG9oE,2875
11
- notionary/elements/callout_element.py,sha256=11qr9XGpF7jWle0wbog5eUrE4SAkThDdK9s4oplOxX0,4499
12
- notionary/elements/code_block_element.py,sha256=6E-fc9zJegSQ_FjB08HImXL2rDQnmkFoRwoPuN-7PwI,6247
13
- notionary/elements/divider_element.py,sha256=fLWU7Pn0JXIV8tPcuxvMMua4S54JOi2hQRjLcbVwC7g,2218
14
- notionary/elements/embed_element.py,sha256=NEQopRLMzMIybVLbTt_y1cgaH1-VZW14xkbGJIDirkE,4586
15
- notionary/elements/heading_element.py,sha256=Su4OUYeDvb9kvAFCmzagKQCNgkwvxsUn1KXJFTuYTFE,3186
16
- notionary/elements/image_element.py,sha256=Qo94TavAnmJzGveDfdSkOAZeypij-zqbxsJ14rfbKIc,4765
17
- notionary/elements/mention_element.py,sha256=B88AcU4XqpEXfhXywS_3K7TJIgoJT_3tWzJ_KcdJ4V4,8234
18
- notionary/elements/notion_block_element.py,sha256=HN1Bu9wAaFsRIN6jkZSclo6KgB4nNvcVx7hlPWIhmy8,1265
19
- notionary/elements/numbered_list_element.py,sha256=zW1MjNU_02mJBDGnaQFkAESY_i1rCYgp9o4zl6Au0DQ,2865
20
- notionary/elements/paragraph_element.py,sha256=JuAN4cFRsJkePD7s7TNhDdSuojZtr6WOaCTGzJsBEGg,3262
21
- notionary/elements/qoute_element.py,sha256=jG4FkD7Ieec3piBWcOeCZPgvw0GF0KZlxzdx2svQC0M,6129
22
- notionary/elements/table_element.py,sha256=ujlo6bwrmKrQWRWGuUQebeDS-1T-c_R0SkzaPEPy2m8,11256
23
- notionary/elements/text_inline_formatter.py,sha256=RdegEHvS5_AzDtqYxKb4b0uDbcpp3UhxHo6GyR84NFc,7780
24
- notionary/elements/todo_element.py,sha256=cWuu8R55hNj6ubjrLu2yJpoeij7UfWhvmaklqcx8AI8,4131
25
- notionary/elements/toggle_element.py,sha256=o7Utj0nKZAW5MzF_RMyD36HSWMj1cZmLEmqfGH-BFuY,11089
26
- notionary/elements/toggleable_heading_element.py,sha256=EAkL9mU6u13JEgUOx6CeAhD8P3L_q6L_M_C8qZ_OTSs,9967
27
- notionary/elements/video_element.py,sha256=2WwvZuG_UOVBnpEikZFxupe_x321QkczrodZHd5IeCw,5734
28
- notionary/elements/prompts/element_prompt_content.py,sha256=Snha2FMtWO94kl1KwIJp6n7pY6Z8K-9_zVj1TUyaNNA,3729
29
- notionary/elements/prompts/synthax_prompt_builder.py,sha256=W3ex5RDszlhMgYPGpemxiEI653hQKl147B-bh_ynR9g,6656
30
- notionary/elements/registry/block_element_registry.py,sha256=r1V6waYQxZ_4bF6Mx_HmQ42-yhh8E54v-yNRT4PsnLk,3570
31
- notionary/elements/registry/block_element_registry_builder.py,sha256=C6W64CwFqZBu31hZZqoD-uCZCOMOOXeFVk_SHKSp58U,9048
32
- notionary/exceptions/database_exceptions.py,sha256=I-Tx6bYRLpi5pjGPtbT-Mqxvz3BFgYTiuZxknJeLxtI,2638
33
- notionary/exceptions/page_creation_exception.py,sha256=4v7IuZD6GsQLrqhDLriGjuG3ML638gAO53zDCrLePuU,281
34
- notionary/page/markdown_to_notion_converter.py,sha256=LFnv98uU3QRzxH7sZI0AE5_QxeHkNQZMxVcab-r8Qls,15877
35
- notionary/page/notion_page.py,sha256=OXE2sw9Drkqduy96uVvXT3vHwHPh5FMJk6QyPRADoFU,17653
36
- notionary/page/notion_page_factory.py,sha256=UUEZ-cyEWL0OMVPrgjc4vJdcplEa1bO2yHCYooACYC8,8189
37
- notionary/page/notion_to_markdown_converter.py,sha256=EUiHeurQb73zQJ5Gatvf_67vWd-vOI8qg3yFLz8bf8Q,6452
38
- notionary/page/content/notion_page_content_chunker.py,sha256=xRks74Dqec-De6-AVTxMPnXs-MSJBzSm1HfJfaHiKr8,3330
39
- notionary/page/content/page_content_manager.py,sha256=0Bl52mEqKuhDGuJhOEMhGjJWHgxCiqGYjrqO1LqYzJM,6403
40
- notionary/page/metadata/metadata_editor.py,sha256=61uiw8oB25O8ePhytoJvZDetuof5sjPoM6aoHZGo4wc,4949
41
- notionary/page/metadata/notion_icon_manager.py,sha256=I4MczURRYc1PV0qDFwbCCzicqiDyOhKpdk9E2b9lWMc,1579
42
- notionary/page/metadata/notion_page_cover_manager.py,sha256=hasXPIbTy9rD55tHr_zzF2yj_lD0RsULz5UP0rNRx4g,1929
43
- notionary/page/properites/database_property_service.py,sha256=AJuBGahbb53VQa6IGGHxBMoOgCy6vFZg08uR_eDjNUs,11570
44
- notionary/page/properites/page_property_manager.py,sha256=Xl8Cwn8WVszqpFXT_NvASkmP5igpCTEgRVhG_F45424,6914
45
- notionary/page/properites/property_formatter.py,sha256=d_Nr5XQxgjB6VIS0u3ey14MOUKY416o_BvdXjbkUNAQ,3667
46
- notionary/page/properites/property_operation_result.py,sha256=PhxHJJxxG2BdDl7aswhWnMSmf9RQtoinKkRHDoqxwCs,3913
47
- notionary/page/properites/property_value_extractor.py,sha256=1BfyCYrFzfIUmNTozavrLTjG--6P6Dy2tkewf6rHHwQ,2353
48
- notionary/page/relations/notion_page_relation_manager.py,sha256=ooN-WxXNPBE_vkNJgbc1wH8iIWBlKa9FHgiMeJjbYdw,13032
49
- notionary/page/relations/notion_page_title_resolver.py,sha256=XQpa5XY4hoh5UYqpewTYaaftNX52WHyk2XmM4r8B2uY,3016
50
- notionary/page/relations/page_database_relation.py,sha256=F9aGXFjjL8ZLNbfTGeGm_QAyXhz2AEOw7GgDLdprEcE,2313
51
- notionary/page/relations/relation_operation_result.py,sha256=NDxBzGntOxc_89ti-HG8xDSqfY6PwyGHKHrrKbCzNjM,5010
52
- notionary/util/logging_mixin.py,sha256=fKsx9t90bwvL74ZX3dU-sXdC4TZCQyO6qU9I8txkw_U,1369
53
- notionary/util/page_id_utils.py,sha256=EYNMxgf-7ghzL5K8lKZBZfW7g5CsdY0Xuj4IYmU8RPk,1381
54
- notionary-0.1.28.dist-info/licenses/LICENSE,sha256=zOm3cRT1qD49eg7vgw95MI79rpUAZa1kRBFwL2FkAr8,1120
55
- notionary-0.1.28.dist-info/METADATA,sha256=09cAT-X3imeOHrG-VKtcOLSUJ_pPLiioAnxJ2e4cdwg,8342
56
- notionary-0.1.28.dist-info/WHEEL,sha256=GHB6lJx2juba1wDgXDNlMTyM13ckjBMKf-OnwgKOCtA,91
57
- notionary-0.1.28.dist-info/top_level.txt,sha256=fhONa6BMHQXqthx5PanWGbPL0b8rdFqhrJKVLf_adSs,10
58
- notionary-0.1.28.dist-info/RECORD,,