notionary 0.2.27__py3-none-any.whl → 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. notionary/__init__.py +5 -20
  2. notionary/blocks/__init__.py +4 -4
  3. notionary/blocks/client.py +90 -216
  4. notionary/blocks/enums.py +167 -0
  5. notionary/blocks/rich_text/markdown_rich_text_converter.py +280 -0
  6. notionary/blocks/rich_text/models.py +178 -0
  7. notionary/blocks/rich_text/name_id_resolver/__init__.py +13 -0
  8. notionary/blocks/rich_text/name_id_resolver/data_source.py +32 -0
  9. notionary/blocks/rich_text/name_id_resolver/database.py +31 -0
  10. notionary/blocks/rich_text/name_id_resolver/page.py +34 -0
  11. notionary/blocks/rich_text/name_id_resolver/person.py +37 -0
  12. notionary/blocks/rich_text/name_id_resolver/port.py +11 -0
  13. notionary/blocks/rich_text/rich_text_markdown_converter.py +144 -0
  14. notionary/blocks/rich_text/rich_text_patterns.py +42 -0
  15. notionary/blocks/schemas.py +778 -0
  16. notionary/comments/__init__.py +1 -22
  17. notionary/comments/client.py +52 -187
  18. notionary/comments/factory.py +38 -0
  19. notionary/comments/models.py +5 -127
  20. notionary/comments/schemas.py +240 -0
  21. notionary/comments/service.py +34 -0
  22. notionary/data_source/http/client.py +11 -0
  23. notionary/data_source/http/data_source_instance_client.py +104 -0
  24. notionary/data_source/properties/schemas.py +402 -0
  25. notionary/data_source/query/builder.py +448 -0
  26. notionary/data_source/query/resolver.py +114 -0
  27. notionary/data_source/query/schema.py +302 -0
  28. notionary/data_source/query/validator.py +73 -0
  29. notionary/data_source/schema/registry.py +104 -0
  30. notionary/data_source/schema/service.py +136 -0
  31. notionary/data_source/schemas.py +27 -0
  32. notionary/data_source/service.py +377 -0
  33. notionary/database/client.py +30 -135
  34. notionary/database/database_metadata_update_client.py +19 -0
  35. notionary/database/schemas.py +29 -0
  36. notionary/database/service.py +168 -0
  37. notionary/exceptions/__init__.py +33 -0
  38. notionary/exceptions/api.py +41 -0
  39. notionary/exceptions/base.py +2 -0
  40. notionary/exceptions/block_parsing.py +16 -0
  41. notionary/exceptions/data_source/__init__.py +6 -0
  42. notionary/exceptions/data_source/builder.py +182 -0
  43. notionary/exceptions/data_source/properties.py +34 -0
  44. notionary/exceptions/properties.py +58 -0
  45. notionary/exceptions/search.py +57 -0
  46. notionary/file_upload/client.py +18 -30
  47. notionary/file_upload/models.py +7 -8
  48. notionary/file_upload/{notion_file_upload.py → service.py} +29 -64
  49. notionary/http/client.py +204 -0
  50. notionary/http/models.py +50 -0
  51. notionary/page/blocks/client.py +1 -0
  52. notionary/page/content/factory.py +73 -0
  53. notionary/page/content/markdown/__init__.py +5 -0
  54. notionary/page/content/markdown/builder.py +226 -0
  55. notionary/page/content/markdown/nodes/__init__.py +52 -0
  56. notionary/page/content/markdown/nodes/audio.py +23 -0
  57. notionary/page/content/markdown/nodes/base.py +12 -0
  58. notionary/page/content/markdown/nodes/bookmark.py +25 -0
  59. notionary/page/content/markdown/nodes/breadcrumb.py +14 -0
  60. notionary/page/content/markdown/nodes/bulleted_list.py +41 -0
  61. notionary/page/content/markdown/nodes/callout.py +34 -0
  62. notionary/page/content/markdown/nodes/code.py +28 -0
  63. notionary/page/content/markdown/nodes/columns.py +69 -0
  64. notionary/page/content/markdown/nodes/container.py +64 -0
  65. notionary/page/content/markdown/nodes/divider.py +14 -0
  66. notionary/page/content/markdown/nodes/embed.py +23 -0
  67. notionary/page/content/markdown/nodes/equation.py +19 -0
  68. notionary/page/content/markdown/nodes/file.py +23 -0
  69. notionary/page/content/markdown/nodes/heading.py +36 -0
  70. notionary/page/content/markdown/nodes/image.py +23 -0
  71. notionary/page/content/markdown/nodes/mixins/__init__.py +5 -0
  72. notionary/page/content/markdown/nodes/mixins/caption.py +12 -0
  73. notionary/page/content/markdown/nodes/numbered_list.py +38 -0
  74. notionary/page/content/markdown/nodes/paragraph.py +14 -0
  75. notionary/page/content/markdown/nodes/pdf.py +23 -0
  76. notionary/page/content/markdown/nodes/quote.py +27 -0
  77. notionary/page/content/markdown/nodes/space.py +14 -0
  78. notionary/page/content/markdown/nodes/table.py +45 -0
  79. notionary/page/content/markdown/nodes/table_of_contents.py +14 -0
  80. notionary/page/content/markdown/nodes/todo.py +38 -0
  81. notionary/page/content/markdown/nodes/toggle.py +27 -0
  82. notionary/page/content/markdown/nodes/video.py +23 -0
  83. notionary/page/content/parser/context.py +126 -0
  84. notionary/page/content/parser/factory.py +210 -0
  85. notionary/page/content/parser/parsers/__init__.py +58 -0
  86. notionary/page/content/parser/parsers/audio.py +40 -0
  87. notionary/page/content/parser/parsers/base.py +30 -0
  88. notionary/page/content/parser/parsers/bookmark.py +33 -0
  89. notionary/page/content/parser/parsers/breadcrumb.py +33 -0
  90. notionary/page/content/parser/parsers/bulleted_list.py +85 -0
  91. notionary/page/content/parser/parsers/callout.py +100 -0
  92. notionary/page/content/parser/parsers/caption.py +55 -0
  93. notionary/page/content/parser/parsers/code.py +81 -0
  94. notionary/page/content/parser/parsers/column.py +76 -0
  95. notionary/page/content/parser/parsers/column_list.py +81 -0
  96. notionary/page/content/parser/parsers/divider.py +33 -0
  97. notionary/page/content/parser/parsers/embed.py +33 -0
  98. notionary/page/content/parser/parsers/equation.py +65 -0
  99. notionary/page/content/parser/parsers/file.py +42 -0
  100. notionary/page/content/parser/parsers/heading.py +115 -0
  101. notionary/page/content/parser/parsers/image.py +42 -0
  102. notionary/page/content/parser/parsers/numbered_list.py +89 -0
  103. notionary/page/content/parser/parsers/paragraph.py +37 -0
  104. notionary/page/content/parser/parsers/pdf.py +42 -0
  105. notionary/page/content/parser/parsers/quote.py +125 -0
  106. notionary/page/content/parser/parsers/space.py +41 -0
  107. notionary/page/content/parser/parsers/table.py +144 -0
  108. notionary/page/content/parser/parsers/table_of_contents.py +32 -0
  109. notionary/page/content/parser/parsers/todo.py +96 -0
  110. notionary/page/content/parser/parsers/toggle.py +70 -0
  111. notionary/page/content/parser/parsers/video.py +42 -0
  112. notionary/page/content/parser/post_processing/handlers/__init__.py +5 -0
  113. notionary/page/content/parser/post_processing/handlers/rich_text_length.py +95 -0
  114. notionary/page/content/parser/post_processing/handlers/rich_text_length_truncation.py +114 -0
  115. notionary/page/content/parser/post_processing/port.py +9 -0
  116. notionary/page/content/parser/post_processing/service.py +16 -0
  117. notionary/page/content/parser/pre_processsing/handlers/__init__.py +11 -0
  118. notionary/page/content/parser/pre_processsing/handlers/column_syntax.py +130 -0
  119. notionary/page/content/parser/pre_processsing/handlers/indentation.py +84 -0
  120. notionary/page/content/parser/pre_processsing/handlers/port.py +7 -0
  121. notionary/page/content/parser/pre_processsing/handlers/whitespace.py +73 -0
  122. notionary/page/content/parser/pre_processsing/service.py +15 -0
  123. notionary/page/content/parser/service.py +78 -0
  124. notionary/page/content/renderer/context.py +51 -0
  125. notionary/page/content/renderer/factory.py +231 -0
  126. notionary/page/content/renderer/post_processing/handlers/__init__.py +5 -0
  127. notionary/page/content/renderer/post_processing/handlers/numbered_list.py +156 -0
  128. notionary/page/content/renderer/post_processing/port.py +7 -0
  129. notionary/page/content/renderer/post_processing/service.py +15 -0
  130. notionary/page/content/renderer/renderers/__init__.py +55 -0
  131. notionary/page/content/renderer/renderers/audio.py +31 -0
  132. notionary/page/content/renderer/renderers/base.py +31 -0
  133. notionary/page/content/renderer/renderers/bookmark.py +25 -0
  134. notionary/page/content/renderer/renderers/breadcrumb.py +21 -0
  135. notionary/page/content/renderer/renderers/bulleted_list.py +48 -0
  136. notionary/page/content/renderer/renderers/callout.py +50 -0
  137. notionary/page/content/renderer/renderers/captioned_block.py +58 -0
  138. notionary/page/content/renderer/renderers/code.py +34 -0
  139. notionary/page/content/renderer/renderers/column.py +53 -0
  140. notionary/page/content/renderer/renderers/column_list.py +44 -0
  141. notionary/page/content/renderer/renderers/divider.py +22 -0
  142. notionary/page/content/renderer/renderers/embed.py +25 -0
  143. notionary/page/content/renderer/renderers/equation.py +37 -0
  144. notionary/page/content/renderer/renderers/fallback.py +24 -0
  145. notionary/page/content/renderer/renderers/file.py +40 -0
  146. notionary/page/content/renderer/renderers/heading.py +95 -0
  147. notionary/page/content/renderer/renderers/image.py +31 -0
  148. notionary/page/content/renderer/renderers/numbered_list.py +42 -0
  149. notionary/page/content/renderer/renderers/paragraph.py +40 -0
  150. notionary/page/content/renderer/renderers/pdf.py +31 -0
  151. notionary/page/content/renderer/renderers/quote.py +49 -0
  152. notionary/page/content/renderer/renderers/table.py +115 -0
  153. notionary/page/content/renderer/renderers/table_of_contents.py +26 -0
  154. notionary/page/content/renderer/renderers/table_row.py +17 -0
  155. notionary/page/content/renderer/renderers/todo.py +56 -0
  156. notionary/page/content/renderer/renderers/toggle.py +52 -0
  157. notionary/page/content/renderer/renderers/video.py +31 -0
  158. notionary/page/content/renderer/service.py +50 -0
  159. notionary/page/content/service.py +68 -0
  160. notionary/page/content/syntax/__init__.py +4 -0
  161. notionary/page/content/syntax/grammar.py +10 -0
  162. notionary/page/content/syntax/models.py +66 -0
  163. notionary/page/content/syntax/registry.py +393 -0
  164. notionary/page/page_context.py +7 -16
  165. notionary/page/page_http_client.py +15 -0
  166. notionary/page/page_metadata_update_client.py +19 -0
  167. notionary/page/properties/client.py +144 -0
  168. notionary/page/properties/factory.py +26 -0
  169. notionary/page/properties/models.py +308 -0
  170. notionary/page/properties/service.py +261 -0
  171. notionary/page/schemas.py +13 -0
  172. notionary/page/service.py +225 -0
  173. notionary/shared/entity/client.py +29 -0
  174. notionary/shared/entity/dto_parsers.py +53 -0
  175. notionary/shared/entity/entity_metadata_update_client.py +41 -0
  176. notionary/shared/entity/schemas.py +45 -0
  177. notionary/shared/entity/service.py +171 -0
  178. notionary/shared/models/cover.py +20 -0
  179. notionary/shared/models/file.py +21 -0
  180. notionary/shared/models/icon.py +28 -0
  181. notionary/shared/models/parent.py +41 -0
  182. notionary/shared/properties/type.py +30 -0
  183. notionary/shared/typings.py +3 -0
  184. notionary/user/__init__.py +4 -8
  185. notionary/user/base.py +138 -0
  186. notionary/user/bot.py +70 -0
  187. notionary/user/client.py +22 -111
  188. notionary/user/person.py +41 -0
  189. notionary/user/schemas.py +67 -0
  190. notionary/user/service.py +65 -0
  191. notionary/utils/date.py +51 -0
  192. notionary/utils/decorators.py +122 -0
  193. notionary/utils/fuzzy.py +68 -0
  194. notionary/utils/mixins/logging.py +58 -0
  195. notionary/utils/pagination.py +100 -0
  196. notionary/utils/uuid_utils.py +20 -0
  197. notionary/workspace/__init__.py +4 -0
  198. notionary/workspace/client.py +62 -0
  199. notionary/workspace/query/__init__.py +3 -0
  200. notionary/workspace/query/builder.py +60 -0
  201. notionary/workspace/query/models.py +61 -0
  202. notionary/workspace/query/service.py +100 -0
  203. notionary/workspace/schemas.py +21 -0
  204. notionary/workspace/service.py +116 -0
  205. notionary-0.3.0.dist-info/METADATA +201 -0
  206. notionary-0.3.0.dist-info/RECORD +209 -0
  207. {notionary-0.2.27.dist-info → notionary-0.3.0.dist-info}/WHEEL +1 -1
  208. {notionary-0.2.27.dist-info → notionary-0.3.0.dist-info/licenses}/LICENSE +9 -9
  209. notionary/base_notion_client.py +0 -219
  210. notionary/blocks/_bootstrap.py +0 -271
  211. notionary/blocks/audio/__init__.py +0 -11
  212. notionary/blocks/audio/audio_element.py +0 -158
  213. notionary/blocks/audio/audio_markdown_node.py +0 -24
  214. notionary/blocks/audio/audio_models.py +0 -10
  215. notionary/blocks/base_block_element.py +0 -42
  216. notionary/blocks/bookmark/__init__.py +0 -12
  217. notionary/blocks/bookmark/bookmark_element.py +0 -83
  218. notionary/blocks/bookmark/bookmark_markdown_node.py +0 -28
  219. notionary/blocks/bookmark/bookmark_models.py +0 -15
  220. notionary/blocks/breadcrumbs/__init__.py +0 -15
  221. notionary/blocks/breadcrumbs/breadcrumb_element.py +0 -39
  222. notionary/blocks/breadcrumbs/breadcrumb_markdown_node.py +0 -13
  223. notionary/blocks/breadcrumbs/breadcrumb_models.py +0 -12
  224. notionary/blocks/bulleted_list/__init__.py +0 -15
  225. notionary/blocks/bulleted_list/bulleted_list_element.py +0 -74
  226. notionary/blocks/bulleted_list/bulleted_list_markdown_node.py +0 -20
  227. notionary/blocks/bulleted_list/bulleted_list_models.py +0 -17
  228. notionary/blocks/callout/__init__.py +0 -12
  229. notionary/blocks/callout/callout_element.py +0 -99
  230. notionary/blocks/callout/callout_markdown_node.py +0 -19
  231. notionary/blocks/callout/callout_models.py +0 -33
  232. notionary/blocks/child_database/__init__.py +0 -14
  233. notionary/blocks/child_database/child_database_element.py +0 -59
  234. notionary/blocks/child_database/child_database_models.py +0 -12
  235. notionary/blocks/child_page/__init__.py +0 -9
  236. notionary/blocks/child_page/child_page_element.py +0 -94
  237. notionary/blocks/child_page/child_page_models.py +0 -12
  238. notionary/blocks/code/__init__.py +0 -11
  239. notionary/blocks/code/code_element.py +0 -149
  240. notionary/blocks/code/code_markdown_node.py +0 -80
  241. notionary/blocks/code/code_models.py +0 -94
  242. notionary/blocks/column/__init__.py +0 -25
  243. notionary/blocks/column/column_element.py +0 -65
  244. notionary/blocks/column/column_list_element.py +0 -52
  245. notionary/blocks/column/column_list_markdown_node.py +0 -34
  246. notionary/blocks/column/column_markdown_node.py +0 -42
  247. notionary/blocks/column/column_models.py +0 -26
  248. notionary/blocks/divider/__init__.py +0 -12
  249. notionary/blocks/divider/divider_element.py +0 -41
  250. notionary/blocks/divider/divider_markdown_node.py +0 -11
  251. notionary/blocks/divider/divider_models.py +0 -12
  252. notionary/blocks/embed/__init__.py +0 -12
  253. notionary/blocks/embed/embed_element.py +0 -98
  254. notionary/blocks/embed/embed_markdown_node.py +0 -19
  255. notionary/blocks/embed/embed_models.py +0 -14
  256. notionary/blocks/equation/__init__.py +0 -13
  257. notionary/blocks/equation/equation_element.py +0 -133
  258. notionary/blocks/equation/equation_element_markdown_node.py +0 -23
  259. notionary/blocks/equation/equation_models.py +0 -11
  260. notionary/blocks/file/__init__.py +0 -23
  261. notionary/blocks/file/file_element.py +0 -133
  262. notionary/blocks/file/file_element_markdown_node.py +0 -24
  263. notionary/blocks/file/file_element_models.py +0 -39
  264. notionary/blocks/heading/__init__.py +0 -19
  265. notionary/blocks/heading/heading_element.py +0 -112
  266. notionary/blocks/heading/heading_markdown_node.py +0 -16
  267. notionary/blocks/heading/heading_models.py +0 -29
  268. notionary/blocks/image_block/__init__.py +0 -11
  269. notionary/blocks/image_block/image_element.py +0 -130
  270. notionary/blocks/image_block/image_markdown_node.py +0 -25
  271. notionary/blocks/image_block/image_models.py +0 -10
  272. notionary/blocks/markdown/markdown_builder.py +0 -525
  273. notionary/blocks/markdown/markdown_document_model.py +0 -0
  274. notionary/blocks/markdown/markdown_node.py +0 -25
  275. notionary/blocks/mixins/captions/__init__.py +0 -4
  276. notionary/blocks/mixins/captions/caption_markdown_node_mixin.py +0 -31
  277. notionary/blocks/mixins/captions/caption_mixin.py +0 -92
  278. notionary/blocks/mixins/file_upload/__init__.py +0 -3
  279. notionary/blocks/mixins/file_upload/file_upload_mixin.py +0 -320
  280. notionary/blocks/models.py +0 -174
  281. notionary/blocks/numbered_list/__init__.py +0 -16
  282. notionary/blocks/numbered_list/numbered_list_element.py +0 -65
  283. notionary/blocks/numbered_list/numbered_list_markdown_node.py +0 -17
  284. notionary/blocks/numbered_list/numbered_list_models.py +0 -17
  285. notionary/blocks/paragraph/__init__.py +0 -15
  286. notionary/blocks/paragraph/paragraph_element.py +0 -58
  287. notionary/blocks/paragraph/paragraph_markdown_node.py +0 -16
  288. notionary/blocks/paragraph/paragraph_models.py +0 -16
  289. notionary/blocks/pdf/__init__.py +0 -11
  290. notionary/blocks/pdf/pdf_element.py +0 -146
  291. notionary/blocks/pdf/pdf_markdown_node.py +0 -24
  292. notionary/blocks/pdf/pdf_models.py +0 -11
  293. notionary/blocks/quote/__init__.py +0 -14
  294. notionary/blocks/quote/quote_element.py +0 -75
  295. notionary/blocks/quote/quote_markdown_node.py +0 -16
  296. notionary/blocks/quote/quote_models.py +0 -18
  297. notionary/blocks/registry/__init__.py +0 -3
  298. notionary/blocks/registry/block_registry.py +0 -150
  299. notionary/blocks/rich_text/__init__.py +0 -33
  300. notionary/blocks/rich_text/rich_text_models.py +0 -221
  301. notionary/blocks/rich_text/text_inline_formatter.py +0 -456
  302. notionary/blocks/syntax_prompt_builder.py +0 -137
  303. notionary/blocks/table/__init__.py +0 -19
  304. notionary/blocks/table/table_element.py +0 -225
  305. notionary/blocks/table/table_markdown_node.py +0 -42
  306. notionary/blocks/table/table_models.py +0 -28
  307. notionary/blocks/table_of_contents/__init__.py +0 -17
  308. notionary/blocks/table_of_contents/table_of_contents_element.py +0 -80
  309. notionary/blocks/table_of_contents/table_of_contents_markdown_node.py +0 -21
  310. notionary/blocks/table_of_contents/table_of_contents_models.py +0 -18
  311. notionary/blocks/todo/__init__.py +0 -12
  312. notionary/blocks/todo/todo_element.py +0 -81
  313. notionary/blocks/todo/todo_markdown_node.py +0 -21
  314. notionary/blocks/todo/todo_models.py +0 -18
  315. notionary/blocks/toggle/__init__.py +0 -12
  316. notionary/blocks/toggle/toggle_element.py +0 -112
  317. notionary/blocks/toggle/toggle_markdown_node.py +0 -31
  318. notionary/blocks/toggle/toggle_models.py +0 -17
  319. notionary/blocks/toggleable_heading/__init__.py +0 -11
  320. notionary/blocks/toggleable_heading/toggleable_heading_element.py +0 -115
  321. notionary/blocks/toggleable_heading/toggleable_heading_markdown_node.py +0 -34
  322. notionary/blocks/types.py +0 -130
  323. notionary/blocks/video/__init__.py +0 -11
  324. notionary/blocks/video/video_element.py +0 -187
  325. notionary/blocks/video/video_element_models.py +0 -10
  326. notionary/blocks/video/video_markdown_node.py +0 -26
  327. notionary/database/__init__.py +0 -4
  328. notionary/database/database.py +0 -480
  329. notionary/database/database_filter_builder.py +0 -173
  330. notionary/database/database_provider.py +0 -227
  331. notionary/database/exceptions.py +0 -13
  332. notionary/database/models.py +0 -337
  333. notionary/database/notion_database.py +0 -487
  334. notionary/file_upload/__init__.py +0 -7
  335. notionary/page/client.py +0 -124
  336. notionary/page/markdown_whitespace_processor.py +0 -129
  337. notionary/page/models.py +0 -322
  338. notionary/page/notion_page.py +0 -712
  339. notionary/page/page_content_deleting_service.py +0 -117
  340. notionary/page/page_content_writer.py +0 -80
  341. notionary/page/property_formatter.py +0 -99
  342. notionary/page/reader/handler/__init__.py +0 -19
  343. notionary/page/reader/handler/base_block_renderer.py +0 -44
  344. notionary/page/reader/handler/block_processing_context.py +0 -35
  345. notionary/page/reader/handler/block_rendering_context.py +0 -48
  346. notionary/page/reader/handler/column_list_renderer.py +0 -51
  347. notionary/page/reader/handler/column_renderer.py +0 -60
  348. notionary/page/reader/handler/equation_renderer.py +0 -0
  349. notionary/page/reader/handler/line_renderer.py +0 -73
  350. notionary/page/reader/handler/numbered_list_renderer.py +0 -85
  351. notionary/page/reader/handler/toggle_renderer.py +0 -69
  352. notionary/page/reader/handler/toggleable_heading_renderer.py +0 -89
  353. notionary/page/reader/page_content_retriever.py +0 -81
  354. notionary/page/search_filter_builder.py +0 -132
  355. notionary/page/utils.py +0 -60
  356. notionary/page/writer/handler/__init__.py +0 -24
  357. notionary/page/writer/handler/code_handler.py +0 -72
  358. notionary/page/writer/handler/column_handler.py +0 -141
  359. notionary/page/writer/handler/column_list_handler.py +0 -139
  360. notionary/page/writer/handler/equation_handler.py +0 -74
  361. notionary/page/writer/handler/line_handler.py +0 -35
  362. notionary/page/writer/handler/line_processing_context.py +0 -54
  363. notionary/page/writer/handler/regular_line_handler.py +0 -86
  364. notionary/page/writer/handler/table_handler.py +0 -66
  365. notionary/page/writer/handler/toggle_handler.py +0 -159
  366. notionary/page/writer/handler/toggleable_heading_handler.py +0 -174
  367. notionary/page/writer/markdown_to_notion_converter.py +0 -139
  368. notionary/page/writer/markdown_to_notion_converter_context.py +0 -30
  369. notionary/page/writer/markdown_to_notion_text_length_post_processor.py +0 -0
  370. notionary/page/writer/notion_text_length_processor.py +0 -150
  371. notionary/schemas/__init__.py +0 -3
  372. notionary/schemas/base.py +0 -73
  373. notionary/shared/__init__.py +0 -3
  374. notionary/shared/name_to_id_resolver.py +0 -203
  375. notionary/telemetry/__init__.py +0 -19
  376. notionary/telemetry/service.py +0 -136
  377. notionary/telemetry/views.py +0 -73
  378. notionary/user/base_notion_user.py +0 -53
  379. notionary/user/models.py +0 -84
  380. notionary/user/notion_bot_user.py +0 -226
  381. notionary/user/notion_user.py +0 -255
  382. notionary/user/notion_user_manager.py +0 -101
  383. notionary/util/__init__.py +0 -15
  384. notionary/util/concurrency_limiter.py +0 -0
  385. notionary/util/factory_decorator.py +0 -0
  386. notionary/util/factory_only.py +0 -37
  387. notionary/util/fuzzy.py +0 -75
  388. notionary/util/logging_mixin.py +0 -59
  389. notionary/util/page_id_utils.py +0 -27
  390. notionary/util/singleton.py +0 -18
  391. notionary/util/singleton_metaclass.py +0 -22
  392. notionary/workspace.py +0 -105
  393. notionary-0.2.27.dist-info/METADATA +0 -270
  394. notionary-0.2.27.dist-info/RECORD +0 -202
  395. /notionary/{database → user}/factory.py +0 -0
@@ -1,112 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from typing import Optional, cast
5
-
6
- from notionary.blocks.base_block_element import BaseBlockElement
7
- from notionary.blocks.heading.heading_models import (
8
- CreateHeading1Block,
9
- CreateHeading2Block,
10
- CreateHeading3Block,
11
- HeadingBlock,
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
- from notionary.blocks.types import BlockColor
17
-
18
-
19
- class HeadingElement(BaseBlockElement):
20
- """Handles conversion between Markdown headings and Notion heading blocks."""
21
-
22
- PATTERN = re.compile(r"^(#{1,3})[ \t]+(.+)$")
23
-
24
- @classmethod
25
- def match_notion(cls, block: Block) -> bool:
26
- return (
27
- block.type
28
- in (
29
- BlockType.HEADING_1,
30
- BlockType.HEADING_2,
31
- BlockType.HEADING_3,
32
- )
33
- and getattr(block, block.type.value) is not None
34
- )
35
-
36
- @classmethod
37
- async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
38
- """Convert markdown headings (#, ##, ###) to Notion HeadingBlock."""
39
- match = cls.PATTERN.match(text.strip())
40
- if not match:
41
- return None
42
-
43
- level = len(match.group(1))
44
- if level < 1 or level > 3:
45
- return None
46
-
47
- content = match.group(2).strip()
48
- if not content:
49
- return None
50
-
51
- rich_text = await TextInlineFormatter.parse_inline_formatting(content)
52
- heading_content = HeadingBlock(
53
- rich_text=rich_text, color=BlockColor.DEFAULT, is_toggleable=False
54
- )
55
-
56
- if level == 1:
57
- return CreateHeading1Block(heading_1=heading_content)
58
- elif level == 2:
59
- return CreateHeading2Block(heading_2=heading_content)
60
- else:
61
- return CreateHeading3Block(heading_3=heading_content)
62
-
63
- @classmethod
64
- async def notion_to_markdown(cls, block: Block) -> Optional[str]:
65
- # Only handle heading blocks via BlockType enum
66
- if block.type not in (
67
- BlockType.HEADING_1,
68
- BlockType.HEADING_2,
69
- BlockType.HEADING_3,
70
- ):
71
- return None
72
-
73
- # Determine heading level from enum
74
- if block.type == BlockType.HEADING_1:
75
- level = 1
76
- elif block.type == BlockType.HEADING_2:
77
- level = 2
78
- else:
79
- level = 3
80
-
81
- heading_obj = getattr(block, block.type.value)
82
- if not heading_obj:
83
- return None
84
-
85
- heading_data = cast(HeadingBlock, heading_obj)
86
- if not heading_data.rich_text:
87
- return None
88
-
89
- text = await TextInlineFormatter.extract_text_with_formatting(
90
- heading_data.rich_text
91
- )
92
- if not text:
93
- return None
94
-
95
- # Use hash-style for all heading levels
96
- return f"{('#' * level)} {text}"
97
-
98
- @classmethod
99
- def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
100
- """Get system prompt information for heading blocks."""
101
- return BlockElementMarkdownInformation(
102
- block_type=cls.__name__,
103
- description="Heading blocks create hierarchical document structure with different levels",
104
- syntax_examples=[
105
- "# Heading Level 1",
106
- "## Heading Level 2",
107
- "### Heading Level 3",
108
- "# Heading with **bold text**",
109
- "## Heading with *italic text*",
110
- ],
111
- usage_guidelines="Use # for main titles, ## for sections, ### for subsections. Supports inline formatting. Only levels 1-3 are supported in Notion.",
112
- )
@@ -1,16 +0,0 @@
1
- from pydantic import Field
2
- from notionary.blocks.markdown.markdown_node import MarkdownNode
3
-
4
-
5
- class HeadingMarkdownNode(MarkdownNode):
6
- """
7
- Enhanced Heading node with Pydantic integration.
8
- Programmatic interface for creating Markdown headings (H1-H3).
9
- Example: # Heading 1, ## Heading 2, ### Heading 3
10
- """
11
-
12
- text: str
13
- level: int = Field(default=1, ge=1, le=3)
14
-
15
- def to_markdown(self) -> str:
16
- return f"{'#' * self.level} {self.text}"
@@ -1,29 +0,0 @@
1
- from typing import Literal, Optional
2
-
3
- from pydantic import BaseModel
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 HeadingBlock(BaseModel):
11
- rich_text: list[RichTextObject]
12
- color: BlockColor = BlockColor.DEFAULT
13
- is_toggleable: bool = False
14
- children: Optional[list[Block]] = None
15
-
16
-
17
- class CreateHeading1Block(BaseModel):
18
- type: Literal["heading_1"] = "heading_1"
19
- heading_1: HeadingBlock
20
-
21
-
22
- class CreateHeading2Block(BaseModel):
23
- type: Literal["heading_2"] = "heading_2"
24
- heading_2: HeadingBlock
25
-
26
-
27
- class CreateHeading3Block(BaseModel):
28
- type: Literal["heading_3"] = "heading_3"
29
- heading_3: HeadingBlock
@@ -1,11 +0,0 @@
1
- from notionary.blocks.image_block.image_element import ImageElement
2
- from notionary.blocks.image_block.image_markdown_node import (
3
- ImageMarkdownNode,
4
- )
5
- from notionary.blocks.image_block.image_models import CreateImageBlock
6
-
7
- __all__ = [
8
- "ImageElement",
9
- "CreateImageBlock",
10
- "ImageMarkdownNode",
11
- ]
@@ -1,130 +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
- FileType,
10
- FileUploadFile,
11
- )
12
- from notionary.blocks.image_block.image_models import CreateImageBlock, FileBlock
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
-
18
-
19
- class ImageElement(BaseBlockElement, CaptionMixin, FileUploadMixin):
20
- r"""
21
- Handles conversion between Markdown images and Notion image blocks.
22
-
23
- Supports both external URLs and local image file uploads.
24
-
25
- Markdown image syntax:
26
- - [image](https://example.com/image.jpg) - External URL
27
- - [image](./local/photo.png) - Local image file (will be uploaded)
28
- - [image](C:\Pictures\avatar.jpg) - Absolute local path (will be uploaded)
29
- - [image](https://example.com/image.jpg)(caption:This is a caption) - URL with caption
30
- - (caption:Profile picture)[image](./avatar.jpg) - Caption before URL
31
- """
32
-
33
- # Pattern matches both URLs and file paths
34
- IMAGE_PATTERN = re.compile(r"\[image\]\(([^)]+)\)")
35
-
36
- @classmethod
37
- def match_notion(cls, block: Block) -> bool:
38
- return block.type == BlockType.IMAGE and block.image
39
-
40
- @classmethod
41
- async def markdown_to_notion(cls, text: str) -> Optional[BlockCreateResult]:
42
- """Convert markdown image syntax to Notion ImageBlock."""
43
- image_path = cls._extract_image_path(text.strip())
44
- if not image_path:
45
- return None
46
-
47
- cls.logger.info(f"Processing image: {image_path}")
48
-
49
- # Extract caption
50
- caption_text = cls.extract_caption(text.strip())
51
- caption_rich_text = cls.build_caption_rich_text(caption_text or "")
52
-
53
- # Determine if it's a local file or external URL
54
- if cls._is_local_file_path(image_path):
55
- cls.logger.debug(f"Detected local image file: {image_path}")
56
-
57
- # Upload the local image file using mixin method
58
- file_upload_id = await cls._upload_local_file(image_path, "image")
59
- if not file_upload_id:
60
- cls.logger.error(f"Failed to upload image: {image_path}")
61
- return None
62
-
63
- image_block = FileBlock(
64
- type=FileType.FILE_UPLOAD,
65
- file_upload=FileUploadFile(id=file_upload_id),
66
- caption=caption_rich_text,
67
- )
68
-
69
- else:
70
- cls.logger.debug(f"Using external image URL: {image_path}")
71
-
72
- image_block = FileBlock(
73
- type=FileType.EXTERNAL,
74
- external=ExternalFile(url=image_path),
75
- caption=caption_rich_text,
76
- )
77
-
78
- return CreateImageBlock(image=image_block)
79
-
80
- @classmethod
81
- async def notion_to_markdown(cls, block: Block) -> Optional[str]:
82
- if block.type != BlockType.IMAGE or not block.image:
83
- return None
84
-
85
- fo = block.image
86
-
87
- # Determine the source for markdown
88
- if fo.type == FileType.EXTERNAL and fo.external:
89
- source = fo.external.url
90
- elif fo.type == FileType.FILE and fo.file:
91
- source = fo.file.url
92
- else:
93
- return None
94
-
95
- result = f"[image]({source})"
96
-
97
- # Add caption if present
98
- caption_markdown = await cls.format_caption_for_markdown(fo.caption or [])
99
- if caption_markdown:
100
- result += caption_markdown
101
-
102
- return result
103
-
104
- @classmethod
105
- def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
106
- """Get system prompt information for image blocks."""
107
- return BlockElementMarkdownInformation(
108
- block_type=cls.__name__,
109
- description="Image blocks display images from external URLs or upload local image files with optional captions",
110
- syntax_examples=[
111
- "[image](https://example.com/photo.jpg)",
112
- "[image](./local/screenshot.png)",
113
- "[image](C:\\Pictures\\avatar.jpg)",
114
- "[image](https://example.com/diagram.png)(caption:Architecture Diagram)",
115
- "(caption:Sales Chart)[image](./chart.svg)",
116
- "[image](./screenshot.png)(caption:Dashboard **overview**)",
117
- ],
118
- usage_guidelines="Use for displaying images from external URLs or local files. Local image files will be automatically uploaded to Notion. Supports common image formats (jpg, png, gif, svg, webp, bmp, tiff, heic). Caption supports rich text formatting and describes the image content.",
119
- )
120
-
121
- @classmethod
122
- def _extract_image_path(cls, text: str) -> Optional[str]:
123
- """Extract image path/URL from text, handling caption patterns."""
124
- clean_text = cls.remove_caption(text)
125
-
126
- match = cls.IMAGE_PATTERN.search(clean_text)
127
- if match:
128
- return match.group(1).strip()
129
-
130
- return None
@@ -1,25 +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 ImageMarkdownNode(MarkdownNode, CaptionMarkdownNodeMixin):
8
- """
9
- Enhanced Image node with Pydantic integration.
10
- Programmatic interface for creating Notion-style image blocks.
11
- """
12
-
13
- url: str
14
- caption: Optional[str] = None
15
- alt: Optional[str] = None
16
-
17
- def to_markdown(self) -> str:
18
- """Return the Markdown representation.
19
-
20
- Examples:
21
- - [image](https://example.com/screenshot.png)
22
- - [image](https://example.com/screenshot.png)(caption:Dashboard overview)
23
- """
24
- base_markdown = f"[image]({self.url})"
25
- return self.append_caption_to_markdown(base_markdown, self.caption)
@@ -1,10 +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
-
7
-
8
- class CreateImageBlock(BaseModel):
9
- type: Literal["image"] = "image"
10
- image: FileBlock