notionary 0.2.19__py3-none-any.whl → 0.2.21__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 (205) hide show
  1. notionary/__init__.py +8 -4
  2. notionary/base_notion_client.py +3 -1
  3. notionary/blocks/__init__.py +2 -91
  4. notionary/blocks/_bootstrap.py +263 -0
  5. notionary/blocks/audio/__init__.py +8 -2
  6. notionary/blocks/audio/audio_element.py +42 -104
  7. notionary/blocks/audio/audio_markdown_node.py +3 -1
  8. notionary/blocks/audio/audio_models.py +6 -55
  9. notionary/blocks/base_block_element.py +30 -0
  10. notionary/blocks/bookmark/__init__.py +9 -2
  11. notionary/blocks/bookmark/bookmark_element.py +46 -139
  12. notionary/blocks/bookmark/bookmark_markdown_node.py +3 -1
  13. notionary/blocks/bookmark/bookmark_models.py +15 -0
  14. notionary/blocks/breadcrumbs/__init__.py +17 -0
  15. notionary/blocks/breadcrumbs/breadcrumb_element.py +39 -0
  16. notionary/blocks/breadcrumbs/breadcrumb_markdown_node.py +32 -0
  17. notionary/blocks/breadcrumbs/breadcrumb_models.py +12 -0
  18. notionary/blocks/bulleted_list/__init__.py +12 -2
  19. notionary/blocks/bulleted_list/bulleted_list_element.py +40 -55
  20. notionary/blocks/bulleted_list/bulleted_list_markdown_node.py +2 -1
  21. notionary/blocks/bulleted_list/bulleted_list_models.py +18 -0
  22. notionary/blocks/callout/__init__.py +9 -2
  23. notionary/blocks/callout/callout_element.py +40 -89
  24. notionary/blocks/callout/callout_markdown_node.py +3 -1
  25. notionary/blocks/callout/callout_models.py +33 -0
  26. notionary/blocks/child_database/__init__.py +7 -0
  27. notionary/blocks/child_database/child_database_models.py +19 -0
  28. notionary/blocks/child_page/__init__.py +9 -0
  29. notionary/blocks/child_page/child_page_models.py +12 -0
  30. notionary/blocks/{shared/block_client.py → client.py} +55 -54
  31. notionary/blocks/code/__init__.py +6 -2
  32. notionary/blocks/code/code_element.py +53 -187
  33. notionary/blocks/code/code_markdown_node.py +13 -13
  34. notionary/blocks/code/code_models.py +94 -0
  35. notionary/blocks/column/__init__.py +25 -1
  36. notionary/blocks/column/column_element.py +40 -314
  37. notionary/blocks/column/column_list_element.py +37 -0
  38. notionary/blocks/column/column_list_markdown_node.py +50 -0
  39. notionary/blocks/column/column_markdown_node.py +59 -0
  40. notionary/blocks/column/column_models.py +26 -0
  41. notionary/blocks/divider/__init__.py +9 -2
  42. notionary/blocks/divider/divider_element.py +26 -49
  43. notionary/blocks/divider/divider_markdown_node.py +2 -1
  44. notionary/blocks/divider/divider_models.py +12 -0
  45. notionary/blocks/embed/__init__.py +9 -2
  46. notionary/blocks/embed/embed_element.py +47 -114
  47. notionary/blocks/embed/embed_markdown_node.py +3 -1
  48. notionary/blocks/embed/embed_models.py +14 -0
  49. notionary/blocks/equation/__init__.py +14 -0
  50. notionary/blocks/equation/equation_element.py +80 -0
  51. notionary/blocks/equation/equation_element_markdown_node.py +36 -0
  52. notionary/blocks/equation/equation_models.py +11 -0
  53. notionary/blocks/file/__init__.py +25 -0
  54. notionary/blocks/file/file_element.py +93 -0
  55. notionary/blocks/file/file_element_markdown_node.py +35 -0
  56. notionary/blocks/file/file_element_models.py +39 -0
  57. notionary/blocks/heading/__init__.py +16 -2
  58. notionary/blocks/heading/heading_element.py +67 -72
  59. notionary/blocks/heading/heading_markdown_node.py +2 -1
  60. notionary/blocks/heading/heading_models.py +29 -0
  61. notionary/blocks/image_block/__init__.py +13 -0
  62. notionary/blocks/image_block/image_element.py +84 -0
  63. notionary/blocks/{image → image_block}/image_markdown_node.py +3 -1
  64. notionary/blocks/image_block/image_models.py +10 -0
  65. notionary/blocks/models.py +172 -0
  66. notionary/blocks/numbered_list/__init__.py +12 -2
  67. notionary/blocks/numbered_list/numbered_list_element.py +33 -58
  68. notionary/blocks/numbered_list/numbered_list_markdown_node.py +3 -1
  69. notionary/blocks/numbered_list/numbered_list_models.py +17 -0
  70. notionary/blocks/paragraph/__init__.py +12 -2
  71. notionary/blocks/paragraph/paragraph_element.py +27 -69
  72. notionary/blocks/paragraph/paragraph_markdown_node.py +2 -1
  73. notionary/blocks/paragraph/paragraph_models.py +16 -0
  74. notionary/blocks/pdf/__init__.py +13 -0
  75. notionary/blocks/pdf/pdf_element.py +91 -0
  76. notionary/blocks/pdf/pdf_markdown_node.py +35 -0
  77. notionary/blocks/pdf/pdf_models.py +11 -0
  78. notionary/blocks/quote/__init__.py +11 -2
  79. notionary/blocks/quote/quote_element.py +31 -65
  80. notionary/blocks/quote/quote_markdown_node.py +4 -1
  81. notionary/blocks/quote/quote_models.py +18 -0
  82. notionary/blocks/registry/__init__.py +4 -0
  83. notionary/blocks/registry/block_registry.py +75 -91
  84. notionary/blocks/registry/block_registry_builder.py +107 -59
  85. notionary/blocks/rich_text/__init__.py +33 -0
  86. notionary/blocks/rich_text/rich_text_models.py +188 -0
  87. notionary/blocks/rich_text/text_inline_formatter.py +125 -0
  88. notionary/blocks/table/__init__.py +16 -2
  89. notionary/blocks/table/table_element.py +48 -241
  90. notionary/blocks/table/table_markdown_node.py +2 -1
  91. notionary/blocks/table/table_models.py +28 -0
  92. notionary/blocks/table_of_contents/__init__.py +19 -0
  93. notionary/blocks/table_of_contents/table_of_contents_element.py +51 -0
  94. notionary/blocks/table_of_contents/table_of_contents_markdown_node.py +35 -0
  95. notionary/blocks/table_of_contents/table_of_contents_models.py +18 -0
  96. notionary/blocks/todo/__init__.py +9 -2
  97. notionary/blocks/todo/todo_element.py +38 -95
  98. notionary/blocks/todo/todo_markdown_node.py +2 -1
  99. notionary/blocks/todo/todo_models.py +19 -0
  100. notionary/blocks/toggle/__init__.py +13 -3
  101. notionary/blocks/toggle/toggle_element.py +57 -264
  102. notionary/blocks/toggle/toggle_markdown_node.py +24 -14
  103. notionary/blocks/toggle/toggle_models.py +17 -0
  104. notionary/blocks/toggleable_heading/__init__.py +6 -2
  105. notionary/blocks/toggleable_heading/toggleable_heading_element.py +74 -244
  106. notionary/blocks/toggleable_heading/toggleable_heading_markdown_node.py +26 -18
  107. notionary/blocks/types.py +61 -0
  108. notionary/blocks/video/__init__.py +8 -2
  109. notionary/blocks/video/video_element.py +67 -143
  110. notionary/blocks/video/video_element_models.py +10 -0
  111. notionary/blocks/video/video_markdown_node.py +3 -1
  112. notionary/database/client.py +3 -8
  113. notionary/database/database.py +13 -14
  114. notionary/database/database_filter_builder.py +2 -2
  115. notionary/database/database_provider.py +5 -4
  116. notionary/database/models.py +337 -0
  117. notionary/database/notion_database.py +6 -7
  118. notionary/file_upload/client.py +5 -7
  119. notionary/file_upload/models.py +2 -1
  120. notionary/file_upload/notion_file_upload.py +2 -3
  121. notionary/markdown/markdown_builder.py +722 -0
  122. notionary/markdown/markdown_document_model.py +228 -0
  123. notionary/{blocks → markdown}/markdown_node.py +1 -0
  124. notionary/models/notion_database_response.py +0 -338
  125. notionary/page/client.py +9 -10
  126. notionary/page/models.py +327 -0
  127. notionary/page/notion_page.py +99 -52
  128. notionary/page/notion_text_length_utils.py +119 -0
  129. notionary/page/{content/page_content_writer.py → page_content_writer.py} +88 -38
  130. notionary/page/reader/handler/__init__.py +17 -0
  131. notionary/page/reader/handler/base_block_renderer.py +44 -0
  132. notionary/page/reader/handler/block_processing_context.py +35 -0
  133. notionary/page/reader/handler/block_rendering_context.py +43 -0
  134. notionary/page/reader/handler/column_list_renderer.py +51 -0
  135. notionary/page/reader/handler/column_renderer.py +60 -0
  136. notionary/page/reader/handler/line_renderer.py +60 -0
  137. notionary/page/reader/handler/toggle_renderer.py +69 -0
  138. notionary/page/reader/handler/toggleable_heading_renderer.py +89 -0
  139. notionary/page/reader/page_content_retriever.py +69 -0
  140. notionary/page/search_filter_builder.py +2 -1
  141. notionary/page/writer/handler/__init__.py +22 -0
  142. notionary/page/writer/handler/code_handler.py +100 -0
  143. notionary/page/writer/handler/column_handler.py +141 -0
  144. notionary/page/writer/handler/column_list_handler.py +139 -0
  145. notionary/page/writer/handler/line_handler.py +35 -0
  146. notionary/page/writer/handler/line_processing_context.py +54 -0
  147. notionary/page/writer/handler/regular_line_handler.py +92 -0
  148. notionary/page/writer/handler/table_handler.py +130 -0
  149. notionary/page/writer/handler/toggle_handler.py +153 -0
  150. notionary/page/writer/handler/toggleable_heading_handler.py +167 -0
  151. notionary/page/writer/markdown_to_notion_converter.py +76 -0
  152. notionary/telemetry/__init__.py +2 -2
  153. notionary/telemetry/service.py +4 -3
  154. notionary/user/__init__.py +2 -2
  155. notionary/user/base_notion_user.py +2 -1
  156. notionary/user/client.py +2 -3
  157. notionary/user/models.py +1 -0
  158. notionary/user/notion_bot_user.py +4 -5
  159. notionary/user/notion_user.py +3 -4
  160. notionary/user/notion_user_manager.py +3 -2
  161. notionary/user/notion_user_provider.py +1 -1
  162. notionary/util/__init__.py +3 -2
  163. notionary/util/fuzzy.py +2 -1
  164. notionary/util/logging_mixin.py +2 -2
  165. notionary/util/singleton_metaclass.py +1 -1
  166. notionary/workspace.py +3 -2
  167. {notionary-0.2.19.dist-info → notionary-0.2.21.dist-info}/METADATA +12 -8
  168. notionary-0.2.21.dist-info/RECORD +185 -0
  169. notionary/blocks/document/__init__.py +0 -7
  170. notionary/blocks/document/document_element.py +0 -102
  171. notionary/blocks/document/document_markdown_node.py +0 -31
  172. notionary/blocks/image/__init__.py +0 -7
  173. notionary/blocks/image/image_element.py +0 -151
  174. notionary/blocks/markdown_builder.py +0 -356
  175. notionary/blocks/mention/__init__.py +0 -7
  176. notionary/blocks/mention/mention_element.py +0 -229
  177. notionary/blocks/mention/mention_markdown_node.py +0 -38
  178. notionary/blocks/prompts/element_prompt_builder.py +0 -83
  179. notionary/blocks/prompts/element_prompt_content.py +0 -41
  180. notionary/blocks/shared/__init__.py +0 -0
  181. notionary/blocks/shared/models.py +0 -713
  182. notionary/blocks/shared/notion_block_element.py +0 -37
  183. notionary/blocks/shared/text_inline_formatter.py +0 -262
  184. notionary/blocks/shared/text_inline_formatter_new.py +0 -139
  185. notionary/blocks/toggleable_heading/toggleable_heading_models.py +0 -0
  186. notionary/database/models/page_result.py +0 -10
  187. notionary/elements/__init__.py +0 -0
  188. notionary/models/notion_block_response.py +0 -264
  189. notionary/models/notion_page_response.py +0 -78
  190. notionary/models/search_response.py +0 -0
  191. notionary/page/__init__.py +0 -0
  192. notionary/page/content/notion_text_length_utils.py +0 -87
  193. notionary/page/content/page_content_retriever.py +0 -60
  194. notionary/page/formatting/line_processor.py +0 -153
  195. notionary/page/formatting/markdown_to_notion_converter.py +0 -153
  196. notionary/page/markdown_syntax_prompt_generator.py +0 -114
  197. notionary/page/notion_to_markdown_converter.py +0 -179
  198. notionary/page/properites/property_value_extractor.py +0 -0
  199. notionary-0.2.19.dist-info/RECORD +0 -150
  200. /notionary/{blocks/document/document_models.py → markdown/___init__.py} +0 -0
  201. /notionary/{blocks/image/image_models.py → markdown/makdown_document_model.py} +0 -0
  202. /notionary/page/{content/markdown_whitespace_processor.py → markdown_whitespace_processor.py} +0 -0
  203. /notionary/{blocks/mention/mention_models.py → page/reader/handler/context.py} +0 -0
  204. {notionary-0.2.19.dist-info → notionary-0.2.21.dist-info}/LICENSE +0 -0
  205. {notionary-0.2.19.dist-info → notionary-0.2.21.dist-info}/WHEEL +0 -0
notionary/user/models.py CHANGED
@@ -1,5 +1,6 @@
1
1
  from dataclasses import dataclass
2
2
  from typing import Literal, Optional
3
+
3
4
  from pydantic import BaseModel
4
5
 
5
6
 
@@ -1,11 +1,10 @@
1
1
  from __future__ import annotations
2
- from typing import Optional, List
2
+
3
+ from typing import List, Optional
4
+
3
5
  from notionary.user.base_notion_user import BaseNotionUser
4
6
  from notionary.user.client import NotionUserClient
5
- from notionary.user.models import (
6
- NotionBotUserResponse,
7
- WorkspaceLimits,
8
- )
7
+ from notionary.user.models import NotionBotUserResponse, WorkspaceLimits
9
8
  from notionary.util import factory_only
10
9
  from notionary.util.fuzzy import find_best_match
11
10
 
@@ -1,11 +1,10 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional, List
3
+ from typing import List, Optional
4
+
4
5
  from notionary.user.base_notion_user import BaseNotionUser
5
6
  from notionary.user.client import NotionUserClient
6
- from notionary.user.models import (
7
- NotionUserResponse,
8
- )
7
+ from notionary.user.models import NotionUserResponse
9
8
  from notionary.util import factory_only
10
9
  from notionary.util.fuzzy import find_best_matches
11
10
 
@@ -1,7 +1,8 @@
1
- from typing import Any, Dict, Optional, List
1
+ from typing import Any, Dict, List, Optional
2
+
2
3
  from notionary.user.client import NotionUserClient
3
- from notionary.user.notion_user import NotionUser
4
4
  from notionary.user.models import NotionUsersListResponse
5
+ from notionary.user.notion_user import NotionUser
5
6
  from notionary.util import LoggingMixin
6
7
 
7
8
 
@@ -1 +1 @@
1
- # for caching shit
1
+ # for caching shit
@@ -1,13 +1,14 @@
1
+ from .factory_only import factory_only
1
2
  from .logging_mixin import LoggingMixin
3
+ from .page_id_utils import extract_uuid, format_uuid
2
4
  from .singleton import singleton
3
- from .page_id_utils import format_uuid
4
- from .factory_only import factory_only
5
5
  from .singleton_metaclass import SingletonMetaClass
6
6
 
7
7
  __all__ = [
8
8
  "LoggingMixin",
9
9
  "singleton",
10
10
  "format_uuid",
11
+ "extract_uuid",
11
12
  "factory_only",
12
13
  "singleton",
13
14
  "SingletonMetaClass",
notionary/util/fuzzy.py CHANGED
@@ -1,7 +1,8 @@
1
1
  from __future__ import annotations
2
+
2
3
  import difflib
3
- from typing import List, Any, TypeVar, Callable, Optional
4
4
  from dataclasses import dataclass
5
+ from typing import Any, Callable, List, Optional, TypeVar
5
6
 
6
7
  T = TypeVar("T")
7
8
 
@@ -1,7 +1,7 @@
1
1
  import logging
2
- from typing import Optional, ClassVar
3
-
4
2
  import os
3
+ from typing import ClassVar, Optional
4
+
5
5
  from dotenv import load_dotenv
6
6
 
7
7
  load_dotenv()
@@ -1,4 +1,4 @@
1
- from typing import TypeVar, Dict, Any, Type, cast
1
+ from typing import Any, Dict, Type, TypeVar, cast
2
2
 
3
3
  T = TypeVar("T")
4
4
 
notionary/workspace.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import asyncio
2
- from typing import Optional, List
3
- from notionary import NotionPage, NotionDatabase
2
+ from typing import List, Optional
3
+
4
+ from notionary import NotionDatabase, NotionPage
4
5
  from notionary.database.client import NotionDatabaseClient
5
6
  from notionary.page.client import NotionPageClient
6
7
  from notionary.user import NotionUser, NotionUserManager
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: notionary
3
- Version: 0.2.19
3
+ Version: 0.2.21
4
4
  Summary: Python library for programmatic Notion workspace management - databases, pages, and content with advanced Markdown support
5
5
  License: MIT
6
6
  Author: Mathis Arends
@@ -15,6 +15,7 @@ Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
16
  Requires-Dist: aiofiles (>=24.1.0,<25.0.0)
17
17
  Requires-Dist: httpx (>=0.28.0)
18
+ Requires-Dist: isort (>=6.0.1,<7.0.0)
18
19
  Requires-Dist: posthog (>=6.3.1,<7.0.0)
19
20
  Requires-Dist: pydantic (>=2.11.4)
20
21
  Requires-Dist: python-dotenv (>=1.1.0)
@@ -36,11 +37,11 @@ Description-Content-Type: text/markdown
36
37
  - **Rich Markdown to Notion**: Convert extended Markdown (callouts, toggles, columns) directly into beautiful Notion blocks
37
38
  - **Smart Discovery**: Find pages and databases by name with fuzzy matching - no more hunting for URLs
38
39
  - **Async-First Architecture**: Built for modern Python with full async/await support and high performance
39
- - **AI-Ready Integration**: Generate LLM system prompts and let AI agents create Notion content seamlessly
40
40
 
41
41
  ---
42
42
 
43
43
  # Quick start
44
+
44
45
  ```bash
45
46
  pip install notionary
46
47
  ```
@@ -53,29 +54,30 @@ NOTION_SECRET=YOUR_INTEGRATION_KEY
53
54
  ```
54
55
 
55
56
  ### Creating and Managing Pages 🚀
57
+
56
58
  ```python
57
59
  from notionary import NotionPage
58
60
 
59
61
  async def main():
60
62
  # Simpy find an existing page by its title
61
63
  page = await NotionPage.from_page_name("My Test Page")
62
-
64
+
63
65
  # Add rich content with custom Markdown
64
66
  content = """
65
67
  # 🚀 Generated with Notionary
66
-
68
+
67
69
  !> [💡] This page was created programmatically!
68
-
70
+
69
71
  ## Features
70
72
  - **Rich** Markdown support
71
73
  - Database integration
72
74
  - AI-ready content generation
73
-
75
+
74
76
  +++ Click to see more details
75
77
  | Notionary makes it easy to create beautiful Notion pages
76
78
  | directly from Python code with intuitive Markdown syntax.
77
79
  """
78
-
80
+
79
81
  await page.replace_content(content)
80
82
  print(f"✅ Page updated: {page.url}")
81
83
 
@@ -99,7 +101,7 @@ async def main():
99
101
  await page.set_title("🆕 New Project Entry")
100
102
  await page.set_property_value_by_name("Status", "In Progress")
101
103
  await page.set_property_value_by_name("Priority", "High")
102
-
104
+
103
105
  # find pages created in the last 7 days
104
106
  count = 0
105
107
  async for page in db.iter_pages_with_filter(
@@ -201,6 +203,7 @@ def hello_world():
201
203
  Explore the `examples/` directory for comprehensive guides:
202
204
 
203
205
  ### 🚀 Core Examples
206
+
204
207
  - [**Page Management**](examples/page_example.py) - Create, update, and manage Notion pages
205
208
  - [**Page Operations**](examples/page.py) - Advanced page manipulation and content handling
206
209
  - [**Database Operations**](examples/database.py) - Connect to and manage Notion databases
@@ -208,6 +211,7 @@ Explore the `examples/` directory for comprehensive guides:
208
211
  - [**Workspace Discovery**](examples/workspace_discovery.py) - Explore and discover your Notion workspace
209
212
 
210
213
  ### 📝 Markdown Examples
214
+
211
215
  - [**Basic Formatting**](examples/markdown/basic.py) - Text formatting, lists, and basic elements
212
216
  - [**Callouts**](examples/markdown/callout.py) - Create beautiful callout blocks with icons
213
217
  - [**Toggles**](examples/markdown/toggle.py) - Collapsible content sections
@@ -0,0 +1,185 @@
1
+ notionary/__init__.py,sha256=u6I31uJ8E_lqg17QIzylzz-mnvnLc4hmVuBGvnDwFgI,607
2
+ notionary/base_notion_client.py,sha256=EKExy91oeVHdknK-XU2IkKB6SJgN96ZfbblRK05wnV4,7071
3
+ notionary/blocks/__init__.py,sha256=CGaDCEmUepqnjkcm7X1OKdxAhtbcIZAu3fxJeySyu6o,76
4
+ notionary/blocks/_bootstrap.py,sha256=8leYmTKgbOSouqJFRnEQAhEjCT-fmeb7LZvFCBcjdEY,9199
5
+ notionary/blocks/audio/__init__.py,sha256=3158rsK4MIO_vBQV0kfZWIOKd5Cout72bdJljP-f7KM,368
6
+ notionary/blocks/audio/audio_element.py,sha256=6VrAMbdgZNB7pQ7YSseK0s4cMGfsMWSb8HffFJF5ouA,3260
7
+ notionary/blocks/audio/audio_markdown_node.py,sha256=CD2OXFh1p4ZfA6aq8HM4f_uh9AcIISKxyRSKcgm0P9Y,837
8
+ notionary/blocks/audio/audio_models.py,sha256=ts281Wgjh0FQBK4a6IKKNGPcG0U18T1euCgo83-JSg4,229
9
+ notionary/blocks/base_block_element.py,sha256=WXQIf6StrD5EcS6wtlaZ03fJTWQ-07qH9qPsqzwsvHU,1009
10
+ notionary/blocks/bookmark/__init__.py,sha256=ofLnuXlG-y0C3ex-noLA92iXUFjiej5CyrxVXG_1db4,447
11
+ notionary/blocks/bookmark/bookmark_element.py,sha256=iDMFKv_lzHStuVwWe5Hpmjw5AWwkFW3fyC2_a4_QZNo,2684
12
+ notionary/blocks/bookmark/bookmark_markdown_node.py,sha256=p0JcXtH7PA09JpkhxKsOb3ajwsypHMk_2sh0WahN52M,1446
13
+ notionary/blocks/bookmark/bookmark_models.py,sha256=kJTitF93xd0YITvP_FuwpjnBUNLeDMr7fDAXV8MAJrk,375
14
+ notionary/blocks/breadcrumbs/__init__.py,sha256=vw7--1u5TAcX4l3J0eu98HbxG6wxsnPrkt7YouT_ESA,498
15
+ notionary/blocks/breadcrumbs/breadcrumb_element.py,sha256=NGS5AgXs4mFCWDDrKyXPKPpEo1F0_bTaP2AYzPSkmDU,1256
16
+ notionary/blocks/breadcrumbs/breadcrumb_markdown_node.py,sha256=tbcQOzMHx-dQGa5UAE2jowzPM_wItsb76bCGU4YIKw4,745
17
+ notionary/blocks/breadcrumbs/breadcrumb_models.py,sha256=-XGIIMYiQuGe5iXmW-1Y9Y9Yca0w6u3HbiD1SBue8sI,237
18
+ notionary/blocks/bulleted_list/__init__.py,sha256=2EvFm2h-X6KUHGQhQiOYBqh-DvZbL0qT453eokd8eyw,549
19
+ notionary/blocks/bulleted_list/bulleted_list_element.py,sha256=ctNT9GrYjkPBc5sS7HUssOAKMrfj1Pi4fG7bNrYJwCI,2195
20
+ notionary/blocks/bulleted_list/bulleted_list_markdown_node.py,sha256=1MmGbQAbkeV3vwPlqC4ItcR-Abw8JymYWyGLEV2-HfI,827
21
+ notionary/blocks/bulleted_list/bulleted_list_models.py,sha256=2rOHv8KIfTcx0z4JtK968BnLc4lkCrF8So-e5QL_FEY,561
22
+ notionary/blocks/callout/__init__.py,sha256=iDLuJ4szAOY4tCL0NK_bqCzlTC109o51c1cGgDoruZg,431
23
+ notionary/blocks/callout/callout_element.py,sha256=0U05Y1xPiBJQAs8sUoZD157-nHZEqSdkQ6eEDF5H6O0,2616
24
+ notionary/blocks/callout/callout_markdown_node.py,sha256=TMd2wQ0BfoQ0mgHSy5MrqCvpJvovSw7zsLrXnRrJoQs,948
25
+ notionary/blocks/callout/callout_models.py,sha256=KabWhRCkW1KmTGqt23QTc5iCeVczIzRHIVevEagcKE0,860
26
+ notionary/blocks/child_database/__init__.py,sha256=1o23CkXjJVsjZPuypTKUIPmHPrrJMq9XPlRSbjmoUMo,160
27
+ notionary/blocks/child_database/child_database_models.py,sha256=VWPswKdegbypqa--gUxnxrLRVJO5oYZEEEzv1f--YM4,699
28
+ notionary/blocks/child_page/__init__.py,sha256=qaHvJqF8Bfzj0NVE1Q5uN_4o3Jl4RuNYspMZ6E7bUuk,182
29
+ notionary/blocks/child_page/child_page_models.py,sha256=LZhziu2nf-8FopcaQi6dJKOJ3lgY6Pc2S-ace6jPeqQ,240
30
+ notionary/blocks/client.py,sha256=mP9wrmMJYBTq9Fr-A5JAscK-TSMFUAbGi-rs-EEWH7o,8761
31
+ notionary/blocks/code/__init__.py,sha256=8mTDHndNb4kzDByETe2gG7-YHMrt18cf_gmV60JXHOc,345
32
+ notionary/blocks/code/code_element.py,sha256=88qshoRdtTScg1FbCuxKngNMFp07cklmJo_K-PuqDIE,3535
33
+ notionary/blocks/code/code_markdown_node.py,sha256=oLG5pPJOLvCA4BseGCPRNn94U9R9Adcc5k-7Z02XyaI,1189
34
+ notionary/blocks/code/code_models.py,sha256=hK-Ka9whQO-xWASr0sbhRcz-FUc5VY5Pjqa8LPW041o,2178
35
+ notionary/blocks/column/__init__.py,sha256=KFza6GKRjVa59ktp0euAVSq1oblK_KXSqAfrOIiT9ps,838
36
+ notionary/blocks/column/column_element.py,sha256=KgmY0oPXvoAcyPheo6k3AelexgDjq4RbMCu13zz1eNk,2004
37
+ notionary/blocks/column/column_list_element.py,sha256=LHa1UeczJjAQRYoru1X-HHi9yREsLDfAV6_BkQs4-Mo,1350
38
+ notionary/blocks/column/column_list_markdown_node.py,sha256=RXwPz-d-vfAb39HZapaXiomuY8eKkUuBBEm7rPyLHl0,1396
39
+ notionary/blocks/column/column_markdown_node.py,sha256=Nc7QReXOWZ0CIuUpgE9dhME4bINo18P1luC6bL0bpPA,1632
40
+ notionary/blocks/column/column_models.py,sha256=Dv1jBWmuFjjSqyOajkh05jmxEwxF9b-LuDA4Sgw8RJI,664
41
+ notionary/blocks/divider/__init__.py,sha256=GX3D_Oksg65Dam4lRGdrOGWuZec35ghuYuvF9HDt_y8,431
42
+ notionary/blocks/divider/divider_element.py,sha256=Ms9c5a2CbbttyPF8nkU-Qc_xo7BPtxaXAlAUJyzRjpM,1628
43
+ notionary/blocks/divider/divider_markdown_node.py,sha256=XMa4txNnzeJPheNKke4poD5t36DE0Fqj963-QZ3gh8M,583
44
+ notionary/blocks/divider/divider_models.py,sha256=A7jUBYZnE_yRLTZi-sr9sbDCrWNhAdriFNzCpDEBwGU,219
45
+ notionary/blocks/embed/__init__.py,sha256=EgWphqJaJdt3CMjILKEjVexDSTz1KU0NE2rMDNZaCQ0,399
46
+ notionary/blocks/embed/embed_element.py,sha256=PeN2kMmSuFiR0oy6KvrGV71FHwj-ADNWrMWnKwshHWk,2444
47
+ notionary/blocks/embed/embed_markdown_node.py,sha256=8pcLAT4Il1e50wIdCSL11Leq6fnGLOlwNAuKTFY-i98,908
48
+ notionary/blocks/embed/embed_models.py,sha256=utXtHlIIK5QA24ZJW7l0XfDtrt12DureH1DugOi9mNw,366
49
+ notionary/blocks/equation/__init__.py,sha256=XP4BgCG-CFXoNI9oUBofg7j2ygZasqdJWhVbJG98kyc,455
50
+ notionary/blocks/equation/equation_element.py,sha256=K5_R0KdUN7av--RA2c89zgfMVRP3BVCxfOGqwkawA4Q,2897
51
+ notionary/blocks/equation/equation_element_markdown_node.py,sha256=BugLq7fK1-9Zmf7_IxmXV7q45dANgGyRYBiRoRExnMs,1016
52
+ notionary/blocks/equation/equation_models.py,sha256=WIpnqHmwh2rpNTVvt6eFNzkhHejW8XMWDQbwtLIcxKw,245
53
+ notionary/blocks/file/__init__.py,sha256=kYPp8iJ-EDWi1BX5E-OkgV_QacQ8ysKn__whyXXEWIw,577
54
+ notionary/blocks/file/file_element.py,sha256=OBajaxutM2KdGKkcsmOJ-TcrI15EAquYF-55v5V6Sco,3034
55
+ notionary/blocks/file/file_element_markdown_node.py,sha256=BIqBANFC7aUh2IXRRL0uNYc7B7l2rzzkv9RXTJT-iZ8,1023
56
+ notionary/blocks/file/file_element_models.py,sha256=1eia1-OamnF52AUYtC3Ru-xi6HHsnjw9hcuslkHKXuI,850
57
+ notionary/blocks/heading/__init__.py,sha256=dg2hCVsqWv84hvtb6HAb4m1i8b0jyLXokPIYwe5NwZ8,557
58
+ notionary/blocks/heading/heading_element.py,sha256=H0xZTgTEFti9_QtvEkAsOKlwb1ww9qXd22n75XOZ12E,2959
59
+ notionary/blocks/heading/heading_markdown_node.py,sha256=I8_9fg_CsZ-iTMA6PV6V8DBxwa5BDcMfF6NS70iKCbo,881
60
+ notionary/blocks/heading/heading_models.py,sha256=nOEnb66tYt_653PIt-AqjGaOgefFOK6hKG09epCKSSc,794
61
+ notionary/blocks/image_block/__init__.py,sha256=ACOCt1hVFzGm_l9Vb0GVATN7PZNBg7jFp1FymrAi8lw,386
62
+ notionary/blocks/image_block/image_element.py,sha256=_O4s3w111lao-HvwvESHW6JwU-awHoPFPVUUEEhIFRo,2845
63
+ notionary/blocks/image_block/image_markdown_node.py,sha256=Ete7CPa29WTqF-dmKNs8ftvrVMDS4SO_94dbP-UPzmI,1035
64
+ notionary/blocks/image_block/image_models.py,sha256=vmuGwgq3uP9ojb-6IOdjsEqIKI-9uTa5_0BCMkzJV_A,229
65
+ notionary/blocks/models.py,sha256=_Arzezv5B_GV0kf5uYD6Z9JNjyCCISei0QZo8HwSDy4,5746
66
+ notionary/blocks/numbered_list/__init__.py,sha256=NcHMDTveGoYccNo6SYBgPdrIX_ZEAh37jOVpvWFKa4s,549
67
+ notionary/blocks/numbered_list/numbered_list_element.py,sha256=m54zZTjbVnIHVv2r2YxXRxb8M53lc4zdgnGoy4kFX9U,1836
68
+ notionary/blocks/numbered_list/numbered_list_markdown_node.py,sha256=Lf2QyBQql1JGPKrI-55ywpMcNGvoQDgKQelK5XNrSZU,785
69
+ notionary/blocks/numbered_list/numbered_list_models.py,sha256=dx2abI0GawwfjGnOKKUCtM5kzMs_fSFiHOZM3vOM3d4,587
70
+ notionary/blocks/paragraph/__init__.py,sha256=GjDP9az7qoYeDAaYR0utq6f0F8cFaDb-JhobLhf7ZRY,479
71
+ notionary/blocks/paragraph/paragraph_element.py,sha256=A5qNB5RvdUjm-ePM21eDwB_BWvqYihGVH8ONYnooyko,1487
72
+ notionary/blocks/paragraph/paragraph_markdown_node.py,sha256=PCu_KLDk5iIJ2jqB0QYziYDridrrE-Mg_ajfALh8p2s,669
73
+ notionary/blocks/paragraph/paragraph_models.py,sha256=Hm4IXYNrKqNqMy6QUt6SnIiVNZU_4a-27BH7fNBjc0o,429
74
+ notionary/blocks/pdf/__init__.py,sha256=NHoP43hIioaAG5GFIkNu5e962oc57xdzax5VdeEklBo,338
75
+ notionary/blocks/pdf/pdf_element.py,sha256=YwzUBiI-ogp9fsOWMKS-XqLHbdqY1_9VQabxh4quCwE,3326
76
+ notionary/blocks/pdf/pdf_markdown_node.py,sha256=TgLHHIZqfKnAxPQysdIe-BS_UlJv-m6jYxrgmoNruSo,1017
77
+ notionary/blocks/pdf/pdf_models.py,sha256=k3GB01LNDWnvcxj-gtHSMYAwElrDqFdXkw6DFjlpZNY,293
78
+ notionary/blocks/quote/__init__.py,sha256=xb5JY4k6naDYkqSQopWvTj2L9YTNMmFOaFingjUbOkU,444
79
+ notionary/blocks/quote/quote_element.py,sha256=aRo53z4gxcOVjOWm3PQwIVNh2m-0p9xG5gaavU9zk6Q,1902
80
+ notionary/blocks/quote/quote_markdown_node.py,sha256=V4ZOkQXfBSDU1eY-xdwW_pvvatM-cenVh9583qvXsr0,644
81
+ notionary/blocks/quote/quote_models.py,sha256=XT1hDfYw8SZUEg-rPfHiC4_0LNVWK-Vs7J6h9PIGgNE,506
82
+ notionary/blocks/registry/__init__.py,sha256=Het-sHkwxg8c0A1GlPvpm6Ca-GwfN-II55YIpLb-__A,156
83
+ notionary/blocks/registry/block_registry.py,sha256=gZs2tUZKem5ZG7j5Ldb_uPJVuBFdJ2EYTok86FA5tJs,4871
84
+ notionary/blocks/registry/block_registry_builder.py,sha256=lBkoo7KMWbVotvhrtmQf98XfFKn_4T4NoRoHR4T9-CI,8555
85
+ notionary/blocks/rich_text/__init__.py,sha256=UuOn0MmGKNqK3fLBnEcH2surwbDkZ4GF8Gpn4TLNwLc,773
86
+ notionary/blocks/rich_text/rich_text_models.py,sha256=wi2BMLWUELfdrQih4ALcdwKs9veEBzvtXt86ez3s9_0,5564
87
+ notionary/blocks/rich_text/text_inline_formatter.py,sha256=X6yU_xfH0UxkIjImsPNy77irXNUKoEBYN2XkJCiHwKM,4738
88
+ notionary/blocks/table/__init__.py,sha256=Vrs6w_P63cFptV-gVuDpFbU5Rg-bDf3Tf_jUk0n-s-I,511
89
+ notionary/blocks/table/table_element.py,sha256=RBDAU4lxKc1feNHOA7TksumjcWhIQ0tx0bY8rStW-QU,4287
90
+ notionary/blocks/table/table_markdown_node.py,sha256=9TJj0C380U-1iykAFouMGtlEM00Ig5-u9lmaWa-nPR8,1402
91
+ notionary/blocks/table/table_models.py,sha256=P0VUkX8FOE6aFWAyhOVVMVAYGtj_LO0sqSYtlbyCpQA,643
92
+ notionary/blocks/table_of_contents/__init__.py,sha256=m79PbE4vhG6UlJ8UFNQDU14_JUHxluLlPGWzgpcGkUo,598
93
+ notionary/blocks/table_of_contents/table_of_contents_element.py,sha256=BmuwBGBPwjHQd6HCzpwEF6LasCPMP0SL_BmWwTZKqkU,1744
94
+ notionary/blocks/table_of_contents/table_of_contents_markdown_node.py,sha256=en8NdehkYl6mntphjnIwCZPGXnN2o2XTQm3Q5X-hZ_o,897
95
+ notionary/blocks/table_of_contents/table_of_contents_models.py,sha256=ECC5m-q-nDX34XWAqlt5sONxlbQSB0LhLJZpsjpV5xk,531
96
+ notionary/blocks/todo/__init__.py,sha256=HBjy9vRu1yEUk_P4-el1aZMw9SRwpJXGcFFtUEp4Xb8,383
97
+ notionary/blocks/todo/todo_element.py,sha256=6av4diok6FbJSb8SWIeTfbQtZTZSEJYVLyA9VDbBGjs,2173
98
+ notionary/blocks/todo/todo_markdown_node.py,sha256=MBRHtUQBNvJdX0plxY02r-XW7vkzBc_PFZxtW03UrHo,996
99
+ notionary/blocks/todo/todo_models.py,sha256=ADM2YEFPn6zXan5paS6-eYKqa9-HQ52FQjfUVInJoBI,530
100
+ notionary/blocks/toggle/__init__.py,sha256=kMNpgbKBFoFaOXcfYsNOzHEpBjTZBmYEzXapysbtjNs,415
101
+ notionary/blocks/toggle/toggle_element.py,sha256=qfylqBCEiOQPRGEaXWE-99e1xaNs-qjNUNVpULKYRiI,3726
102
+ notionary/blocks/toggle/toggle_markdown_node.py,sha256=haCAABgWY2JhZsn9Pj78_gHgVHfzDLyTguU2yWT_sKM,1271
103
+ notionary/blocks/toggle/toggle_models.py,sha256=Tkqmz7bzKX7v-T9xWZLy9Eiw_ksGg4UZaacE30uZmwI,521
104
+ notionary/blocks/toggleable_heading/__init__.py,sha256=hk43FCDhkSg_QbHEucXSBd96-Gj1tIMwiRxQY-vPREA,412
105
+ notionary/blocks/toggleable_heading/toggleable_heading_element.py,sha256=zJw4HKdI1ZgF5cv5QkRtZK4m__hw4DzxfwLnD2eFbuM,3498
106
+ notionary/blocks/toggleable_heading/toggleable_heading_markdown_node.py,sha256=kSo7rnYjX_9PT6kfmCbMCvndwNbtHNnLYdtznXhWXe4,1626
107
+ notionary/blocks/types.py,sha256=oHqlFJSyV9bW8TpZnXBHLdxkc0kEn8q4RF-raAhhpxA,1676
108
+ notionary/blocks/video/__init__.py,sha256=z_lz1agYtSRv9A9bFRwPlpzmpfgf49w9uJMVkHTTsR0,376
109
+ notionary/blocks/video/video_element.py,sha256=kQrSH0n6DUndPDDDUujzl75mdlInUXWma1zmkY-7Ccw,3524
110
+ notionary/blocks/video/video_element_models.py,sha256=CYK2tq0qhrOxjO_ctOgRvEHM9hLjQCBXrP7wcTNlUPw,229
111
+ notionary/blocks/video/video_markdown_node.py,sha256=zjO7Cd5mR1FqyGByg3tFQVeKekbZnFqI_scs--Rk6VM,909
112
+ notionary/database/__init__.py,sha256=4tdML0fBzkOCpiWT6q-L--5NELFLbTPD0IUA_E8yZno,155
113
+ notionary/database/client.py,sha256=_6YMlIXF3RacOHNsYBu9gjfoeQ1aet9v5W2XlxgMwmw,4660
114
+ notionary/database/database.py,sha256=sdo830KVInR4enaEaeMHaPadNfYnPLy5R3OW2f74w28,16558
115
+ notionary/database/database_filter_builder.py,sha256=YIkdghD5VbdwLJISMRiJ0WIJTm8jcDIL22yrvZau4sA,5950
116
+ notionary/database/database_provider.py,sha256=HB-hZ9pMjronLJS8w_b1GiQ-Ecz1uJbrWpnePL67BCA,8956
117
+ notionary/database/exceptions.py,sha256=jwFdxoIQHLO3mO3p5t890--1FjbTX60fNyqBAe-sszo,452
118
+ notionary/database/factory.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
+ notionary/database/models.py,sha256=4LjnsltPLK4xddz_d_L7I-TnmixyCuqmKV5Mapa2i1I,7603
120
+ notionary/database/notion_database.py,sha256=DNsb_YuMg9Fix8OmKMBBN0FSlCGNWbDbG7GIsrSOgK0,16744
121
+ notionary/file_upload/__init__.py,sha256=7TNyiIgLMD_IGRXTwRiAmStokF3rLoG4zXPwNb9KQqk,168
122
+ notionary/file_upload/client.py,sha256=X3LInvHWuJgiL_phytLRzW6rrocXegm30TmTL0sCcfY,8531
123
+ notionary/file_upload/models.py,sha256=lvGrdHtgs0Oi26pPwuPyRvu8jnAhbAzpEaNmaHYCUi8,1627
124
+ notionary/file_upload/notion_file_upload.py,sha256=Ul3CMicJpUodUa3SU3ihrkWU_Wa5z36mKOqSVXNc_DM,13173
125
+ notionary/markdown/___init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
+ notionary/markdown/makdown_document_model.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
+ notionary/markdown/markdown_builder.py,sha256=SPcJXMh3vGyo_PkXb5BLtAX0_P5OSF4em5MJpId7kfs,25567
128
+ notionary/markdown/markdown_document_model.py,sha256=i9zMINcTlTwlqpHV9zeQfMVlni2VAl6BMjAdKSdoUeg,6409
129
+ notionary/markdown/markdown_node.py,sha256=u8ApehnTCo1KnTFbtYzGuTAyUQrYPc3RSMJaUMyg0LI,717
130
+ notionary/models/notion_database_response.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
+ notionary/page/client.py,sha256=OFty8GZ-jaj68zo_61X_ZCsAcqPhY5VYmJiZDeXza30,3938
132
+ notionary/page/markdown_whitespace_processor.py,sha256=azsYau4eDrFN9CY7kzlG-ketoVKSkqSTc1bFq_i7ggQ,2942
133
+ notionary/page/models.py,sha256=pD8FlK8KtnUrIITTd2jg_yJICakgPE4ysZiS9KiMpr0,7088
134
+ notionary/page/notion_page.py,sha256=xSG2hoa_La0wGU3PfM9kGOXOxDannoB-7y1nhCBTBsQ,20978
135
+ notionary/page/notion_text_length_utils.py,sha256=58A2OjkMCq7g8gf-lw2Cy4aLfvZrtEmuNmZJ8oI9lLA,4152
136
+ notionary/page/page_content_writer.py,sha256=9VqIcDp7mlFkf1WLLz5rP2pQov28bInSXtheiQ2KCF0,7904
137
+ notionary/page/property_formatter.py,sha256=_978ViH83gfcr-XtDscWTfyBI2srGW2hzC-gzgp5NR8,3788
138
+ notionary/page/reader/handler/__init__.py,sha256=bnCYska8E8TwvH--VzUaxY-PPczst41sav7ircJDinQ,557
139
+ notionary/page/reader/handler/base_block_renderer.py,sha256=07iFgb11_u2MdjlcdnMd2S6xnPyYF7JxE6aGJ1yHVXs,1489
140
+ notionary/page/reader/handler/block_processing_context.py,sha256=eSNpjQ3tpOc7sJgEm-2UAwd1UvCf-B4CtHJLS5B0lZA,1001
141
+ notionary/page/reader/handler/block_rendering_context.py,sha256=BVFziudL16yaypZ18iCvJ0QPPpowVpt5HjYyacUF79o,1430
142
+ notionary/page/reader/handler/column_list_renderer.py,sha256=rYh4lOmr74j-KE8VqddVbqVyXcZ4ZRg2ig_XNJAKmX8,2011
143
+ notionary/page/reader/handler/column_renderer.py,sha256=XahgbvWCNqpdKpf0fs9E2yU9_sq7F4_ByUXE8Pi_Q_4,2312
144
+ notionary/page/reader/handler/context.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
+ notionary/page/reader/handler/line_renderer.py,sha256=odeaB4-eJNILmrJEnfJhSYBxWiZNch5Q9ycUWRLKgas,2407
146
+ notionary/page/reader/handler/toggle_renderer.py,sha256=D-kDJc1JbqM9BSGdgJxBsu1Fb8gpKU9ziNFqkS4_Tu8,2593
147
+ notionary/page/reader/handler/toggleable_heading_renderer.py,sha256=vw336TY9K0v-JFu_x5xHlovCKylSITtMh2RM0YDt4lk,3374
148
+ notionary/page/reader/page_content_retriever.py,sha256=tP_SzTEZ44NNP9KCk_BBpb0xKTIpt-ex3qV7XY80lP0,2364
149
+ notionary/page/search_filter_builder.py,sha256=m8NbFUoxxCEBpcWZIxClyix8NNzeohsOw7D-Fddi-qA,4599
150
+ notionary/page/utils.py,sha256=2nfBrWeczBdPH13R3q8dKP4OY4MwEdfKbcs2UJ9kg1o,2041
151
+ notionary/page/writer/handler/__init__.py,sha256=m3oTtbozwucFwy58I_hSI-V2-Q-A_HTu0jiCmrfV8PI,723
152
+ notionary/page/writer/handler/code_handler.py,sha256=OFQ46QYL851hdHp4-rNp9lj6l6evhNTHgSRP9fQEAo4,3891
153
+ notionary/page/writer/handler/column_handler.py,sha256=Q93nAzhIb0EN_X9RwjKzOjSehwsVWsIMzvbPO-ne_RY,5397
154
+ notionary/page/writer/handler/column_list_handler.py,sha256=sFMYz912p_9P9HDiH8G9gdZJdboq74IyR_-sHeuuVxc,5291
155
+ notionary/page/writer/handler/line_handler.py,sha256=vFGHgy-6o61CBgbVEWV43dlD_0pxZNVqcS1Xiwd9AoU,1139
156
+ notionary/page/writer/handler/line_processing_context.py,sha256=F2GxDXIOgvZHxiDP-VDe8JUHGcsszMexPG0W9E9y39E,1739
157
+ notionary/page/writer/handler/regular_line_handler.py,sha256=zwGnUjJDy9kuo1YkXWl57Jm_V3YkOwWC4iQxXdO_xZY,3704
158
+ notionary/page/writer/handler/table_handler.py,sha256=SV3CFTgpHTZch9y4M8qHhBoatbo4g-ImKNwchgI1S7c,5036
159
+ notionary/page/writer/handler/toggle_handler.py,sha256=hslgcleXt9En3RONbNr2JEhwnfjNrBARzxtoBpH33Xo,5773
160
+ notionary/page/writer/handler/toggleable_heading_handler.py,sha256=ykH7Bn-3h9ZEoxzymOAEVORvHP5TIKeiSAD7XpMbTkA,6752
161
+ notionary/page/writer/markdown_to_notion_converter.py,sha256=vIZaTyDARFkQ0vJMIowGp_tdxibaExx12PIrt2UeeOU,2570
162
+ notionary/telemetry/__init__.py,sha256=uzPrvkPIpbzPSHCu-tObCTmZA18l3VWqk42L8WLT-XM,511
163
+ notionary/telemetry/service.py,sha256=b4tWa2uRcgzc6YjPjAdwlCLZNRNjxAaxsZ1xRZ_AWmQ,4765
164
+ notionary/telemetry/views.py,sha256=FgFZGYaxP7pRYx-9wg18skMh_MJAwf4W3rCfe9JOZe4,1796
165
+ notionary/user/__init__.py,sha256=qcAWjWQVn_3WxAJZpToTj2WuCHhKLdtv3bblmx7SG2U,281
166
+ notionary/user/base_notion_user.py,sha256=qeCUmVvi62HZDQMLaT4bEuu6Dkeit8L0hBMtJaNndJI,1502
167
+ notionary/user/client.py,sha256=8gHEjiE6aNrKGlo3PMoLhIeO8R5gBgF6W7TDOsM1A4E,4515
168
+ notionary/user/models.py,sha256=G6Emj8TqAFTGCmyfKk8hq0bZC_tL7uNdI6USNWTVfP4,2065
169
+ notionary/user/notion_bot_user.py,sha256=AbkyBXM2__yNfGd8czxVqDEKvtFuzgQguyL5da5lvcs,7772
170
+ notionary/user/notion_user.py,sha256=GyWAGYS3OjMz6jYwETqOSmAS3qsGkwhTR9SDw-qvqTg,8503
171
+ notionary/user/notion_user_manager.py,sha256=ECJQGL8dsDBlk5_cH2_xB78G-PtT0vz3829TxZhAy4E,6341
172
+ notionary/user/notion_user_provider.py,sha256=zAU4m1ZdsrLv3DRHtoiTVgtQaDvz0t28LwvxMMMSJm4,20
173
+ notionary/util/__init__.py,sha256=umFas1H4zUoxibNn-Ff6dTCWt3mkhmAG4Lu2viZ-XAU,386
174
+ notionary/util/factory_decorator.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
175
+ notionary/util/factory_only.py,sha256=q-ZXUEvQ8lsuD1JQwx-ai6e9Lhie65waRE1BcRhCR_4,1235
176
+ notionary/util/fuzzy.py,sha256=y7EroToodFSIQLD0FAfFrPEDXOUlZaDGN9ko3XjfHMw,2063
177
+ notionary/util/logging_mixin.py,sha256=WLziC-IVovKIe3n3R-ns3YYE2aP5bZVu0r_y5joxhxY,1690
178
+ notionary/util/page_id_utils.py,sha256=AA00kRO-g3Cc50tf_XW_tb5RBuPKLuBxRa0D8LYhLXg,736
179
+ notionary/util/singleton.py,sha256=CKAvykndwPRZsA3n3MAY_XdCR59MBjjKP0vtm2BcvF0,428
180
+ notionary/util/singleton_metaclass.py,sha256=DMvrh0IbAV8nIG1oX-2Yz57Uk1YHB647DNxoI3pAT3s,809
181
+ notionary/workspace.py,sha256=3DYWyiMwZkzGy6Kt9Hn6X16KZhAmAsKAsZPlMw1wehI,3815
182
+ notionary-0.2.21.dist-info/LICENSE,sha256=zOm3cRT1qD49eg7vgw95MI79rpUAZa1kRBFwL2FkAr8,1120
183
+ notionary-0.2.21.dist-info/METADATA,sha256=7AAhI86LICte3HlUC1QVFom9cL1ROjWwy89IEq5rplw,6780
184
+ notionary-0.2.21.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
185
+ notionary-0.2.21.dist-info/RECORD,,
@@ -1,7 +0,0 @@
1
- from .document_element import DocumentElement
2
- from .document_markdown_node import DocumentMarkdownNode
3
-
4
- __all__ = [
5
- "DocumentElement",
6
- "DocumentMarkdownNode",
7
- ]
@@ -1,102 +0,0 @@
1
- import re
2
- from typing import Dict, Any, Optional, List
3
-
4
- from notionary.blocks import NotionBlockElement, NotionBlockResult
5
- from notionary.blocks import ElementPromptContent, ElementPromptBuilder
6
-
7
- class DocumentElement(NotionBlockElement):
8
- """
9
- Handles conversion between Markdown document embeds and Notion file blocks.
10
-
11
- Markdown document syntax:
12
- - [document](https://example.com/document.pdf "Caption")
13
- - [document](https://example.com/document.pdf)
14
- """
15
- # Nur noch die neue Syntax!
16
- PATTERN = re.compile(
17
- r'^\[document\]\('
18
- r'(https?://[^\s")]+)' # URL
19
- r'(?:\s+"([^"]*)")?' # Optional caption
20
- r'\)$'
21
- )
22
-
23
- @classmethod
24
- def match_markdown(cls, text: str) -> bool:
25
- text = text.strip()
26
- return text.startswith("[document]") and bool(cls.PATTERN.match(text))
27
-
28
- @classmethod
29
- def match_notion(cls, block: Dict[str, Any]) -> bool:
30
- return block.get("type") == "file"
31
-
32
- @classmethod
33
- def markdown_to_notion(cls, text: str) -> Optional[List[Dict[str, Any]]]:
34
- match = cls.PATTERN.match(text.strip())
35
- if not match:
36
- return None
37
- url = match.group(1)
38
- caption = match.group(2) or ""
39
- file_block = {
40
- "type": "file",
41
- "file": {
42
- "type": "external",
43
- "external": {"url": url},
44
- "caption": [{"type": "text", "text": {"content": caption}}] if caption else [],
45
- }
46
- }
47
- # Für Konsistenz mit anderen Blöcken geben wir ein Array zurück
48
- empty_paragraph = {"type": "paragraph", "paragraph": {"rich_text": []}}
49
- return [file_block, empty_paragraph]
50
-
51
- @classmethod
52
- def notion_to_markdown(cls, block: Dict[str, Any]) -> Optional[str]:
53
- if block.get("type") != "file":
54
- return None
55
- file_data = block.get("file", {})
56
- url = ""
57
- if file_data.get("type") == "external":
58
- url = file_data.get("external", {}).get("url", "")
59
- elif file_data.get("type") == "file":
60
- url = file_data.get("file", {}).get("url", "")
61
- if not url:
62
- return None
63
- caption_list = file_data.get("caption", [])
64
- caption = cls._extract_text_content(caption_list)
65
- if caption:
66
- return f'[document]({url} "{caption}")'
67
- return f'[document]({url})'
68
-
69
- @classmethod
70
- def _extract_text_content(cls, rich_text: List[Dict[str, Any]]) -> str:
71
- return "".join(
72
- t.get("text", {}).get("content", "")
73
- for t in rich_text
74
- if t.get("type") == "text"
75
- ) or "".join(t.get("plain_text", "") for t in rich_text if "plain_text" in t)
76
-
77
- @classmethod
78
- def is_multiline(cls) -> bool:
79
- return False
80
-
81
- @classmethod
82
- def get_llm_prompt_content(cls) -> ElementPromptContent:
83
- return (
84
- ElementPromptBuilder()
85
- .with_description(
86
- "Embeds document files from external sources like PDFs, Word docs, Excel files, or cloud storage services."
87
- )
88
- .with_usage_guidelines(
89
- "Use document embeds for sharing contracts, reports, manuals, or any important files."
90
- )
91
- .with_syntax('[document](https://example.com/document.pdf "Caption")')
92
- .with_examples(
93
- [
94
- '[document](https://drive.google.com/file/d/1a2b3c4d5e/view "Project Proposal")',
95
- '[document](https://company.sharepoint.com/reports/q4-2024.xlsx "Q4 Financial Report")',
96
- '[document](https://cdn.company.com/docs/manual-v2.1.pdf "User Manual")',
97
- '[document](https://docs.google.com/document/d/1x2y3z4/edit "Meeting Minutes")',
98
- '[document](https://example.com/contract.pdf)',
99
- ]
100
- )
101
- .build()
102
- )
@@ -1,31 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Optional
4
- from pydantic import BaseModel
5
- from notionary.blocks.markdown_node import MarkdownNode
6
-
7
- class DocumentMarkdownNodeParams(BaseModel):
8
- url: str
9
- caption: Optional[str] = None
10
-
11
- class DocumentMarkdownNode(MarkdownNode):
12
- """
13
- Programmatic interface for creating Notion-style Markdown document/file embeds.
14
- Example: [document](https://example.com/file.pdf "My Caption")
15
- """
16
-
17
- def __init__(self, url: str, caption: Optional[str] = None):
18
- self.url = url
19
- self.caption = caption or ""
20
-
21
- @classmethod
22
- def from_params(cls, params: DocumentMarkdownNodeParams) -> DocumentMarkdownNode:
23
- return cls(url=params.url, caption=params.caption)
24
-
25
- def to_markdown(self) -> str:
26
- """
27
- Convert to markdown as [document](url "caption") or [document](url) if caption is empty.
28
- """
29
- if self.caption:
30
- return f'[document]({self.url} "{self.caption}")'
31
- return f'[document]({self.url})'
@@ -1,7 +0,0 @@
1
- from .image_element import ImageElement
2
- from .image_markdown_node import ImageMarkdownNode
3
-
4
- __all__ = [
5
- "ImageElement",
6
- "ImageMarkdownNode",
7
- ]