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,16 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from notionary.blocks.markdown.markdown_node import MarkdownNode
4
-
5
-
6
- class ParagraphMarkdownNode(MarkdownNode):
7
- """
8
- Enhanced Paragraph node with Pydantic integration.
9
- Programmatic interface for creating Markdown paragraphs.
10
- Paragraphs are standard text without special block formatting.
11
- """
12
-
13
- text: str
14
-
15
- def to_markdown(self) -> str:
16
- return self.text
@@ -1,16 +0,0 @@
1
- from typing import Literal
2
-
3
- from pydantic import BaseModel
4
-
5
- from notionary.blocks.rich_text.rich_text_models import RichTextObject
6
- from notionary.blocks.types import BlockColor
7
-
8
-
9
- class ParagraphBlock(BaseModel):
10
- rich_text: list[RichTextObject]
11
- color: BlockColor = BlockColor.DEFAULT.value
12
-
13
-
14
- class CreateParagraphBlock(BaseModel):
15
- type: Literal["paragraph"] = "paragraph"
16
- paragraph: ParagraphBlock
@@ -1,11 +0,0 @@
1
- from notionary.blocks.pdf.pdf_element import PdfElement
2
- from notionary.blocks.pdf.pdf_markdown_node import (
3
- PdfMarkdownNode,
4
- )
5
- from notionary.blocks.pdf.pdf_models import CreatePdfBlock
6
-
7
- __all__ = [
8
- "PdfElement",
9
- "CreatePdfBlock",
10
- "PdfMarkdownNode",
11
- ]
@@ -1,146 +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.file.file_element_models import (
8
- ExternalFile,
9
- FileBlock,
10
- FileType,
11
- FileUploadFile,
12
- )
13
- from notionary.blocks.mixins.captions import CaptionMixin
14
- from notionary.blocks.mixins.file_upload.file_upload_mixin import FileUploadMixin
15
- from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
16
- from notionary.blocks.models import Block, BlockCreateResult, BlockType
17
- from notionary.blocks.pdf.pdf_models import CreatePdfBlock
18
-
19
-
20
- class PdfElement(BaseBlockElement, CaptionMixin, FileUploadMixin):
21
- r"""
22
- Handles conversion between Markdown PDF embeds and Notion PDF blocks.
23
-
24
- Supports both external URLs and local PDF file uploads.
25
-
26
- Markdown PDF syntax:
27
- - [pdf](https://example.com/document.pdf) - External URL
28
- - [pdf](./local/document.pdf) - Local PDF file (will be uploaded)
29
- - [pdf](C:\Documents\report.pdf) - Absolute local path (will be uploaded)
30
- - [pdf](https://example.com/document.pdf)(caption:Annual Report 2024) - With caption
31
- - [pdf](notion://file_id_here)(caption:Notion hosted file) - Notion hosted file
32
- - [pdf](upload://upload_id_here)(caption:File upload) - File upload
33
- """
34
-
35
- PDF_PATTERN = re.compile(r"\[pdf\]\(([^)]+)\)")
36
-
37
- @classmethod
38
- def match_notion(cls, block: Block) -> bool:
39
- """Match Notion PDF blocks."""
40
- return block.type == BlockType.PDF and block.pdf
41
-
42
- @classmethod
43
- async def markdown_to_notion(cls, text: str) -> Optional[BlockCreateResult]:
44
- """Convert markdown PDF link to Notion PDF block."""
45
- pdf_path = cls._extract_pdf_path(text.strip())
46
-
47
- if not pdf_path:
48
- return None
49
-
50
- cls.logger.info(f"Processing PDF: {pdf_path}")
51
-
52
- # Extract caption
53
- caption_text = cls.extract_caption(text.strip())
54
- caption_rich_text = cls.build_caption_rich_text(caption_text or "")
55
-
56
- # Handle different types of PDF sources
57
- if pdf_path.startswith(("notion://", "upload://")):
58
- # Handle special Notion schemes (existing functionality)
59
- cls.logger.info(f"Using special scheme: {pdf_path}")
60
- pdf_block = FileBlock(
61
- type=FileType.EXTERNAL,
62
- external=ExternalFile(url=pdf_path),
63
- caption=caption_rich_text,
64
- )
65
-
66
- elif cls._is_local_file_path(pdf_path):
67
- # Handle local PDF file upload using mixin
68
- cls.logger.debug(f"Detected local PDF file: {pdf_path}")
69
-
70
- # Upload the local PDF file with PDF category validation
71
- file_upload_id = await cls._upload_local_file(pdf_path, "pdf")
72
- if not file_upload_id:
73
- cls.logger.error(f"Failed to upload PDF: {pdf_path}")
74
- return None
75
-
76
- # Create FILE_UPLOAD block
77
- pdf_block = FileBlock(
78
- type=FileType.FILE_UPLOAD,
79
- file_upload=FileUploadFile(id=file_upload_id),
80
- caption=caption_rich_text,
81
- )
82
-
83
- else:
84
- # Handle external URL
85
- cls.logger.debug(f"Using external PDF URL: {pdf_path}")
86
-
87
- pdf_block = FileBlock(
88
- type=FileType.EXTERNAL,
89
- external=ExternalFile(url=pdf_path),
90
- caption=caption_rich_text,
91
- )
92
-
93
- return CreatePdfBlock(pdf=pdf_block)
94
-
95
- @classmethod
96
- async def notion_to_markdown(cls, block: Block) -> Optional[str]:
97
- """Convert Notion PDF block to markdown."""
98
- if block.type != BlockType.PDF or not block.pdf:
99
- return None
100
-
101
- pb: FileBlock = block.pdf
102
-
103
- # Determine the source for markdown
104
- if pb.type == FileType.EXTERNAL and pb.external:
105
- source = pb.external.url
106
- elif pb.type == FileType.FILE and pb.file:
107
- source = pb.file.url
108
- else:
109
- return None
110
-
111
- result = f"[pdf]({source})"
112
-
113
- # Add caption if present
114
- caption_markdown = await cls.format_caption_for_markdown(pb.caption or [])
115
- if caption_markdown:
116
- result += caption_markdown
117
-
118
- return result
119
-
120
- @classmethod
121
- def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
122
- """Get system prompt information for PDF blocks."""
123
- return BlockElementMarkdownInformation(
124
- block_type=cls.__name__,
125
- description="PDF blocks embed and display PDF documents from external URLs or upload local PDF files with optional captions",
126
- syntax_examples=[
127
- "[pdf](https://example.com/document.pdf)",
128
- "[pdf](./local/report.pdf)",
129
- "[pdf](C:\\Documents\\manual.pdf)",
130
- "[pdf](https://example.com/report.pdf)(caption:Annual Report 2024)",
131
- "(caption:User Manual)[pdf](./manual.pdf)",
132
- "[pdf](./guide.pdf)(caption:**Important** documentation)",
133
- ],
134
- usage_guidelines="Use for embedding PDF documents that can be viewed inline. Supports both external URLs and local PDF file uploads. Local PDF files will be automatically uploaded to Notion. Caption supports rich text formatting and should describe the PDF content.",
135
- )
136
-
137
- @classmethod
138
- def _extract_pdf_path(cls, text: str) -> Optional[str]:
139
- """Extract PDF path/URL from text, handling caption patterns."""
140
- clean_text = cls.remove_caption(text)
141
-
142
- match = cls.PDF_PATTERN.search(clean_text)
143
- if match:
144
- return match.group(1).strip()
145
-
146
- return None
@@ -1,24 +0,0 @@
1
- from typing import Optional
2
-
3
- from notionary.blocks.markdown.markdown_node import MarkdownNode
4
- from notionary.blocks.mixins.captions import CaptionMarkdownNodeMixin
5
-
6
-
7
- class PdfMarkdownNode(MarkdownNode, CaptionMarkdownNodeMixin):
8
- """
9
- Enhanced PDF node with Pydantic integration.
10
- Programmatic interface for creating Notion-style PDF blocks.
11
- """
12
-
13
- url: str
14
- caption: Optional[str] = None
15
-
16
- def to_markdown(self) -> str:
17
- """Return the Markdown representation.
18
-
19
- Examples:
20
- - [pdf](https://example.com/document.pdf)
21
- - [pdf](https://example.com/document.pdf)(caption:Critical safety information)
22
- """
23
- base_markdown = f"[pdf]({self.url})"
24
- return self.append_caption_to_markdown(base_markdown, self.caption)
@@ -1,11 +0,0 @@
1
- from typing import Literal
2
-
3
- from pydantic import BaseModel
4
-
5
- from notionary.blocks.file.file_element_models import FileBlock
6
- from notionary.blocks.rich_text.rich_text_models import RichTextObject
7
-
8
-
9
- class CreatePdfBlock(BaseModel):
10
- type: Literal["pdf"] = "pdf"
11
- pdf: FileBlock
@@ -1,14 +0,0 @@
1
- """Quote block handling for Notionary."""
2
-
3
- from notionary.blocks.quote.quote_element import QuoteElement
4
- from notionary.blocks.quote.quote_markdown_node import (
5
- QuoteMarkdownNode,
6
- )
7
- from notionary.blocks.quote.quote_models import CreateQuoteBlock, QuoteBlock
8
-
9
- __all__ = [
10
- "QuoteElement",
11
- "QuoteBlock",
12
- "CreateQuoteBlock",
13
- "QuoteMarkdownNode",
14
- ]
@@ -1,75 +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.blocks.quote.quote_models import CreateQuoteBlock, QuoteBlock
10
- from notionary.blocks.rich_text.text_inline_formatter import TextInlineFormatter
11
- from notionary.blocks.types import BlockColor
12
-
13
-
14
- class QuoteElement(BaseBlockElement):
15
- """
16
- Handles conversion between Markdown quotes and Notion quote blocks.
17
-
18
- Markdown quote syntax:
19
- - > Simple quote text
20
-
21
- Only single-line quotes without author metadata.
22
- """
23
-
24
- PATTERN = re.compile(r"^>\s*(.+)$")
25
-
26
- @classmethod
27
- def match_notion(cls, block: Block) -> bool:
28
- return block.type == BlockType.QUOTE and block.quote
29
-
30
- @classmethod
31
- async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
32
- """Convert markdown quote to Notion QuoteBlock."""
33
- match = cls.PATTERN.match(text.strip())
34
- if not match:
35
- return None
36
-
37
- content = match.group(1).strip()
38
- if not content:
39
- return None
40
-
41
- # Reject multiline quotes
42
- if "\n" in content or "\r" in content:
43
- return None
44
-
45
- rich_text = await TextInlineFormatter.parse_inline_formatting(content)
46
-
47
- quote_content = QuoteBlock(rich_text=rich_text, color=BlockColor.DEFAULT)
48
- return CreateQuoteBlock(quote=quote_content)
49
-
50
- @classmethod
51
- async def notion_to_markdown(cls, block: Block) -> Optional[str]:
52
- if block.type != BlockType.QUOTE or not block.quote:
53
- return None
54
-
55
- rich = block.quote.rich_text
56
- text = await TextInlineFormatter.extract_text_with_formatting(rich)
57
-
58
- if not text.strip():
59
- return None
60
-
61
- return f"> {text.strip()}"
62
-
63
- @classmethod
64
- def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
65
- """Get system prompt information for quote blocks."""
66
- return BlockElementMarkdownInformation(
67
- block_type=cls.__name__,
68
- description="Quote blocks display highlighted quotations or emphasized text",
69
- syntax_examples=[
70
- "> This is an important quote",
71
- "> The only way to do great work is to love what you do",
72
- "> Innovation distinguishes between a leader and a follower",
73
- ],
74
- usage_guidelines="Use for quotations, important statements, or text that should be visually emphasized. Content should be meaningful and stand out from regular paragraphs.",
75
- )
@@ -1,16 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from notionary.blocks.markdown.markdown_node import MarkdownNode
4
-
5
-
6
- class QuoteMarkdownNode(MarkdownNode):
7
- """
8
- Enhanced Quote node with Pydantic integration.
9
- Programmatic interface for creating Notion-style quote blocks.
10
- Example: > This is a quote
11
- """
12
-
13
- text: str
14
-
15
- def to_markdown(self) -> str:
16
- return f"> {self.text}"
@@ -1,18 +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.rich_text_models import RichTextObject
7
- from notionary.blocks.types import BlockColor
8
-
9
-
10
- class QuoteBlock(BaseModel):
11
- rich_text: list[RichTextObject]
12
- color: BlockColor = BlockColor.DEFAULT
13
- children: list[Block] = Field(default_factory=list)
14
-
15
-
16
- class CreateQuoteBlock(BaseModel):
17
- type: Literal["quote"] = "quote"
18
- quote: QuoteBlock
@@ -1,3 +0,0 @@
1
- from .block_registry import BlockRegistry
2
-
3
- __all__ = ["BlockRegistry"]
@@ -1,150 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from collections import OrderedDict
4
- from typing import Type, Set
5
-
6
- from notionary.blocks.base_block_element import BaseBlockElement
7
- from notionary.telemetry import ProductTelemetry
8
-
9
- from notionary.blocks.audio import AudioElement
10
- from notionary.blocks.bookmark import BookmarkElement
11
- from notionary.blocks.breadcrumbs import BreadcrumbElement
12
- from notionary.blocks.bulleted_list import BulletedListElement
13
- from notionary.blocks.callout import CalloutElement
14
- from notionary.blocks.child_database import ChildDatabaseElement
15
- from notionary.blocks.code import CodeElement
16
- from notionary.blocks.column import ColumnElement, ColumnListElement
17
- from notionary.blocks.divider import DividerElement
18
- from notionary.blocks.embed import EmbedElement
19
- from notionary.blocks.equation import EquationElement
20
- from notionary.blocks.file import FileElement
21
- from notionary.blocks.heading import HeadingElement
22
- from notionary.blocks.image_block import ImageElement
23
- from notionary.blocks.numbered_list import NumberedListElement
24
- from notionary.blocks.paragraph import ParagraphElement
25
- from notionary.blocks.pdf import PdfElement
26
- from notionary.blocks.quote import QuoteElement
27
- from notionary.blocks.table import TableElement
28
- from notionary.blocks.table_of_contents import TableOfContentsElement
29
- from notionary.blocks.todo import TodoElement
30
- from notionary.blocks.toggle import ToggleElement
31
- from notionary.blocks.toggleable_heading import ToggleableHeadingElement
32
- from notionary.blocks.video import VideoElement
33
-
34
-
35
- class BlockRegistry:
36
- """Registry of elements that can convert between Markdown and Notion."""
37
-
38
- _DEFAULT_ELEMENTS = [
39
- HeadingElement,
40
- CalloutElement,
41
- CodeElement,
42
- DividerElement,
43
- TableElement,
44
- BulletedListElement,
45
- NumberedListElement,
46
- ToggleElement,
47
- ToggleableHeadingElement,
48
- QuoteElement,
49
- TodoElement,
50
- BookmarkElement,
51
- ImageElement,
52
- VideoElement,
53
- EmbedElement,
54
- AudioElement,
55
- ColumnListElement,
56
- ColumnElement,
57
- EquationElement,
58
- TableOfContentsElement,
59
- BreadcrumbElement,
60
- ChildDatabaseElement,
61
- FileElement,
62
- PdfElement,
63
- ParagraphElement, # Must be last as fallback!
64
- ]
65
-
66
- def __init__(self, excluded_elements: Set[Type[BaseBlockElement]] = None):
67
- """
68
- Initialize a new registry instance.
69
-
70
- Args:
71
- excluded_elements: Set of element classes to exclude from the registry
72
- """
73
- self._elements = OrderedDict()
74
- self._excluded_elements = excluded_elements or set()
75
- self.telemetry = ProductTelemetry()
76
-
77
- # Initialize with default elements minus excluded ones
78
- self._initialize_default_elements()
79
-
80
- @classmethod
81
- def create_registry(
82
- cls, excluded_elements: Set[Type[BaseBlockElement]] = None
83
- ) -> "BlockRegistry":
84
- """
85
- Create a registry with all standard elements in recommended order.
86
-
87
- Args:
88
- excluded_elements: Set of element classes to exclude from the registry
89
- """
90
- return cls(excluded_elements=excluded_elements)
91
-
92
- def _initialize_default_elements(self) -> None:
93
- """Initialize registry with default elements minus excluded ones."""
94
- for element_class in self._DEFAULT_ELEMENTS:
95
- if element_class not in self._excluded_elements:
96
- self._elements[element_class.__name__] = element_class
97
-
98
- def exclude_elements(
99
- self, *element_classes: Type[BaseBlockElement]
100
- ) -> BlockRegistry:
101
- """
102
- Create a new registry with additional excluded elements.
103
-
104
- Args:
105
- element_classes: Element classes to exclude
106
-
107
- Returns:
108
- New BlockRegistry instance with excluded elements
109
- """
110
- new_excluded = self._excluded_elements.copy()
111
- new_excluded.update(element_classes)
112
- return BlockRegistry(excluded_elements=new_excluded)
113
-
114
- def register(self, element_class: Type[BaseBlockElement]) -> bool:
115
- """
116
- Register an element class.
117
-
118
- Args:
119
- element_class: The element class to register
120
-
121
- Returns:
122
- True if element was added, False if it already existed
123
- """
124
- if element_class.__name__ in self._elements:
125
- return False
126
-
127
- self._elements[element_class.__name__] = element_class
128
- return True
129
-
130
- def remove(self, element_class: Type[BaseBlockElement]) -> bool:
131
- """
132
- Remove an element class.
133
- """
134
- return self._elements.pop(element_class.__name__, None) is not None
135
-
136
- def contains(self, element_class: Type[BaseBlockElement]) -> bool:
137
- """
138
- Checks if a specific element is contained in the registry.
139
- """
140
- return element_class.__name__ in self._elements
141
-
142
- def get_elements(self) -> list[Type[BaseBlockElement]]:
143
- """Get all registered elements in order."""
144
- return list(self._elements.values())
145
-
146
- def is_excluded(self, element_class: Type[BaseBlockElement]) -> bool:
147
- """
148
- Check if an element class is excluded.
149
- """
150
- return element_class in self._excluded_elements
@@ -1,33 +0,0 @@
1
- """Rich text handling for Notionary."""
2
-
3
- from notionary.blocks.rich_text.rich_text_models import (
4
- EquationObject,
5
- LinkObject,
6
- MentionDatabaseRef,
7
- MentionDate,
8
- MentionLinkPreview,
9
- MentionObject,
10
- MentionPageRef,
11
- MentionTemplateMention,
12
- MentionUserRef,
13
- RichTextObject,
14
- TextAnnotations,
15
- TextContent,
16
- )
17
- from notionary.blocks.rich_text.text_inline_formatter import TextInlineFormatter
18
-
19
- __all__ = [
20
- "RichTextObject",
21
- "TextAnnotations",
22
- "LinkObject",
23
- "TextContent",
24
- "EquationObject",
25
- "MentionUserRef",
26
- "MentionPageRef",
27
- "MentionDatabaseRef",
28
- "MentionLinkPreview",
29
- "MentionDate",
30
- "MentionTemplateMention",
31
- "MentionObject",
32
- "TextInlineFormatter",
33
- ]