notionary 0.2.27__py3-none-any.whl → 0.2.28__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 (387) hide show
  1. notionary/__init__.py +5 -20
  2. notionary/blocks/client.py +87 -215
  3. notionary/blocks/enums.py +167 -0
  4. notionary/blocks/rich_text/markdown_rich_text_converter.py +266 -0
  5. notionary/blocks/rich_text/models.py +164 -0
  6. notionary/blocks/rich_text/name_id_resolver/__init__.py +11 -0
  7. notionary/blocks/rich_text/name_id_resolver/database.py +31 -0
  8. notionary/blocks/rich_text/name_id_resolver/page.py +34 -0
  9. notionary/blocks/rich_text/name_id_resolver/person.py +37 -0
  10. notionary/blocks/rich_text/name_id_resolver/port.py +11 -0
  11. notionary/blocks/rich_text/rich_text_markdown_converter.py +132 -0
  12. notionary/blocks/rich_text/rich_text_patterns.py +39 -0
  13. notionary/blocks/schemas.py +746 -0
  14. notionary/comments/client.py +52 -187
  15. notionary/comments/factory.py +40 -0
  16. notionary/comments/models.py +5 -127
  17. notionary/comments/schemas.py +240 -0
  18. notionary/comments/service.py +34 -0
  19. notionary/data_source/http/client.py +11 -0
  20. notionary/data_source/http/data_source_instance_client.py +94 -0
  21. notionary/data_source/properties/models.py +406 -0
  22. notionary/data_source/query/builder.py +429 -0
  23. notionary/data_source/query/resolver.py +114 -0
  24. notionary/data_source/query/schema.py +304 -0
  25. notionary/data_source/query/validator.py +73 -0
  26. notionary/data_source/schemas.py +27 -0
  27. notionary/data_source/service.py +353 -0
  28. notionary/database/client.py +30 -135
  29. notionary/database/database_metadata_update_client.py +19 -0
  30. notionary/database/schemas.py +29 -0
  31. notionary/database/service.py +169 -0
  32. notionary/exceptions/__init__.py +33 -0
  33. notionary/exceptions/api.py +41 -0
  34. notionary/exceptions/base.py +2 -0
  35. notionary/exceptions/block_parsing.py +16 -0
  36. notionary/exceptions/data_source/__init__.py +6 -0
  37. notionary/exceptions/data_source/builder.py +182 -0
  38. notionary/exceptions/data_source/properties.py +34 -0
  39. notionary/exceptions/properties.py +58 -0
  40. notionary/exceptions/search.py +33 -0
  41. notionary/file_upload/client.py +18 -30
  42. notionary/file_upload/models.py +7 -8
  43. notionary/file_upload/{notion_file_upload.py → service.py} +29 -64
  44. notionary/http/client.py +205 -0
  45. notionary/http/models.py +49 -0
  46. notionary/page/blocks/client.py +1 -0
  47. notionary/page/content/factory.py +68 -0
  48. notionary/page/content/markdown/__init__.py +5 -0
  49. notionary/page/content/markdown/builder.py +304 -0
  50. notionary/page/content/markdown/nodes/__init__.py +54 -0
  51. notionary/page/content/markdown/nodes/audio.py +23 -0
  52. notionary/page/content/markdown/nodes/base.py +12 -0
  53. notionary/page/content/markdown/nodes/bookmark.py +25 -0
  54. notionary/page/content/markdown/nodes/breadcrumb.py +14 -0
  55. notionary/page/content/markdown/nodes/bulleted_list.py +18 -0
  56. notionary/page/content/markdown/nodes/callout.py +32 -0
  57. notionary/page/content/markdown/nodes/code.py +30 -0
  58. notionary/page/content/markdown/nodes/columns.py +51 -0
  59. notionary/page/content/markdown/nodes/divider.py +14 -0
  60. notionary/page/content/markdown/nodes/embed.py +23 -0
  61. notionary/page/content/markdown/nodes/equation.py +19 -0
  62. notionary/page/content/markdown/nodes/file.py +23 -0
  63. notionary/page/content/markdown/nodes/heading.py +16 -0
  64. notionary/page/content/markdown/nodes/image.py +23 -0
  65. notionary/page/content/markdown/nodes/mixins/caption.py +12 -0
  66. notionary/page/content/markdown/nodes/numbered_list.py +15 -0
  67. notionary/page/content/markdown/nodes/paragraph.py +14 -0
  68. notionary/page/content/markdown/nodes/pdf.py +23 -0
  69. notionary/page/content/markdown/nodes/quote.py +15 -0
  70. notionary/page/content/markdown/nodes/space.py +14 -0
  71. notionary/page/content/markdown/nodes/table.py +45 -0
  72. notionary/page/content/markdown/nodes/table_of_contents.py +14 -0
  73. notionary/page/content/markdown/nodes/todo.py +22 -0
  74. notionary/page/content/markdown/nodes/toggle.py +28 -0
  75. notionary/page/content/markdown/nodes/toggleable_heading.py +35 -0
  76. notionary/page/content/markdown/nodes/video.py +23 -0
  77. notionary/page/content/parser/context.py +49 -0
  78. notionary/page/content/parser/factory.py +219 -0
  79. notionary/page/content/parser/parsers/__init__.py +60 -0
  80. notionary/page/content/parser/parsers/audio.py +40 -0
  81. notionary/page/content/parser/parsers/base.py +30 -0
  82. notionary/page/content/parser/parsers/bookmark.py +33 -0
  83. notionary/page/content/parser/parsers/breadcrumb.py +33 -0
  84. notionary/page/content/parser/parsers/bulleted_list.py +41 -0
  85. notionary/page/content/parser/parsers/callout.py +129 -0
  86. notionary/page/content/parser/parsers/caption.py +55 -0
  87. notionary/page/content/parser/parsers/code.py +81 -0
  88. notionary/page/content/parser/parsers/column.py +117 -0
  89. notionary/page/content/parser/parsers/column_list.py +81 -0
  90. notionary/page/content/parser/parsers/divider.py +33 -0
  91. notionary/page/content/parser/parsers/embed.py +33 -0
  92. notionary/page/content/parser/parsers/equation.py +65 -0
  93. notionary/page/content/parser/parsers/file.py +42 -0
  94. notionary/page/content/parser/parsers/heading.py +58 -0
  95. notionary/page/content/parser/parsers/image.py +42 -0
  96. notionary/page/content/parser/parsers/numbered_list.py +45 -0
  97. notionary/page/content/parser/parsers/paragraph.py +36 -0
  98. notionary/page/content/parser/parsers/pdf.py +42 -0
  99. notionary/page/content/parser/parsers/quote.py +65 -0
  100. notionary/page/content/parser/parsers/space.py +35 -0
  101. notionary/page/content/parser/parsers/table.py +144 -0
  102. notionary/page/content/parser/parsers/table_of_contents.py +32 -0
  103. notionary/page/content/parser/parsers/todo.py +58 -0
  104. notionary/page/content/parser/parsers/toggle.py +127 -0
  105. notionary/page/content/parser/parsers/toggleable_heading.py +150 -0
  106. notionary/page/content/parser/parsers/video.py +42 -0
  107. notionary/page/content/parser/post_processing/handlers/__init__.py +5 -0
  108. notionary/page/content/parser/post_processing/handlers/rich_text_length.py +93 -0
  109. notionary/page/content/parser/post_processing/handlers/rich_text_length_truncation.py +93 -0
  110. notionary/page/content/parser/post_processing/port.py +9 -0
  111. notionary/page/content/parser/post_processing/service.py +16 -0
  112. notionary/page/content/parser/pre_processsing/handlers/__init__.py +9 -0
  113. notionary/page/content/parser/pre_processsing/handlers/column_syntax.py +80 -0
  114. notionary/page/content/parser/pre_processsing/handlers/port.py +7 -0
  115. notionary/page/content/parser/pre_processsing/handlers/whitespace.py +68 -0
  116. notionary/page/content/parser/pre_processsing/service.py +15 -0
  117. notionary/page/content/parser/service.py +69 -0
  118. notionary/page/content/renderer/context.py +48 -0
  119. notionary/page/content/renderer/factory.py +240 -0
  120. notionary/page/content/renderer/post_processing/handlers/__init__.py +5 -0
  121. notionary/page/content/renderer/post_processing/handlers/numbered_list_placeholdere.py +62 -0
  122. notionary/page/content/renderer/post_processing/port.py +7 -0
  123. notionary/page/content/renderer/post_processing/service.py +15 -0
  124. notionary/page/content/renderer/renderers/__init__.py +57 -0
  125. notionary/page/content/renderer/renderers/audio.py +31 -0
  126. notionary/page/content/renderer/renderers/base.py +31 -0
  127. notionary/page/content/renderer/renderers/bookmark.py +25 -0
  128. notionary/page/content/renderer/renderers/breadcrumb.py +21 -0
  129. notionary/page/content/renderer/renderers/bulleted_list.py +48 -0
  130. notionary/page/content/renderer/renderers/callout.py +65 -0
  131. notionary/page/content/renderer/renderers/captioned_block.py +58 -0
  132. notionary/page/content/renderer/renderers/code.py +34 -0
  133. notionary/page/content/renderer/renderers/column.py +44 -0
  134. notionary/page/content/renderer/renderers/column_list.py +31 -0
  135. notionary/page/content/renderer/renderers/divider.py +22 -0
  136. notionary/page/content/renderer/renderers/embed.py +25 -0
  137. notionary/page/content/renderer/renderers/equation.py +37 -0
  138. notionary/page/content/renderer/renderers/fallback.py +24 -0
  139. notionary/page/content/renderer/renderers/file.py +40 -0
  140. notionary/page/content/renderer/renderers/heading.py +69 -0
  141. notionary/page/content/renderer/renderers/image.py +31 -0
  142. notionary/page/content/renderer/renderers/numbered_list.py +41 -0
  143. notionary/page/content/renderer/renderers/paragraph.py +40 -0
  144. notionary/page/content/renderer/renderers/pdf.py +31 -0
  145. notionary/page/content/renderer/renderers/quote.py +49 -0
  146. notionary/page/content/renderer/renderers/table.py +115 -0
  147. notionary/page/content/renderer/renderers/table_of_contents.py +26 -0
  148. notionary/page/content/renderer/renderers/table_row.py +17 -0
  149. notionary/page/content/renderer/renderers/todo.py +56 -0
  150. notionary/page/content/renderer/renderers/toggle.py +53 -0
  151. notionary/page/content/renderer/renderers/toggleable_heading.py +78 -0
  152. notionary/page/content/renderer/renderers/video.py +31 -0
  153. notionary/page/content/renderer/service.py +50 -0
  154. notionary/page/content/service.py +65 -0
  155. notionary/page/content/syntax/models.py +68 -0
  156. notionary/page/content/syntax/service.py +453 -0
  157. notionary/page/page_context.py +7 -16
  158. notionary/page/page_http_client.py +15 -0
  159. notionary/page/page_metadata_update_client.py +19 -0
  160. notionary/page/properties/client.py +144 -0
  161. notionary/page/properties/factory.py +26 -0
  162. notionary/page/properties/models.py +307 -0
  163. notionary/page/properties/service.py +257 -0
  164. notionary/page/schemas.py +13 -0
  165. notionary/page/service.py +222 -0
  166. notionary/shared/entity/client.py +29 -0
  167. notionary/shared/entity/dto_parsers.py +53 -0
  168. notionary/shared/entity/entity_metadata_update_client.py +41 -0
  169. notionary/shared/entity/schemas.py +45 -0
  170. notionary/shared/entity/service.py +171 -0
  171. notionary/shared/models/cover.py +20 -0
  172. notionary/shared/models/file.py +21 -0
  173. notionary/shared/models/icon.py +28 -0
  174. notionary/shared/models/parent.py +41 -0
  175. notionary/shared/properties/type.py +30 -0
  176. notionary/user/__init__.py +4 -8
  177. notionary/user/base.py +89 -0
  178. notionary/user/bot.py +70 -0
  179. notionary/user/client.py +22 -111
  180. notionary/user/person.py +41 -0
  181. notionary/user/schemas.py +67 -0
  182. notionary/user/service.py +65 -0
  183. notionary/utils/async_retry.py +39 -0
  184. notionary/utils/date.py +51 -0
  185. notionary/utils/fuzzy.py +56 -0
  186. notionary/{util/logging_mixin.py → utils/mixins/logging.py} +4 -16
  187. notionary/utils/pagination.py +50 -0
  188. notionary/utils/singleton.py +13 -0
  189. notionary/utils/uuid_utils.py +20 -0
  190. notionary/workspace/__init__.py +3 -0
  191. notionary/workspace/client.py +62 -0
  192. notionary/workspace/query/builder.py +60 -0
  193. notionary/workspace/query/models.py +60 -0
  194. notionary/workspace/query/service.py +93 -0
  195. notionary/workspace/schemas.py +21 -0
  196. notionary/workspace/service.py +116 -0
  197. {notionary-0.2.27.dist-info → notionary-0.2.28.dist-info}/METADATA +54 -49
  198. notionary-0.2.28.dist-info/RECORD +200 -0
  199. {notionary-0.2.27.dist-info → notionary-0.2.28.dist-info}/WHEEL +1 -1
  200. {notionary-0.2.27.dist-info → notionary-0.2.28.dist-info/licenses}/LICENSE +9 -9
  201. notionary/base_notion_client.py +0 -219
  202. notionary/blocks/__init__.py +0 -5
  203. notionary/blocks/_bootstrap.py +0 -271
  204. notionary/blocks/audio/__init__.py +0 -11
  205. notionary/blocks/audio/audio_element.py +0 -158
  206. notionary/blocks/audio/audio_markdown_node.py +0 -24
  207. notionary/blocks/audio/audio_models.py +0 -10
  208. notionary/blocks/base_block_element.py +0 -42
  209. notionary/blocks/bookmark/__init__.py +0 -12
  210. notionary/blocks/bookmark/bookmark_element.py +0 -83
  211. notionary/blocks/bookmark/bookmark_markdown_node.py +0 -28
  212. notionary/blocks/bookmark/bookmark_models.py +0 -15
  213. notionary/blocks/breadcrumbs/__init__.py +0 -15
  214. notionary/blocks/breadcrumbs/breadcrumb_element.py +0 -39
  215. notionary/blocks/breadcrumbs/breadcrumb_markdown_node.py +0 -13
  216. notionary/blocks/breadcrumbs/breadcrumb_models.py +0 -12
  217. notionary/blocks/bulleted_list/__init__.py +0 -15
  218. notionary/blocks/bulleted_list/bulleted_list_element.py +0 -74
  219. notionary/blocks/bulleted_list/bulleted_list_markdown_node.py +0 -20
  220. notionary/blocks/bulleted_list/bulleted_list_models.py +0 -17
  221. notionary/blocks/callout/__init__.py +0 -12
  222. notionary/blocks/callout/callout_element.py +0 -99
  223. notionary/blocks/callout/callout_markdown_node.py +0 -19
  224. notionary/blocks/callout/callout_models.py +0 -33
  225. notionary/blocks/child_database/__init__.py +0 -14
  226. notionary/blocks/child_database/child_database_element.py +0 -59
  227. notionary/blocks/child_database/child_database_models.py +0 -12
  228. notionary/blocks/child_page/__init__.py +0 -9
  229. notionary/blocks/child_page/child_page_element.py +0 -94
  230. notionary/blocks/child_page/child_page_models.py +0 -12
  231. notionary/blocks/code/__init__.py +0 -11
  232. notionary/blocks/code/code_element.py +0 -149
  233. notionary/blocks/code/code_markdown_node.py +0 -80
  234. notionary/blocks/code/code_models.py +0 -94
  235. notionary/blocks/column/__init__.py +0 -25
  236. notionary/blocks/column/column_element.py +0 -65
  237. notionary/blocks/column/column_list_element.py +0 -52
  238. notionary/blocks/column/column_list_markdown_node.py +0 -34
  239. notionary/blocks/column/column_markdown_node.py +0 -42
  240. notionary/blocks/column/column_models.py +0 -26
  241. notionary/blocks/divider/__init__.py +0 -12
  242. notionary/blocks/divider/divider_element.py +0 -41
  243. notionary/blocks/divider/divider_markdown_node.py +0 -11
  244. notionary/blocks/divider/divider_models.py +0 -12
  245. notionary/blocks/embed/__init__.py +0 -12
  246. notionary/blocks/embed/embed_element.py +0 -98
  247. notionary/blocks/embed/embed_markdown_node.py +0 -19
  248. notionary/blocks/embed/embed_models.py +0 -14
  249. notionary/blocks/equation/__init__.py +0 -13
  250. notionary/blocks/equation/equation_element.py +0 -133
  251. notionary/blocks/equation/equation_element_markdown_node.py +0 -23
  252. notionary/blocks/equation/equation_models.py +0 -11
  253. notionary/blocks/file/__init__.py +0 -23
  254. notionary/blocks/file/file_element.py +0 -133
  255. notionary/blocks/file/file_element_markdown_node.py +0 -24
  256. notionary/blocks/file/file_element_models.py +0 -39
  257. notionary/blocks/heading/__init__.py +0 -19
  258. notionary/blocks/heading/heading_element.py +0 -112
  259. notionary/blocks/heading/heading_markdown_node.py +0 -16
  260. notionary/blocks/heading/heading_models.py +0 -29
  261. notionary/blocks/image_block/__init__.py +0 -11
  262. notionary/blocks/image_block/image_element.py +0 -130
  263. notionary/blocks/image_block/image_markdown_node.py +0 -25
  264. notionary/blocks/image_block/image_models.py +0 -10
  265. notionary/blocks/markdown/markdown_builder.py +0 -525
  266. notionary/blocks/markdown/markdown_document_model.py +0 -0
  267. notionary/blocks/markdown/markdown_node.py +0 -25
  268. notionary/blocks/mixins/captions/__init__.py +0 -4
  269. notionary/blocks/mixins/captions/caption_markdown_node_mixin.py +0 -31
  270. notionary/blocks/mixins/captions/caption_mixin.py +0 -92
  271. notionary/blocks/mixins/file_upload/__init__.py +0 -3
  272. notionary/blocks/mixins/file_upload/file_upload_mixin.py +0 -320
  273. notionary/blocks/models.py +0 -174
  274. notionary/blocks/numbered_list/__init__.py +0 -16
  275. notionary/blocks/numbered_list/numbered_list_element.py +0 -65
  276. notionary/blocks/numbered_list/numbered_list_markdown_node.py +0 -17
  277. notionary/blocks/numbered_list/numbered_list_models.py +0 -17
  278. notionary/blocks/paragraph/__init__.py +0 -15
  279. notionary/blocks/paragraph/paragraph_element.py +0 -58
  280. notionary/blocks/paragraph/paragraph_markdown_node.py +0 -16
  281. notionary/blocks/paragraph/paragraph_models.py +0 -16
  282. notionary/blocks/pdf/__init__.py +0 -11
  283. notionary/blocks/pdf/pdf_element.py +0 -146
  284. notionary/blocks/pdf/pdf_markdown_node.py +0 -24
  285. notionary/blocks/pdf/pdf_models.py +0 -11
  286. notionary/blocks/quote/__init__.py +0 -14
  287. notionary/blocks/quote/quote_element.py +0 -75
  288. notionary/blocks/quote/quote_markdown_node.py +0 -16
  289. notionary/blocks/quote/quote_models.py +0 -18
  290. notionary/blocks/registry/__init__.py +0 -3
  291. notionary/blocks/registry/block_registry.py +0 -150
  292. notionary/blocks/rich_text/__init__.py +0 -33
  293. notionary/blocks/rich_text/rich_text_models.py +0 -221
  294. notionary/blocks/rich_text/text_inline_formatter.py +0 -456
  295. notionary/blocks/syntax_prompt_builder.py +0 -137
  296. notionary/blocks/table/__init__.py +0 -19
  297. notionary/blocks/table/table_element.py +0 -225
  298. notionary/blocks/table/table_markdown_node.py +0 -42
  299. notionary/blocks/table/table_models.py +0 -28
  300. notionary/blocks/table_of_contents/__init__.py +0 -17
  301. notionary/blocks/table_of_contents/table_of_contents_element.py +0 -80
  302. notionary/blocks/table_of_contents/table_of_contents_markdown_node.py +0 -21
  303. notionary/blocks/table_of_contents/table_of_contents_models.py +0 -18
  304. notionary/blocks/todo/__init__.py +0 -12
  305. notionary/blocks/todo/todo_element.py +0 -81
  306. notionary/blocks/todo/todo_markdown_node.py +0 -21
  307. notionary/blocks/todo/todo_models.py +0 -18
  308. notionary/blocks/toggle/__init__.py +0 -12
  309. notionary/blocks/toggle/toggle_element.py +0 -112
  310. notionary/blocks/toggle/toggle_markdown_node.py +0 -31
  311. notionary/blocks/toggle/toggle_models.py +0 -17
  312. notionary/blocks/toggleable_heading/__init__.py +0 -11
  313. notionary/blocks/toggleable_heading/toggleable_heading_element.py +0 -115
  314. notionary/blocks/toggleable_heading/toggleable_heading_markdown_node.py +0 -34
  315. notionary/blocks/types.py +0 -130
  316. notionary/blocks/video/__init__.py +0 -11
  317. notionary/blocks/video/video_element.py +0 -187
  318. notionary/blocks/video/video_element_models.py +0 -10
  319. notionary/blocks/video/video_markdown_node.py +0 -26
  320. notionary/comments/__init__.py +0 -26
  321. notionary/database/__init__.py +0 -4
  322. notionary/database/database.py +0 -480
  323. notionary/database/database_filter_builder.py +0 -173
  324. notionary/database/database_provider.py +0 -227
  325. notionary/database/exceptions.py +0 -13
  326. notionary/database/factory.py +0 -0
  327. notionary/database/models.py +0 -337
  328. notionary/database/notion_database.py +0 -487
  329. notionary/file_upload/__init__.py +0 -7
  330. notionary/page/client.py +0 -124
  331. notionary/page/markdown_whitespace_processor.py +0 -129
  332. notionary/page/models.py +0 -322
  333. notionary/page/notion_page.py +0 -712
  334. notionary/page/page_content_deleting_service.py +0 -117
  335. notionary/page/page_content_writer.py +0 -80
  336. notionary/page/property_formatter.py +0 -99
  337. notionary/page/reader/handler/__init__.py +0 -19
  338. notionary/page/reader/handler/base_block_renderer.py +0 -44
  339. notionary/page/reader/handler/block_processing_context.py +0 -35
  340. notionary/page/reader/handler/block_rendering_context.py +0 -48
  341. notionary/page/reader/handler/column_list_renderer.py +0 -51
  342. notionary/page/reader/handler/column_renderer.py +0 -60
  343. notionary/page/reader/handler/equation_renderer.py +0 -0
  344. notionary/page/reader/handler/line_renderer.py +0 -73
  345. notionary/page/reader/handler/numbered_list_renderer.py +0 -85
  346. notionary/page/reader/handler/toggle_renderer.py +0 -69
  347. notionary/page/reader/handler/toggleable_heading_renderer.py +0 -89
  348. notionary/page/reader/page_content_retriever.py +0 -81
  349. notionary/page/search_filter_builder.py +0 -132
  350. notionary/page/utils.py +0 -60
  351. notionary/page/writer/handler/__init__.py +0 -24
  352. notionary/page/writer/handler/code_handler.py +0 -72
  353. notionary/page/writer/handler/column_handler.py +0 -141
  354. notionary/page/writer/handler/column_list_handler.py +0 -139
  355. notionary/page/writer/handler/equation_handler.py +0 -74
  356. notionary/page/writer/handler/line_handler.py +0 -35
  357. notionary/page/writer/handler/line_processing_context.py +0 -54
  358. notionary/page/writer/handler/regular_line_handler.py +0 -86
  359. notionary/page/writer/handler/table_handler.py +0 -66
  360. notionary/page/writer/handler/toggle_handler.py +0 -159
  361. notionary/page/writer/handler/toggleable_heading_handler.py +0 -174
  362. notionary/page/writer/markdown_to_notion_converter.py +0 -139
  363. notionary/page/writer/markdown_to_notion_converter_context.py +0 -30
  364. notionary/page/writer/markdown_to_notion_text_length_post_processor.py +0 -0
  365. notionary/page/writer/notion_text_length_processor.py +0 -150
  366. notionary/schemas/__init__.py +0 -3
  367. notionary/schemas/base.py +0 -73
  368. notionary/shared/__init__.py +0 -3
  369. notionary/shared/name_to_id_resolver.py +0 -203
  370. notionary/telemetry/__init__.py +0 -19
  371. notionary/telemetry/service.py +0 -136
  372. notionary/telemetry/views.py +0 -73
  373. notionary/user/base_notion_user.py +0 -53
  374. notionary/user/models.py +0 -84
  375. notionary/user/notion_bot_user.py +0 -226
  376. notionary/user/notion_user.py +0 -255
  377. notionary/user/notion_user_manager.py +0 -101
  378. notionary/util/__init__.py +0 -15
  379. notionary/util/concurrency_limiter.py +0 -0
  380. notionary/util/factory_decorator.py +0 -0
  381. notionary/util/factory_only.py +0 -37
  382. notionary/util/fuzzy.py +0 -75
  383. notionary/util/page_id_utils.py +0 -27
  384. notionary/util/singleton.py +0 -18
  385. notionary/util/singleton_metaclass.py +0 -22
  386. notionary/workspace.py +0 -105
  387. notionary-0.2.27.dist-info/RECORD +0 -202
@@ -1,39 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from typing import Optional
5
-
6
- from notionary.blocks.base_block_element import BaseBlockElement
7
- from notionary.blocks.breadcrumbs.breadcrumb_models import (
8
- BreadcrumbBlock,
9
- CreateBreadcrumbBlock,
10
- )
11
- from notionary.blocks.models import Block, BlockCreateResult, BlockType
12
-
13
-
14
- class BreadcrumbElement(BaseBlockElement):
15
- """
16
- Handles conversion between Markdown breadcrumb marker and Notion breadcrumb blocks.
17
-
18
- Markdown syntax:
19
- [breadcrumb]
20
- """
21
-
22
- BREADCRUMB_MARKER = "[breadcrumb]"
23
- PATTERN = re.compile(r"^\[breadcrumb\]\s*$", re.IGNORECASE)
24
-
25
- @classmethod
26
- def match_notion(cls, block: Block) -> bool:
27
- # Kein extra Payload – nur Typ prüfen
28
- return block.type == BlockType.BREADCRUMB and block.breadcrumb
29
-
30
- @classmethod
31
- async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
32
- if not cls.PATTERN.match(text.strip()):
33
- return None
34
- return CreateBreadcrumbBlock(breadcrumb=BreadcrumbBlock())
35
-
36
- @classmethod
37
- async def notion_to_markdown(cls, block: Block) -> Optional[str]:
38
- if block.type == BlockType.BREADCRUMB and block.breadcrumb:
39
- return cls.BREADCRUMB_MARKER
@@ -1,13 +0,0 @@
1
- from notionary.blocks.markdown.markdown_node import MarkdownNode
2
-
3
-
4
- class BreadcrumbMarkdownNode(MarkdownNode):
5
- """
6
- Enhanced Breadcrumb node with Pydantic integration.
7
- Programmatic interface for creating Markdown breadcrumb blocks.
8
- Example:
9
- [breadcrumb]
10
- """
11
-
12
- def to_markdown(self) -> str:
13
- return "[breadcrumb]"
@@ -1,12 +0,0 @@
1
- from typing import Literal
2
-
3
- from pydantic import BaseModel
4
-
5
-
6
- class BreadcrumbBlock(BaseModel):
7
- pass
8
-
9
-
10
- class CreateBreadcrumbBlock(BaseModel):
11
- type: Literal["breadcrumb"] = "breadcrumb"
12
- breadcrumb: BreadcrumbBlock
@@ -1,15 +0,0 @@
1
- from notionary.blocks.bulleted_list.bulleted_list_element import BulletedListElement
2
- from notionary.blocks.bulleted_list.bulleted_list_markdown_node import (
3
- BulletedListMarkdownNode,
4
- )
5
- from notionary.blocks.bulleted_list.bulleted_list_models import (
6
- BulletedListItemBlock,
7
- CreateBulletedListItemBlock,
8
- )
9
-
10
- __all__ = [
11
- "BulletedListElement",
12
- "BulletedListItemBlock",
13
- "CreateBulletedListItemBlock",
14
- "BulletedListMarkdownNode",
15
- ]
@@ -1,74 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from typing import Optional
5
-
6
- from notionary.blocks.base_block_element import BaseBlockElement
7
- from notionary.blocks.bulleted_list.bulleted_list_models import (
8
- BulletedListItemBlock,
9
- CreateBulletedListItemBlock,
10
- )
11
- from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
12
- from notionary.blocks.models import Block, BlockCreateResult, BlockType
13
- from notionary.blocks.rich_text.text_inline_formatter import TextInlineFormatter
14
-
15
-
16
- class BulletedListElement(BaseBlockElement):
17
- """Class for converting between Markdown bullet lists and Notion bulleted list items."""
18
-
19
- # Regex for markdown bullets (excluding todo items [ ] or [x])
20
- PATTERN = re.compile(r"^(\s*)[*\-+]\s+(?!\[[ x]\])(.+)$")
21
-
22
- @classmethod
23
- def match_notion(cls, block: Block) -> bool:
24
- """Check if this element can handle the given Notion block."""
25
- return block.type == BlockType.BULLETED_LIST_ITEM and block.bulleted_list_item
26
-
27
- @classmethod
28
- async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
29
- """
30
- Convert a markdown bulleted list item into a Notion BulletedListItemBlock.
31
- """
32
- if not (match := cls.PATTERN.match(text.strip())):
33
- return None
34
-
35
- # Extract the content part (second capture group)
36
- content = match.group(2)
37
-
38
- # Parse inline markdown formatting into RichTextObject list
39
- rich_text = await TextInlineFormatter.parse_inline_formatting(content)
40
-
41
- # Return a properly typed Notion block
42
- bulleted_list_content = BulletedListItemBlock(
43
- rich_text=rich_text, color="default"
44
- )
45
- return CreateBulletedListItemBlock(bulleted_list_item=bulleted_list_content)
46
-
47
- @classmethod
48
- async def notion_to_markdown(cls, block: Block) -> Optional[str]:
49
- """Convert Notion bulleted_list_item block to Markdown."""
50
- if block.type != BlockType.BULLETED_LIST_ITEM or not block.bulleted_list_item:
51
- return None
52
-
53
- rich_list = block.bulleted_list_item.rich_text
54
- if not rich_list:
55
- return "-"
56
-
57
- text = await TextInlineFormatter.extract_text_with_formatting(rich_list)
58
- return f"- {text}"
59
-
60
- @classmethod
61
- def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
62
- """Get system prompt information for bulleted list blocks."""
63
- return BlockElementMarkdownInformation(
64
- block_type=cls.__name__,
65
- description="Bulleted list items create unordered lists with bullet points",
66
- syntax_examples=[
67
- "- First item",
68
- "* Second item",
69
- "+ Third item",
70
- "- Item with **bold text**",
71
- "- Item with *italic text*",
72
- ],
73
- usage_guidelines="Use -, *, or + to create bullet points. Supports inline formatting like bold, italic, and links. Do not use for todo items (use [ ] or [x] for those).",
74
- )
@@ -1,20 +0,0 @@
1
- from notionary.blocks.markdown.markdown_node import MarkdownNode
2
-
3
-
4
- class BulletedListMarkdownNode(MarkdownNode):
5
- """
6
- Enhanced BulletedList node with Pydantic integration.
7
- Programmatic interface for creating Markdown bulleted list items.
8
- Example:
9
- - First item
10
- - Second item
11
- - Third item
12
- """
13
-
14
- texts: list[str]
15
-
16
- def to_markdown(self) -> str:
17
- result = []
18
- for text in self.texts:
19
- result.append(f"- {text}")
20
- return "\n".join(result)
@@ -1,17 +0,0 @@
1
- from typing import Literal
2
-
3
- from pydantic import BaseModel, Field
4
-
5
- from notionary.blocks.models import Block
6
- from notionary.blocks.rich_text import RichTextObject
7
- from notionary.blocks.types import BlockColor
8
-
9
-
10
- class BulletedListItemBlock(BaseModel):
11
- rich_text: list[RichTextObject]
12
- color: BlockColor = BlockColor.DEFAULT
13
-
14
-
15
- class CreateBulletedListItemBlock(BaseModel):
16
- type: Literal["bulleted_list_item"] = "bulleted_list_item"
17
- bulleted_list_item: BulletedListItemBlock
@@ -1,12 +0,0 @@
1
- from notionary.blocks.callout.callout_element import CalloutElement
2
- from notionary.blocks.callout.callout_markdown_node import (
3
- CalloutMarkdownNode,
4
- )
5
- from notionary.blocks.callout.callout_models import CalloutBlock, CreateCalloutBlock
6
-
7
- __all__ = [
8
- "CalloutElement",
9
- "CalloutBlock",
10
- "CreateCalloutBlock",
11
- "CalloutMarkdownNode",
12
- ]
@@ -1,99 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from typing import Optional
5
-
6
- from notionary.blocks.base_block_element import BaseBlockElement
7
- from notionary.blocks.callout.callout_models import (
8
- CalloutBlock,
9
- CreateCalloutBlock,
10
- EmojiIcon,
11
- IconObject,
12
- )
13
- from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
14
- from notionary.blocks.models import Block, BlockCreateResult, BlockType
15
- from notionary.blocks.rich_text.text_inline_formatter import TextInlineFormatter
16
-
17
-
18
- class CalloutElement(BaseBlockElement):
19
- """
20
- Handles conversion between Markdown callouts and Notion callout blocks.
21
-
22
- Markdown callout syntax:
23
- - [callout](Text) - Simple callout with default emoji
24
- - [callout](Text "emoji") - Callout with custom emoji
25
-
26
- Where:
27
- - Text is the required callout content
28
- - emoji is an optional emoji character (enclosed in quotes)
29
- """
30
-
31
- PATTERN = re.compile(
32
- r"^\[callout\]\(" # prefix
33
- r"([^\"]+?)" # content
34
- r"(?:\s+\"([^\"]+)\")?" # optional emoji
35
- r"\)$"
36
- )
37
-
38
- DEFAULT_EMOJI = "💡"
39
- DEFAULT_COLOR = "gray_background"
40
-
41
- @classmethod
42
- def match_notion(cls, block: Block) -> bool:
43
- return block.type == BlockType.CALLOUT and block.callout
44
-
45
- @classmethod
46
- async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
47
- """Convert a markdown callout into a Notion CalloutBlock."""
48
- match = cls.PATTERN.match(text.strip())
49
- if not match:
50
- return None
51
-
52
- content, emoji = match.group(1), match.group(2)
53
- if not content:
54
- return None
55
-
56
- if not emoji:
57
- emoji = cls.DEFAULT_EMOJI
58
-
59
- rich_text = await TextInlineFormatter.parse_inline_formatting(content.strip())
60
-
61
- callout_content = CalloutBlock(
62
- rich_text=rich_text,
63
- icon=EmojiIcon(emoji=emoji),
64
- color=cls.DEFAULT_COLOR,
65
- )
66
- return CreateCalloutBlock(callout=callout_content)
67
-
68
- @classmethod
69
- async def notion_to_markdown(cls, block: Block) -> Optional[str]:
70
- if block.type != BlockType.CALLOUT or not block.callout:
71
- return None
72
-
73
- data = block.callout
74
-
75
- content = await TextInlineFormatter.extract_text_with_formatting(data.rich_text)
76
- if not content:
77
- return None
78
-
79
- icon: Optional[IconObject] = block.callout.icon
80
- emoji_char = icon.emoji if isinstance(icon, EmojiIcon) else cls.DEFAULT_EMOJI
81
-
82
- if emoji_char and emoji_char != cls.DEFAULT_EMOJI:
83
- return f'[callout]({content} "{emoji_char}")'
84
- return f"[callout]({content})"
85
-
86
- @classmethod
87
- def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
88
- """Get system prompt information for callout blocks."""
89
- return BlockElementMarkdownInformation(
90
- block_type=cls.__name__,
91
- description="Callout blocks create highlighted text boxes with optional custom emojis for emphasis",
92
- syntax_examples=[
93
- "[callout](This is important information)",
94
- '[callout](Warning message "⚠️")',
95
- '[callout](Success message "✅")',
96
- "[callout](Note with default emoji)",
97
- ],
98
- usage_guidelines="Use for highlighting important information, warnings, tips, or notes. Default emoji is 💡. Custom emoji should be provided in quotes after the text content.",
99
- )
@@ -1,19 +0,0 @@
1
- from typing import Optional
2
- from notionary.blocks.markdown.markdown_node import MarkdownNode
3
-
4
-
5
- class CalloutMarkdownNode(MarkdownNode):
6
- """
7
- Enhanced Callout node with Pydantic integration.
8
- Programmatic interface for creating Notion-style callout Markdown blocks.
9
- Example: [callout](This is important "⚠️")
10
- """
11
-
12
- text: str
13
- emoji: Optional[str] = None
14
-
15
- def to_markdown(self) -> str:
16
- if self.emoji and self.emoji != "💡":
17
- return f'[callout]({self.text} "{self.emoji}")'
18
- else:
19
- return f"[callout]({self.text})"
@@ -1,33 +0,0 @@
1
- from typing import Literal, Optional, Union
2
-
3
- from pydantic import BaseModel, Field, model_serializer
4
-
5
- from notionary.blocks.file.file_element_models import FileBlock
6
- from notionary.blocks.models import Block
7
- from notionary.blocks.rich_text.rich_text_models import RichTextObject
8
- from notionary.blocks.types import BlockColor
9
-
10
-
11
- class EmojiIcon(BaseModel):
12
- type: Literal["emoji"] = "emoji"
13
- emoji: str
14
-
15
-
16
- class FileIcon(BaseModel):
17
- type: Literal["file"] = "file"
18
- file: FileBlock
19
-
20
-
21
- IconObject = Union[EmojiIcon, FileIcon]
22
-
23
-
24
- class CalloutBlock(BaseModel):
25
- rich_text: list[RichTextObject]
26
- color: BlockColor = BlockColor.DEFAULT
27
- icon: Optional[IconObject] = None
28
- children: Optional[list[Block]] = None
29
-
30
-
31
- class CreateCalloutBlock(BaseModel):
32
- type: Literal["callout"] = "callout"
33
- callout: CalloutBlock
@@ -1,14 +0,0 @@
1
- """
2
- Child Database Block Module
3
-
4
- This module provides functionality for handling Notion child database blocks.
5
- """
6
-
7
- from .child_database_element import ChildDatabaseElement
8
- from .child_database_models import ChildDatabaseBlock, CreateChildDatabaseBlock
9
-
10
- __all__ = [
11
- "ChildDatabaseElement",
12
- "ChildDatabaseBlock",
13
- "CreateChildDatabaseBlock",
14
- ]
@@ -1,59 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from typing import Optional
5
-
6
- from notionary.blocks.base_block_element import BaseBlockElement
7
- from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
8
- from notionary.blocks.models import Block, BlockType
9
- from notionary.util import LoggingMixin
10
-
11
-
12
- class ChildDatabaseElement(BaseBlockElement, LoggingMixin):
13
- """
14
- Handles conversion between Markdown database references and Notion child database blocks.
15
-
16
- Creates new databases when converting from markdown.
17
- """
18
-
19
- PATTERN_BRACKET = re.compile(r"^\[database:\s*(.+)\]$", re.IGNORECASE)
20
- PATTERN_EMOJI = re.compile(r"^📊\s*(.+)$")
21
-
22
- @classmethod
23
- def match_notion(cls, block: Block) -> bool:
24
- return block.type == BlockType.CHILD_DATABASE and block.child_database
25
-
26
- @classmethod
27
- async def markdown_to_notion(cls, text: str) -> Optional[str]:
28
- """
29
- Convert markdown database syntax to actual Notion database.
30
- Returns the database_id if successful, None otherwise.
31
- """
32
- return None
33
-
34
- @classmethod
35
- async def notion_to_markdown(cls, block: Block) -> Optional[str]:
36
- if block.type != BlockType.CHILD_DATABASE or not block.child_database:
37
- return None
38
-
39
- title = block.child_database.title
40
- if not title or not title.strip():
41
- return None
42
-
43
- # Use bracket syntax for output
44
- return f"[database: {title.strip()}]"
45
-
46
- @classmethod
47
- def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
48
- """Get system prompt information for child database blocks."""
49
- return BlockElementMarkdownInformation(
50
- block_type=cls.__name__,
51
- description="Creates new embedded databases within a Notion page",
52
- syntax_examples=[
53
- "[database: Project Tasks]",
54
- "[database: Customer Information]",
55
- "📊 Sales Pipeline",
56
- "📊 Team Directory",
57
- ],
58
- usage_guidelines="Use to create new databases that will be embedded in the page. The database will be created with a basic 'Name' property and can be customized later.",
59
- )
@@ -1,12 +0,0 @@
1
- from typing import Literal
2
-
3
- from pydantic import BaseModel
4
-
5
-
6
- class ChildDatabaseBlock(BaseModel):
7
- title: str
8
-
9
-
10
- class CreateChildDatabaseBlock(BaseModel):
11
- type: Literal["child_database"] = "child_database"
12
- child_database: ChildDatabaseBlock
@@ -1,9 +0,0 @@
1
- from notionary.blocks.child_page.child_page_models import (
2
- ChildPageBlock,
3
- CreateChildPageBlock,
4
- )
5
-
6
- __all__ = [
7
- "ChildPageBlock",
8
- "CreateChildPageBlock",
9
- ]
@@ -1,94 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from typing import Optional
5
-
6
- from notionary.blocks.base_block_element import BaseBlockElement
7
- from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
8
- from notionary.blocks.models import Block, BlockCreateResult, BlockType
9
- from notionary.page.page_context import get_page_context
10
-
11
-
12
- class ChildPageElement(BaseBlockElement):
13
- """
14
- Handles conversion between Markdown page references and Notion child page blocks.
15
-
16
- Creates new pages when converting from markdown.
17
- """
18
-
19
- PATTERN_BRACKET = re.compile(r"^\[page:\s*(.+)\]$", re.IGNORECASE)
20
- PATTERN_EMOJI = re.compile(r"^[📝📄]\s*(.+)$")
21
-
22
- @classmethod
23
- def match_notion(cls, block: Block) -> bool:
24
- return block.type == BlockType.CHILD_PAGE and getattr(block, "child_page", None)
25
-
26
- @classmethod
27
- async def markdown_to_notion(cls, text: str) -> Optional[BlockCreateResult]:
28
- """
29
- Convert markdown page syntax to an actual Notion page.
30
- Returns None since child_page blocks are created implicitly via Pages API (not Blocks API).
31
- """
32
- context = get_page_context()
33
-
34
- text = text.strip()
35
-
36
- match = cls.PATTERN_BRACKET.match(text)
37
- if not match:
38
- match = cls.PATTERN_EMOJI.match(text)
39
-
40
- if not match:
41
- return None
42
-
43
- title = match.group(1).strip()
44
- if not title:
45
- return None
46
-
47
- # Reject multiline titles
48
- if "\n" in title or "\r" in title:
49
- return None
50
-
51
- try:
52
- # Create the actual page using context
53
- await context.page_client.create_page(
54
- title=title,
55
- parent_page_id=context.page_id,
56
- )
57
- # Return None as per BaseBlockElement convention:
58
- # child_page blocks cannot be written through the Blocks API directly.
59
- # Creating a page under the parent page will automatically insert a child_page block.
60
- return None
61
-
62
- except Exception as e:
63
- print(f"Failed to create page '{title}': {e}")
64
- return None
65
-
66
- @classmethod
67
- async def notion_to_markdown(cls, block: Block) -> Optional[str]:
68
- if block.type != BlockType.CHILD_PAGE or not getattr(block, "child_page", None):
69
- return None
70
-
71
- title = block.child_page.title
72
- if not title or not title.strip():
73
- return None
74
-
75
- # Use bracket syntax for output
76
- return f"[page: {title.strip()}]"
77
-
78
- @classmethod
79
- def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
80
- """Get system prompt information for child page blocks."""
81
- return BlockElementMarkdownInformation(
82
- block_type=cls.__name__,
83
- description="Creates new sub-pages within a Notion page.",
84
- syntax_examples=[
85
- "[page: Meeting Notes]",
86
- "[page: Ideas]",
87
- "📝 Project Overview",
88
- "📄 Research Log",
89
- ],
90
- usage_guidelines=(
91
- "Use to create new pages that will appear as child_page blocks in the current page. "
92
- "Pages are created via the Pages API with the current page as parent."
93
- ),
94
- )
@@ -1,12 +0,0 @@
1
- from typing import Literal
2
-
3
- from pydantic import BaseModel
4
-
5
-
6
- class ChildPageBlock(BaseModel):
7
- title: str
8
-
9
-
10
- class CreateChildPageBlock(BaseModel):
11
- type: Literal["child_page"] = "child_page"
12
- child_page: ChildPageBlock
@@ -1,11 +0,0 @@
1
- from notionary.blocks.code.code_element import CodeElement
2
- from notionary.blocks.code.code_markdown_node import CodeMarkdownNode
3
- from notionary.blocks.code.code_models import CodeBlock, CodeLanguage, CreateCodeBlock
4
-
5
- __all__ = [
6
- "CodeElement",
7
- "CodeBlock",
8
- "CodeLanguage",
9
- "CreateCodeBlock",
10
- "CodeMarkdownNode",
11
- ]