notionary 0.1.12__py3-none-any.whl → 0.1.13__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.
- notionary/__init__.py +14 -10
- notionary/{core/converters → converters}/elements/audio_element.py +1 -1
- notionary/{core/converters → converters}/elements/bookmark_element.py +1 -1
- notionary/{core/converters → converters}/elements/callout_element.py +2 -2
- notionary/{core/converters → converters}/elements/code_block_element.py +1 -1
- notionary/{core/converters → converters}/elements/column_element.py +1 -1
- notionary/{core/converters → converters}/elements/divider_element.py +1 -1
- notionary/{core/converters → converters}/elements/embed_element.py +1 -1
- notionary/{core/converters → converters}/elements/heading_element.py +2 -2
- notionary/{core/converters → converters}/elements/image_element.py +1 -1
- notionary/{core/converters → converters}/elements/list_element.py +2 -2
- notionary/{core/converters → converters}/elements/paragraph_element.py +2 -2
- notionary/{core/converters → converters}/elements/qoute_element.py +1 -1
- notionary/{core/converters → converters}/elements/table_element.py +2 -2
- notionary/{core/converters → converters}/elements/todo_lists.py +2 -2
- notionary/{core/converters → converters}/elements/toggle_element.py +1 -6
- notionary/{core/converters → converters}/elements/video_element.py +1 -1
- notionary/{core/converters → converters}/markdown_to_notion_converter.py +2 -2
- notionary/{core/converters → converters}/notion_to_markdown_converter.py +2 -2
- notionary/{core/converters → converters}/registry/block_element_registry.py +2 -2
- notionary/{core/converters → converters}/registry/block_element_registry_builder.py +18 -18
- notionary/{core/database → database}/database_discovery.py +19 -17
- notionary/{core/database → database}/database_info_service.py +1 -1
- notionary/{core/database/notion_database_manager.py → database/notion_database.py} +13 -14
- notionary/{core/database/notion_database_manager_factory.py → database/notion_database_factory.py} +8 -12
- notionary/{core/page → page}/content/page_content_manager.py +6 -8
- notionary/{core/page → page}/metadata/metadata_editor.py +2 -2
- notionary/{core/page → page}/metadata/notion_icon_manager.py +1 -1
- notionary/{core/page → page}/metadata/notion_page_cover_manager.py +1 -1
- notionary/page/notion_page.py +504 -0
- notionary/page/notion_page_factory.py +256 -0
- notionary/{core/page → page}/properites/database_property_service.py +1 -1
- notionary/{core/page → page}/properites/page_property_manager.py +7 -7
- notionary/{core/page → page}/relations/notion_page_relation_manager.py +3 -3
- notionary/{core/page → page}/relations/notion_page_title_resolver.py +1 -1
- notionary/{core/page → page}/relations/page_database_relation.py +1 -1
- notionary/util/page_id_utils.py +3 -1
- {notionary-0.1.12.dist-info → notionary-0.1.13.dist-info}/METADATA +1 -1
- notionary-0.1.13.dist-info/RECORD +56 -0
- notionary/core/page/notion_page_manager.py +0 -312
- notionary-0.1.12.dist-info/RECORD +0 -55
- /notionary/{core/converters → converters}/__init__.py +0 -0
- /notionary/{core/converters → converters}/elements/notion_block_element.py +0 -0
- /notionary/{core/converters → converters}/elements/text_inline_formatter.py +0 -0
- /notionary/{core/database → database}/models/page_result.py +0 -0
- /notionary/{core/notion_client.py → notion_client.py} +0 -0
- /notionary/{core/page → page}/content/notion_page_content_chunker.py +0 -0
- /notionary/{core/page → page}/properites/property_formatter.py +0 -0
- /notionary/{core/page → page}/properites/property_operation_result.py +0 -0
- /notionary/{core/page → page}/properites/property_value_extractor.py +0 -0
- /notionary/{core/page → page}/relations/relation_operation_result.py +0 -0
- {notionary-0.1.12.dist-info → notionary-0.1.13.dist-info}/WHEEL +0 -0
- {notionary-0.1.12.dist-info → notionary-0.1.13.dist-info}/licenses/LICENSE +0 -0
- {notionary-0.1.12.dist-info → notionary-0.1.13.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,256 @@
|
|
1
|
+
import logging
|
2
|
+
from typing import List, Optional, Dict, Any
|
3
|
+
from difflib import SequenceMatcher
|
4
|
+
|
5
|
+
from notionary import NotionPage, NotionClient
|
6
|
+
from notionary.util.logging_mixin import LoggingMixin
|
7
|
+
from notionary.util.page_id_utils import format_uuid, extract_and_validate_page_id
|
8
|
+
|
9
|
+
|
10
|
+
class NotionPageFactory(LoggingMixin):
|
11
|
+
"""
|
12
|
+
Factory class for creating NotionPage instances.
|
13
|
+
Provides methods for creating page instances by page ID, URL, or name.
|
14
|
+
"""
|
15
|
+
|
16
|
+
@classmethod
|
17
|
+
def class_logger(cls):
|
18
|
+
"""Class logger - for class methods"""
|
19
|
+
return logging.getLogger(cls.__name__)
|
20
|
+
|
21
|
+
@classmethod
|
22
|
+
async def from_page_id(
|
23
|
+
cls, page_id: str, token: Optional[str] = None
|
24
|
+
) -> NotionPage:
|
25
|
+
"""
|
26
|
+
Create a NotionPage from a page ID.
|
27
|
+
|
28
|
+
Args:
|
29
|
+
page_id: The ID of the Notion page
|
30
|
+
token: Optional Notion API token (uses environment variable if not provided)
|
31
|
+
|
32
|
+
Returns:
|
33
|
+
An initialized NotionPage instance
|
34
|
+
|
35
|
+
Raises:
|
36
|
+
NotionError: If there is any error during page creation or connection
|
37
|
+
"""
|
38
|
+
logger = cls.class_logger()
|
39
|
+
|
40
|
+
try:
|
41
|
+
formatted_id = format_uuid(page_id) or page_id
|
42
|
+
|
43
|
+
page = NotionPage(page_id=formatted_id, token=token)
|
44
|
+
|
45
|
+
logger.info("Successfully created page instance for ID: %s", formatted_id)
|
46
|
+
return page
|
47
|
+
|
48
|
+
except Exception as e:
|
49
|
+
error_msg = f"Error connecting to page {page_id}: {str(e)}"
|
50
|
+
logger.error(error_msg)
|
51
|
+
|
52
|
+
@classmethod
|
53
|
+
async def from_url(cls, url: str, token: Optional[str] = None) -> NotionPage:
|
54
|
+
"""
|
55
|
+
Create a NotionPage from a Notion URL.
|
56
|
+
|
57
|
+
Args:
|
58
|
+
url: The URL of the Notion page
|
59
|
+
token: Optional Notion API token (uses environment variable if not provided)
|
60
|
+
|
61
|
+
Returns:
|
62
|
+
An initialized NotionPage instance
|
63
|
+
|
64
|
+
Raises:
|
65
|
+
NotionError: If there is any error during page creation or connection
|
66
|
+
"""
|
67
|
+
logger = cls.class_logger()
|
68
|
+
|
69
|
+
try:
|
70
|
+
page_id = extract_and_validate_page_id(url=url)
|
71
|
+
if not page_id:
|
72
|
+
error_msg = f"Could not extract valid page ID from URL: {url}"
|
73
|
+
logger.error(error_msg)
|
74
|
+
|
75
|
+
page = NotionPage(page_id=page_id, url=url, token=token)
|
76
|
+
|
77
|
+
logger.info(
|
78
|
+
"Successfully created page instance from URL for ID: %s", page_id
|
79
|
+
)
|
80
|
+
return page
|
81
|
+
|
82
|
+
except Exception as e:
|
83
|
+
error_msg = f"Error connecting to page with URL {url}: {str(e)}"
|
84
|
+
logger.error(error_msg)
|
85
|
+
|
86
|
+
@classmethod
|
87
|
+
async def from_page_name(
|
88
|
+
cls, page_name: str, token: Optional[str] = None
|
89
|
+
) -> NotionPage:
|
90
|
+
"""
|
91
|
+
Create a NotionPage by finding a page with a matching name.
|
92
|
+
Uses fuzzy matching to find the closest match to the given name.
|
93
|
+
If no good match is found, suggests closest alternatives ("Did you mean?").
|
94
|
+
|
95
|
+
Args:
|
96
|
+
page_name: The name of the Notion page to search for
|
97
|
+
token: Optional Notion API token (uses environment variable if not provided)
|
98
|
+
|
99
|
+
Returns:
|
100
|
+
An initialized NotionPage instance
|
101
|
+
|
102
|
+
Raises:
|
103
|
+
NotionError: If there is any error during page search or connection
|
104
|
+
NotionPageNotFoundError: If no matching page found, includes suggestions
|
105
|
+
"""
|
106
|
+
logger = cls.class_logger()
|
107
|
+
logger.debug("Searching for page with name: %s", page_name)
|
108
|
+
|
109
|
+
client = NotionClient(token=token)
|
110
|
+
|
111
|
+
try:
|
112
|
+
logger.debug("Using search endpoint to find pages")
|
113
|
+
|
114
|
+
search_payload = {
|
115
|
+
"filter": {"property": "object", "value": "page"},
|
116
|
+
"page_size": 100,
|
117
|
+
}
|
118
|
+
|
119
|
+
response = await client.post("search", search_payload)
|
120
|
+
|
121
|
+
if not response or "results" not in response:
|
122
|
+
error_msg = "Failed to fetch pages using search endpoint"
|
123
|
+
logger.error(error_msg)
|
124
|
+
|
125
|
+
pages = response.get("results", [])
|
126
|
+
|
127
|
+
if not pages:
|
128
|
+
error_msg = f"No pages found matching '{page_name}'"
|
129
|
+
logger.warning(error_msg)
|
130
|
+
|
131
|
+
logger.debug("Found %d pages, searching for best match", len(pages))
|
132
|
+
|
133
|
+
# Store all matches with their scores for potential suggestions
|
134
|
+
matches = []
|
135
|
+
best_match = None
|
136
|
+
best_score = 0
|
137
|
+
|
138
|
+
for page in pages:
|
139
|
+
title = cls._extract_title_from_page(page)
|
140
|
+
score = SequenceMatcher(None, page_name.lower(), title.lower()).ratio()
|
141
|
+
|
142
|
+
matches.append((page, title, score))
|
143
|
+
|
144
|
+
if score > best_score:
|
145
|
+
best_score = score
|
146
|
+
best_match = page
|
147
|
+
|
148
|
+
if best_score < 0.6 or not best_match:
|
149
|
+
# Sort matches by score in descending order
|
150
|
+
matches.sort(key=lambda x: x[2], reverse=True)
|
151
|
+
|
152
|
+
# Take top N suggestions (adjust as needed)
|
153
|
+
suggestions = [title for _, title, _ in matches[:5]]
|
154
|
+
|
155
|
+
error_msg = f"No good match found for '{page_name}'. Did you mean one of these?\n"
|
156
|
+
error_msg += "\n".join(f"- {suggestion}" for suggestion in suggestions)
|
157
|
+
|
158
|
+
logger.warning(
|
159
|
+
"No good match found for '%s'. Best score: %.2f",
|
160
|
+
page_name,
|
161
|
+
best_score,
|
162
|
+
)
|
163
|
+
|
164
|
+
page_id = best_match.get("id")
|
165
|
+
|
166
|
+
if not page_id:
|
167
|
+
error_msg = "Best match page has no ID"
|
168
|
+
logger.error(error_msg)
|
169
|
+
|
170
|
+
matched_name = cls._extract_title_from_page(best_match)
|
171
|
+
|
172
|
+
logger.info(
|
173
|
+
"Found matching page: '%s' (ID: %s) with score: %.2f",
|
174
|
+
matched_name,
|
175
|
+
page_id,
|
176
|
+
best_score,
|
177
|
+
)
|
178
|
+
|
179
|
+
page = NotionPage(
|
180
|
+
page_id=page_id, title=matched_name, token=token
|
181
|
+
)
|
182
|
+
|
183
|
+
logger.info("Successfully created page instance for '%s'", matched_name)
|
184
|
+
await client.close()
|
185
|
+
return page
|
186
|
+
|
187
|
+
except Exception as e:
|
188
|
+
error_msg = f"Error finding page by name: {str(e)}"
|
189
|
+
logger.error(error_msg)
|
190
|
+
|
191
|
+
@classmethod
|
192
|
+
def _extract_title_from_page(cls, page: Dict[str, Any]) -> str:
|
193
|
+
"""
|
194
|
+
Extract the title from a page object.
|
195
|
+
|
196
|
+
Args:
|
197
|
+
page: The page object returned from the Notion API
|
198
|
+
|
199
|
+
Returns:
|
200
|
+
The title of the page
|
201
|
+
|
202
|
+
Raises:
|
203
|
+
NotionError: If the title cannot be extracted
|
204
|
+
"""
|
205
|
+
try:
|
206
|
+
if "properties" in page:
|
207
|
+
for prop_value in page["properties"].values():
|
208
|
+
if prop_value.get("type") != "title":
|
209
|
+
continue
|
210
|
+
title_array = prop_value.get("title", [])
|
211
|
+
if not title_array:
|
212
|
+
continue
|
213
|
+
return cls._extract_text_from_rich_text(title_array)
|
214
|
+
|
215
|
+
if "child_page" in page:
|
216
|
+
return page.get("child_page", {}).get("title", "Untitled")
|
217
|
+
|
218
|
+
return "Untitled"
|
219
|
+
|
220
|
+
except Exception as e:
|
221
|
+
error_msg = f"Error extracting page title: {str(e)}"
|
222
|
+
cls.class_logger().warning(error_msg)
|
223
|
+
return "Untitled"
|
224
|
+
|
225
|
+
@classmethod
|
226
|
+
def _extract_text_from_rich_text(cls, rich_text: List[Dict[str, Any]]) -> str:
|
227
|
+
"""
|
228
|
+
Extract plain text from a rich text array.
|
229
|
+
|
230
|
+
Args:
|
231
|
+
rich_text: A list of rich text objects from the Notion API
|
232
|
+
|
233
|
+
Returns:
|
234
|
+
The combined plain text content
|
235
|
+
"""
|
236
|
+
if not rich_text:
|
237
|
+
return ""
|
238
|
+
|
239
|
+
text_parts = []
|
240
|
+
for text_obj in rich_text:
|
241
|
+
if "plain_text" in text_obj:
|
242
|
+
text_parts.append(text_obj["plain_text"])
|
243
|
+
|
244
|
+
return "".join(text_parts)
|
245
|
+
|
246
|
+
|
247
|
+
async def demo():
|
248
|
+
clipboard = await NotionPageFactory.from_page_name("Jarvis Clipboard")
|
249
|
+
icon = await clipboard.get_icon()
|
250
|
+
print(f"Icon: {icon}")
|
251
|
+
|
252
|
+
|
253
|
+
if __name__ == "__main__":
|
254
|
+
import asyncio
|
255
|
+
|
256
|
+
asyncio.run(demo())
|
@@ -1,17 +1,17 @@
|
|
1
1
|
from typing import Dict, Any, List, Optional
|
2
|
-
from notionary.
|
3
|
-
from notionary.
|
4
|
-
from notionary.
|
2
|
+
from notionary.notion_client import NotionClient
|
3
|
+
from notionary.page.metadata.metadata_editor import MetadataEditor
|
4
|
+
from notionary.page.properites.property_operation_result import (
|
5
5
|
PropertyOperationResult,
|
6
6
|
)
|
7
|
-
from notionary.
|
7
|
+
from notionary.page.relations.notion_page_title_resolver import (
|
8
8
|
NotionPageTitleResolver,
|
9
9
|
)
|
10
|
-
from notionary.
|
10
|
+
from notionary.page.properites.database_property_service import (
|
11
11
|
DatabasePropertyService,
|
12
12
|
)
|
13
|
-
from notionary.
|
14
|
-
from notionary.
|
13
|
+
from notionary.page.relations.page_database_relation import PageDatabaseRelation
|
14
|
+
from notionary.page.properites.property_value_extractor import (
|
15
15
|
PropertyValueExtractor,
|
16
16
|
)
|
17
17
|
from notionary.util.logging_mixin import LoggingMixin
|
@@ -1,9 +1,9 @@
|
|
1
1
|
from typing import Any, Dict, List, Optional
|
2
|
-
from notionary.
|
3
|
-
from notionary.
|
2
|
+
from notionary.notion_client import NotionClient
|
3
|
+
from notionary.page.relations.notion_page_title_resolver import (
|
4
4
|
NotionPageTitleResolver,
|
5
5
|
)
|
6
|
-
from notionary.
|
6
|
+
from notionary.page.relations.relation_operation_result import (
|
7
7
|
RelationOperationResult,
|
8
8
|
)
|
9
9
|
from notionary.util.logging_mixin import LoggingMixin
|
notionary/util/page_id_utils.py
CHANGED
@@ -27,7 +27,9 @@ def format_uuid(value: str) -> Optional[str]:
|
|
27
27
|
return extract_uuid(value)
|
28
28
|
|
29
29
|
|
30
|
-
def extract_and_validate_page_id(
|
30
|
+
def extract_and_validate_page_id(
|
31
|
+
page_id: Optional[str] = None, url: Optional[str] = None
|
32
|
+
) -> str:
|
31
33
|
if not page_id and not url:
|
32
34
|
raise ValueError("Either page_id or url must be provided")
|
33
35
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
notionary/__init__.py,sha256=kG1u5pB2PCrr2aXG4B1YhVqucPqU_LG-qyw5t5Bjayw,739
|
2
|
+
notionary/notion_client.py,sha256=VdIE1TSEZTy2BhR7Hnx_McndvQYxlu-aJN_7LeDpXgY,4497
|
3
|
+
notionary/converters/__init__.py,sha256=GOUehJbe4BKHtec1MqL1YGu3AX8zFtkwSZfhYkY5-P0,1798
|
4
|
+
notionary/converters/markdown_to_notion_converter.py,sha256=xmoXpE7KqaueUHAcDt76BTDUE_tNv4QbNtgBgX_YAXk,15100
|
5
|
+
notionary/converters/notion_to_markdown_converter.py,sha256=aX2qabOI6cp3bYOfDxJtODQYBQCp_zRFlezLXjwFV9Q,1277
|
6
|
+
notionary/converters/elements/audio_element.py,sha256=jCCReh0pBKjB4Dq46XZMkKJ1ZZy0DvjgFbeQKW5VGzM,5600
|
7
|
+
notionary/converters/elements/bookmark_element.py,sha256=Ki0Tv3lpYmo6g7OKtXg9smzMtbB2C5O9Qfr6QF8goko,8588
|
8
|
+
notionary/converters/elements/callout_element.py,sha256=tUUzTrt0JXhvvvnxCdF-KPp9mVsil_6bmUBhDeeRrYg,5954
|
9
|
+
notionary/converters/elements/code_block_element.py,sha256=wZh3LXA5qsan0Z9w7SnRKWJMYrw5cT7cfHZ61RtRKM8,5184
|
10
|
+
notionary/converters/elements/column_element.py,sha256=5i6jODlsaGz5S7gJFEzTYnmf1yPyM1-8oMJvJp3EUno,10717
|
11
|
+
notionary/converters/elements/divider_element.py,sha256=6Zv15SXLFkXo6HkiQ_iXGd_FfFr3tEObXrlNiw1gE2g,2787
|
12
|
+
notionary/converters/elements/embed_element.py,sha256=PMF2th4eSjKWUqkxgb0hTvt-ZO2W5mGspMExn_UBa2U,4779
|
13
|
+
notionary/converters/elements/heading_element.py,sha256=L-VZaXO1uFnfGNWkTmtHg5YXKLncR23MVFJvwJtqSuA,2778
|
14
|
+
notionary/converters/elements/image_element.py,sha256=sz5nXZzKTBb0U6QULOMVQ4XBdAHi6yOh9-TTodz_0-Q,4856
|
15
|
+
notionary/converters/elements/list_element.py,sha256=CRp8R1Kxn01dqZNal9EaAwV2D3Z4c_sXRZ0crZ4OTOI,4868
|
16
|
+
notionary/converters/elements/notion_block_element.py,sha256=lLRBDXhBeRaRzkbvdpYpr-U9nbkd62oVtqdSe-svT4c,1746
|
17
|
+
notionary/converters/elements/paragraph_element.py,sha256=-gIZr5MD_b7akh9euQ95PsiQlhvswC2S1VFgwBXRFQQ,2756
|
18
|
+
notionary/converters/elements/qoute_element.py,sha256=3Nr62ddgr4erncdBs-xhb2OMiPhlXAKuoqu-3hefTRc,9052
|
19
|
+
notionary/converters/elements/table_element.py,sha256=7eqFMYxZUx7aG25WEp1cNSMHDkKTWwZvUVpq4dTnvHc,11244
|
20
|
+
notionary/converters/elements/text_inline_formatter.py,sha256=FE_Sq2cozpu5RVtMbnPq21gD06UjH3LMRYr3s16JKYo,10606
|
21
|
+
notionary/converters/elements/todo_lists.py,sha256=6d74O11TfCr5umQa2xrsIiUv3PB9sZoDcWdfg21M7po,4255
|
22
|
+
notionary/converters/elements/toggle_element.py,sha256=69JSanxAGPXKwpBsMtXlvW0aCn080Me4gwk_DxTxM2Q,7253
|
23
|
+
notionary/converters/elements/video_element.py,sha256=XKfZcG8m8lZ5RyQGz_GgZCGPCMY3SjcvyuRJ6P1ymMI,6042
|
24
|
+
notionary/converters/registry/block_element_registry.py,sha256=Bi1DlEdP8xloqh_YeTh1PKzOKxtS1u1W-lu8kEcXY94,8690
|
25
|
+
notionary/converters/registry/block_element_registry_builder.py,sha256=UMJNE3bVMNqwTeA5pvNf-_gxYzIuUX1AOy1sYQXlBs4,9367
|
26
|
+
notionary/database/database_discovery.py,sha256=qDGFhXG9s-_6CXdRg8tMiwX4dvX7jLjgAUFPSNlYtlI,4506
|
27
|
+
notionary/database/database_info_service.py,sha256=Ig6gx8jUSPYORJvfgEV5kV6t72pZQsWU8HPMqd43B-o,1336
|
28
|
+
notionary/database/notion_database.py,sha256=RY5MlXNE5DVNWLC_Derljsz87ZMHkE-05Vgm80kvLxg,7250
|
29
|
+
notionary/database/notion_database_factory.py,sha256=Af57yaUHidD8TKJ8uyXOc2nnqHm7on6VGFdDRjxiq9o,6692
|
30
|
+
notionary/database/models/page_result.py,sha256=Vmm5_oYpYAkIIJVoTd1ZZGloeC3cmFLMYP255mAmtaw,233
|
31
|
+
notionary/exceptions/database_exceptions.py,sha256=I-Tx6bYRLpi5pjGPtbT-Mqxvz3BFgYTiuZxknJeLxtI,2638
|
32
|
+
notionary/exceptions/page_creation_exception.py,sha256=4v7IuZD6GsQLrqhDLriGjuG3ML638gAO53zDCrLePuU,281
|
33
|
+
notionary/page/notion_page.py,sha256=u5lPCteJ5Bz89N40TlwF2cHjHAMmwYOi2NHMo5neJZU,17003
|
34
|
+
notionary/page/notion_page_factory.py,sha256=ucTrAaXvlD4pzfqRXfhygldfD8MLx4n23XpsWESXEr4,8466
|
35
|
+
notionary/page/content/notion_page_content_chunker.py,sha256=xRks74Dqec-De6-AVTxMPnXs-MSJBzSm1HfJfaHiKr8,3330
|
36
|
+
notionary/page/content/page_content_manager.py,sha256=X4p6jBJpFpOhtbiH2BOzwoAnWRLz1EDauV16QYJMW58,3942
|
37
|
+
notionary/page/metadata/metadata_editor.py,sha256=61uiw8oB25O8ePhytoJvZDetuof5sjPoM6aoHZGo4wc,4949
|
38
|
+
notionary/page/metadata/notion_icon_manager.py,sha256=ixZrWsHGVpmF05Ncy9LCt8vZlKAQHYFZW-2yI5JZZDI,1426
|
39
|
+
notionary/page/metadata/notion_page_cover_manager.py,sha256=qgQxQE-bx4oWjLFUQvpXD5GzO1Mx7w7htz1xC2BOqUg,1717
|
40
|
+
notionary/page/properites/database_property_service.py,sha256=AJuBGahbb53VQa6IGGHxBMoOgCy6vFZg08uR_eDjNUs,11570
|
41
|
+
notionary/page/properites/page_property_manager.py,sha256=Xl8Cwn8WVszqpFXT_NvASkmP5igpCTEgRVhG_F45424,6914
|
42
|
+
notionary/page/properites/property_formatter.py,sha256=d_Nr5XQxgjB6VIS0u3ey14MOUKY416o_BvdXjbkUNAQ,3667
|
43
|
+
notionary/page/properites/property_operation_result.py,sha256=PhxHJJxxG2BdDl7aswhWnMSmf9RQtoinKkRHDoqxwCs,3913
|
44
|
+
notionary/page/properites/property_value_extractor.py,sha256=1BfyCYrFzfIUmNTozavrLTjG--6P6Dy2tkewf6rHHwQ,2353
|
45
|
+
notionary/page/relations/notion_page_relation_manager.py,sha256=D7JZJLXjX2Jn3CIseJxoMK9qL9gp88t4NmL9Ihu06eg,12682
|
46
|
+
notionary/page/relations/notion_page_title_resolver.py,sha256=jUYsEkfyDgdh77oh2awYEB5g1vQqLBq6xYSXL-4uPH8,1722
|
47
|
+
notionary/page/relations/page_database_relation.py,sha256=F9aGXFjjL8ZLNbfTGeGm_QAyXhz2AEOw7GgDLdprEcE,2313
|
48
|
+
notionary/page/relations/relation_operation_result.py,sha256=NDxBzGntOxc_89ti-HG8xDSqfY6PwyGHKHrrKbCzNjM,5010
|
49
|
+
notionary/util/logging_mixin.py,sha256=fKsx9t90bwvL74ZX3dU-sXdC4TZCQyO6qU9I8txkw_U,1369
|
50
|
+
notionary/util/page_id_utils.py,sha256=EYNMxgf-7ghzL5K8lKZBZfW7g5CsdY0Xuj4IYmU8RPk,1381
|
51
|
+
notionary/util/singleton_decorator.py,sha256=GTNMfIlVNRUVMw_c88xqd12-DcqZJjmyidN54yqiNVw,472
|
52
|
+
notionary-0.1.13.dist-info/licenses/LICENSE,sha256=zOm3cRT1qD49eg7vgw95MI79rpUAZa1kRBFwL2FkAr8,1120
|
53
|
+
notionary-0.1.13.dist-info/METADATA,sha256=oVy9WSKlRNiV1Hg_hnf8z4ZfZgo-bBl6qaF0S6zX0Z4,6154
|
54
|
+
notionary-0.1.13.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
55
|
+
notionary-0.1.13.dist-info/top_level.txt,sha256=fhONa6BMHQXqthx5PanWGbPL0b8rdFqhrJKVLf_adSs,10
|
56
|
+
notionary-0.1.13.dist-info/RECORD,,
|