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
@@ -0,0 +1,34 @@
1
+ import asyncio
2
+
3
+ from notionary.blocks.rich_text.markdown_rich_text_converter import MarkdownRichTextConverter
4
+ from notionary.comments.client import CommentClient
5
+ from notionary.comments.factory import CommentFactory
6
+ from notionary.comments.models import Comment
7
+
8
+
9
+ class CommentService:
10
+ def __init__(
11
+ self,
12
+ client: CommentClient | None = None,
13
+ factory: CommentFactory | None = None,
14
+ markdown_rich_text_converter: MarkdownRichTextConverter | None = None,
15
+ ) -> None:
16
+ self.client = client or CommentClient()
17
+ self.factory = factory or CommentFactory()
18
+ self._converter = markdown_rich_text_converter or MarkdownRichTextConverter()
19
+
20
+ async def list_all_comments_for_page(self, page_id: str) -> list[Comment]:
21
+ comment_dtos = [dto async for dto in self.client.iter_comments(page_id)]
22
+
23
+ comments = await asyncio.gather(*(self.factory.create_from_dto(dto) for dto in comment_dtos))
24
+ return comments
25
+
26
+ async def create_comment_on_page(self, page_id: str, text: str) -> Comment:
27
+ rich_text = await self._converter.to_rich_text(text)
28
+ comment_dto = await self.client.create_comment_for_page(rich_text=rich_text, page_id=page_id)
29
+ return await self.factory.create_from_dto(comment_dto)
30
+
31
+ async def reply_to_discussion_by_id(self, discussion_id: str, text: str) -> Comment:
32
+ rich_text = await self._converter.to_rich_text(text)
33
+ comment_dto = await self.client.create_comment_for_discussion(rich_text=rich_text, discussion_id=discussion_id)
34
+ return await self.factory.create_from_dto(comment_dto)
@@ -0,0 +1,11 @@
1
+ from notionary.data_source.schemas import DataSourceDto
2
+ from notionary.http.client import NotionHttpClient
3
+
4
+
5
+ class DataSourceClient(NotionHttpClient):
6
+ def __init__(self, timeout: int = 30) -> None:
7
+ super().__init__(timeout)
8
+
9
+ async def get_data_source(self, data_source_id: str) -> DataSourceDto:
10
+ response = await self.get(f"data_sources/{data_source_id}")
11
+ return DataSourceDto.model_validate(response)
@@ -0,0 +1,104 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import AsyncIterator
4
+ from typing import TYPE_CHECKING, Any, override
5
+
6
+ from notionary.blocks.rich_text.rich_text_markdown_converter import RichTextToMarkdownConverter
7
+ from notionary.data_source.query.schema import DataSourceQueryParams
8
+ from notionary.data_source.schemas import DataSourceDto, QueryDataSourceResponse, UpdateDataSourceDto
9
+ from notionary.http.client import NotionHttpClient
10
+ from notionary.page.schemas import NotionPageDto
11
+ from notionary.shared.entity.entity_metadata_update_client import EntityMetadataUpdateClient
12
+ from notionary.shared.typings import JsonDict
13
+ from notionary.utils.pagination import paginate_notion_api, paginate_notion_api_generator
14
+
15
+ if TYPE_CHECKING:
16
+ from notionary import NotionPage
17
+
18
+
19
+ class DataSourceInstanceClient(NotionHttpClient, EntityMetadataUpdateClient):
20
+ def __init__(self, data_source_id: str, timeout: int = 30) -> None:
21
+ super().__init__(timeout)
22
+ self._data_source_id = data_source_id
23
+
24
+ @override
25
+ async def patch_metadata(self, update_data_source_dto: UpdateDataSourceDto) -> DataSourceDto:
26
+ update_data_source_dto_dict = update_data_source_dto.model_dump(exclude_none=True)
27
+ response = await self.patch(f"data_sources/{self._data_source_id}", data=update_data_source_dto_dict)
28
+ return DataSourceDto.model_validate(response)
29
+
30
+ async def update_title(self, title: str) -> DataSourceDto:
31
+ update_data_source_dto = UpdateDataSourceDto(title=title)
32
+ return await self.patch_metadata(update_data_source_dto)
33
+
34
+ async def archive(self) -> None:
35
+ update_data_source_dto = UpdateDataSourceDto(archived=True)
36
+ return await self.patch_metadata(update_data_source_dto)
37
+
38
+ async def unarchive(self) -> None:
39
+ update_data_source_dto = UpdateDataSourceDto(archived=False)
40
+ await self.patch_metadata(update_data_source_dto)
41
+
42
+ async def update_description(self, description: str) -> str:
43
+ from notionary.blocks.rich_text.markdown_rich_text_converter import MarkdownRichTextConverter
44
+
45
+ markdown_rich_text_converter = MarkdownRichTextConverter()
46
+ rich_text_description = await markdown_rich_text_converter.to_rich_text(description)
47
+ update_data_source_dto = UpdateDataSourceDto(description=rich_text_description)
48
+
49
+ updated_data_source_dto = await self.patch_metadata(update_data_source_dto)
50
+
51
+ markdown_rich_text_converter = RichTextToMarkdownConverter()
52
+ updated_markdown_description = (
53
+ await markdown_rich_text_converter.to_markdown(updated_data_source_dto.description)
54
+ if updated_data_source_dto.description
55
+ else None
56
+ )
57
+ return updated_markdown_description
58
+
59
+ async def query(self, query_params: DataSourceQueryParams | None = None) -> QueryDataSourceResponse:
60
+ query_params_dict = query_params.to_api_params() if query_params else {}
61
+ page_size = query_params.page_size if query_params else None
62
+
63
+ all_results = await paginate_notion_api(
64
+ self._make_query_request, query_data=query_params_dict or {}, page_size=page_size
65
+ )
66
+
67
+ return QueryDataSourceResponse(
68
+ results=all_results,
69
+ next_cursor=None,
70
+ has_more=False,
71
+ )
72
+
73
+ async def query_stream(self, query_params: DataSourceQueryParams | None = None) -> AsyncIterator[Any]:
74
+ query_params_dict = query_params.model_dump() if query_params else {}
75
+ page_size = query_params.page_size if query_params else None
76
+
77
+ async for result in paginate_notion_api_generator(
78
+ self._make_query_request, query_data=query_params_dict or {}, page_size=page_size
79
+ ):
80
+ yield result
81
+
82
+ async def _make_query_request(
83
+ self, query_data: JsonDict, start_cursor: str | None = None, page_size: int | None = None
84
+ ) -> QueryDataSourceResponse:
85
+ current_query_data = query_data.copy()
86
+ if start_cursor:
87
+ current_query_data["start_cursor"] = start_cursor
88
+ if page_size:
89
+ current_query_data["page_size"] = page_size
90
+
91
+ response = await self.post(f"data_sources/{self._data_source_id}/query", data=current_query_data)
92
+ return QueryDataSourceResponse.model_validate(response)
93
+
94
+ async def create_blank_page(self, title: str | None = None) -> NotionPage:
95
+ from notionary import NotionPage
96
+
97
+ data = {"parent": {"type": "data_source_id", "data_source_id": self._data_source_id}, "properties": {}}
98
+
99
+ if title:
100
+ data["properties"]["Name"] = {"title": [{"text": {"content": title}}]}
101
+
102
+ response = await self.post("pages", data=data)
103
+ page_creation_response = NotionPageDto.model_validate(response)
104
+ return await NotionPage.from_id(page_creation_response.id)
@@ -0,0 +1,402 @@
1
+ from enum import StrEnum
2
+ from typing import Annotated, Literal, TypeVar
3
+
4
+ from pydantic import BaseModel, Field
5
+
6
+ from notionary.shared.properties.type import PropertyType
7
+ from notionary.shared.typings import JsonDict
8
+
9
+ # ============================================================================
10
+ # Base Model
11
+ # ============================================================================
12
+
13
+
14
+ class DataSourceProperty(BaseModel):
15
+ id: str
16
+ name: str
17
+ description: str | None = None
18
+ type: PropertyType
19
+
20
+
21
+ # ============================================================================
22
+ # Enums and Shared Config Models
23
+ # ============================================================================
24
+
25
+
26
+ class PropertyColor(StrEnum):
27
+ DEFAULT = "default"
28
+ GRAY = "gray"
29
+ BROWN = "brown"
30
+ ORANGE = "orange"
31
+ YELLOW = "yellow"
32
+ GREEN = "green"
33
+ BLUE = "blue"
34
+ PURPLE = "purple"
35
+ PINK = "pink"
36
+ RED = "red"
37
+
38
+
39
+ class NumberFormat(StrEnum):
40
+ NUMBER = "number"
41
+ NUMBER_WITH_COMMAS = "number_with_commas"
42
+ PERCENT = "percent"
43
+ DOLLAR = "dollar"
44
+ AUSTRALIAN_DOLLAR = "australian_dollar"
45
+ CANADIAN_DOLLAR = "canadian_dollar"
46
+ SINGAPORE_DOLLAR = "singapore_dollar"
47
+ EURO = "euro"
48
+ POUND = "pound"
49
+ YEN = "yen"
50
+ RUBLE = "ruble"
51
+ RUPEE = "rupee"
52
+ WON = "won"
53
+ YUAN = "yuan"
54
+ REAL = "real"
55
+ LIRA = "lira"
56
+ RUPIAH = "rupiah"
57
+ FRANC = "franc"
58
+ HONG_KONG_DOLLAR = "hong_kong_dollar"
59
+ NEW_ZEALAND_DOLLAR = "new_zealand_dollar"
60
+ KRONA = "krona"
61
+ NORWEGIAN_KRONE = "norwegian_krone"
62
+ MEXICAN_PESO = "mexican_peso"
63
+ RAND = "rand"
64
+ NEW_TAIWAN_DOLLAR = "new_taiwan_dollar"
65
+ DANISH_KRONE = "danish_krone"
66
+ ZLOTY = "zloty"
67
+ BAHT = "baht"
68
+ FORINT = "forint"
69
+ KORUNA = "koruna"
70
+ SHEKEL = "shekel"
71
+ CHILEAN_PESO = "chilean_peso"
72
+ PHILIPPINE_PESO = "philippine_peso"
73
+ DIRHAM = "dirham"
74
+ COLOMBIAN_PESO = "colombian_peso"
75
+ RIYAL = "riyal"
76
+ RINGGIT = "ringgit"
77
+ LEU = "leu"
78
+ ARGENTINE_PESO = "argentine_peso"
79
+ URUGUAYAN_PESO = "uruguayan_peso"
80
+ PERUVIAN_SOL = "peruvian_sol"
81
+
82
+
83
+ class RelationType(StrEnum):
84
+ SINGLE_PROPERTY = "single_property"
85
+ DUAL_PROPERTY = "dual_property"
86
+
87
+
88
+ class RollupFunction(StrEnum):
89
+ AVERAGE = "average"
90
+ CHECKED = "checked"
91
+ COUNT_PER_GROUP = "count_per_group"
92
+ COUNT = "count"
93
+ COUNT_VALUES = "count_values"
94
+ DATE_RANGE = "date_range"
95
+ EARLIEST_DATE = "earliest_date"
96
+ EMPTY = "empty"
97
+ LATEST_DATE = "latest_date"
98
+ MAX = "max"
99
+ MEDIAN = "median"
100
+ MIN = "min"
101
+ NOT_EMPTY = "not_empty"
102
+ PERCENT_CHECKED = "percent_checked"
103
+ PERCENT_EMPTY = "percent_empty"
104
+ PERCENT_NOT_EMPTY = "percent_not_empty"
105
+ PERCENT_PER_GROUP = "percent_per_group"
106
+ PERCENT_UNCHECKED = "percent_unchecked"
107
+ RANGE = "range"
108
+ UNCHECKED = "unchecked"
109
+ UNIQUE = "unique"
110
+ SHOW_ORIGINAL = "show_original"
111
+ SHOW_UNIQUE = "show_unique"
112
+ SUM = "sum"
113
+
114
+
115
+ class DataSourcePropertyOption(BaseModel):
116
+ id: str
117
+ name: str
118
+ color: PropertyColor
119
+ description: str | None = None
120
+
121
+
122
+ class DataSourceStatusGroup(BaseModel):
123
+ id: str
124
+ name: str
125
+ color: PropertyColor
126
+ option_ids: list[str]
127
+
128
+
129
+ # ============================================================================
130
+ # Config Models
131
+ # ============================================================================
132
+
133
+
134
+ class DataSourceStatusConfig(BaseModel):
135
+ options: list[DataSourcePropertyOption] = Field(default_factory=list)
136
+ groups: list[DataSourceStatusGroup] = Field(default_factory=list)
137
+
138
+
139
+ class DataSourceSelectConfig(BaseModel):
140
+ options: list[DataSourcePropertyOption] = Field(default_factory=list)
141
+
142
+
143
+ class DataSourceMultiSelectConfig(BaseModel):
144
+ options: list[DataSourcePropertyOption] = Field(default_factory=list)
145
+
146
+
147
+ class DataSourceRelationConfig(BaseModel):
148
+ data_source_id: str
149
+ type: RelationType = RelationType.SINGLE_PROPERTY
150
+ single_property: JsonDict = Field(default_factory=dict)
151
+
152
+
153
+ class DataSourceNumberConfig(BaseModel):
154
+ format: NumberFormat
155
+
156
+
157
+ class DataSourceFormulaConfig(BaseModel):
158
+ expression: str
159
+
160
+
161
+ class DataSourceUniqueIdConfig(BaseModel):
162
+ prefix: str | None = None
163
+
164
+
165
+ class DataSourceRollupConfig(BaseModel):
166
+ function: RollupFunction
167
+ relation_property_id: str
168
+ relation_property_name: str
169
+ rollup_property_id: str
170
+ rollup_property_name: str
171
+
172
+
173
+ class DataSourceDateConfig(BaseModel): ...
174
+
175
+
176
+ class DataSourceCreatedTimeConfig(BaseModel): ...
177
+
178
+
179
+ class DataSourceCreatedByConfig(BaseModel): ...
180
+
181
+
182
+ class DataSourceLastEditedTimeConfig(BaseModel): ...
183
+
184
+
185
+ class DataSourceLastEditedByConfig(BaseModel): ...
186
+
187
+
188
+ class DataSourceLastVisitedTimeConfig(BaseModel): ...
189
+
190
+
191
+ class DataSourceTitleConfig(BaseModel): ...
192
+
193
+
194
+ class DataSourceRichTextConfig(BaseModel): ...
195
+
196
+
197
+ class DataSourceURLConfig(BaseModel): ...
198
+
199
+
200
+ class DataSourcePeopleConfig(BaseModel): ...
201
+
202
+
203
+ class DataSourceCheckboxConfig(BaseModel): ...
204
+
205
+
206
+ class DataSourceEmailConfig(BaseModel): ...
207
+
208
+
209
+ class DataSourcePhoneNumberConfig(BaseModel): ...
210
+
211
+
212
+ class DataSourceFilesConfig(BaseModel): ...
213
+
214
+
215
+ class DataSourceButtonConfig(BaseModel): ...
216
+
217
+
218
+ class DataSourceLocationConfig(BaseModel): ...
219
+
220
+
221
+ class DataSourceVerificationConfig(BaseModel): ...
222
+
223
+
224
+ class DataSourcePlaceConfig(BaseModel): ...
225
+
226
+
227
+ # ============================================================================
228
+ # Property Models
229
+ # ============================================================================
230
+
231
+
232
+ class DataSourceStatusProperty(DataSourceProperty):
233
+ type: Literal[PropertyType.STATUS] = PropertyType.STATUS
234
+ status: DataSourceStatusConfig = Field(default_factory=DataSourceStatusConfig)
235
+
236
+ @property
237
+ def option_names(self) -> list[str]:
238
+ return [option.name for option in self.status.options]
239
+
240
+ @property
241
+ def group_names(self) -> list[str]:
242
+ return [group.name for group in self.status.groups]
243
+
244
+
245
+ class DataSourceSelectProperty(DataSourceProperty):
246
+ type: Literal[PropertyType.SELECT] = PropertyType.SELECT
247
+ select: DataSourceSelectConfig = Field(default_factory=DataSourceSelectConfig)
248
+
249
+ @property
250
+ def option_names(self) -> list[str]:
251
+ return [option.name for option in self.select.options]
252
+
253
+
254
+ class DataSourceMultiSelectProperty(DataSourceProperty):
255
+ type: Literal[PropertyType.MULTI_SELECT] = PropertyType.MULTI_SELECT
256
+ multi_select: DataSourceMultiSelectConfig = Field(default_factory=DataSourceMultiSelectConfig)
257
+
258
+ @property
259
+ def option_names(self) -> list[str]:
260
+ return [option.name for option in self.multi_select.options]
261
+
262
+
263
+ class DataSourceRelationProperty(DataSourceProperty):
264
+ type: Literal[PropertyType.RELATION] = PropertyType.RELATION
265
+ relation: DataSourceRelationConfig = Field(default_factory=DataSourceRelationConfig)
266
+
267
+ @property
268
+ def related_data_source_id(self) -> str | None:
269
+ return self.relation.data_source_id
270
+
271
+
272
+ class DataSourceDateProperty(DataSourceProperty):
273
+ type: Literal[PropertyType.DATE] = PropertyType.DATE
274
+ date: DataSourceDateConfig = Field(default_factory=DataSourceDateConfig)
275
+
276
+
277
+ class DataSourceCreatedTimeProperty(DataSourceProperty):
278
+ type: Literal[PropertyType.CREATED_TIME] = PropertyType.CREATED_TIME
279
+ created_time: DataSourceCreatedTimeConfig = Field(default_factory=DataSourceCreatedTimeConfig)
280
+
281
+
282
+ class DataSourceCreatedByProperty(DataSourceProperty):
283
+ type: Literal[PropertyType.CREATED_BY] = PropertyType.CREATED_BY
284
+ created_by: DataSourceCreatedByConfig = Field(default_factory=DataSourceCreatedByConfig)
285
+
286
+
287
+ class DataSourceLastEditedTimeProperty(DataSourceProperty):
288
+ type: Literal[PropertyType.LAST_EDITED_TIME] = PropertyType.LAST_EDITED_TIME
289
+ last_edited_time: DataSourceLastEditedTimeConfig = Field(default_factory=DataSourceLastEditedTimeConfig)
290
+
291
+
292
+ class DataSourceLastEditedByProperty(DataSourceProperty):
293
+ type: Literal[PropertyType.LAST_EDITED_BY] = PropertyType.LAST_EDITED_BY
294
+ last_edited_by: DataSourceLastEditedByConfig = Field(default_factory=DataSourceLastEditedByConfig)
295
+
296
+
297
+ class DataSourceTitleProperty(DataSourceProperty):
298
+ type: Literal[PropertyType.TITLE] = PropertyType.TITLE
299
+ title: DataSourceTitleConfig = Field(default_factory=DataSourceTitleConfig)
300
+
301
+
302
+ class DataSourceRichTextProperty(DataSourceProperty):
303
+ type: Literal[PropertyType.RICH_TEXT] = PropertyType.RICH_TEXT
304
+ rich_text: DataSourceRichTextConfig = Field(default_factory=DataSourceRichTextConfig)
305
+
306
+
307
+ class DataSourceURLProperty(DataSourceProperty):
308
+ type: Literal[PropertyType.URL] = PropertyType.URL
309
+ url: DataSourceURLConfig = Field(default_factory=DataSourceURLConfig)
310
+
311
+
312
+ class DataSourcePeopleProperty(DataSourceProperty):
313
+ type: Literal[PropertyType.PEOPLE] = PropertyType.PEOPLE
314
+ people: DataSourcePeopleConfig = Field(default_factory=DataSourcePeopleConfig)
315
+
316
+
317
+ class DataSourceNumberProperty(DataSourceProperty):
318
+ type: Literal[PropertyType.NUMBER] = PropertyType.NUMBER
319
+ number: DataSourceNumberConfig
320
+
321
+ @property
322
+ def number_format(self) -> NumberFormat:
323
+ return self.number.format
324
+
325
+
326
+ class DataSourceCheckboxProperty(DataSourceProperty):
327
+ type: Literal[PropertyType.CHECKBOX] = PropertyType.CHECKBOX
328
+ checkbox: DataSourceCheckboxConfig = Field(default_factory=DataSourceCheckboxConfig)
329
+
330
+
331
+ class DataSourceEmailProperty(DataSourceProperty):
332
+ type: Literal[PropertyType.EMAIL] = PropertyType.EMAIL
333
+ email: DataSourceEmailConfig = Field(default_factory=DataSourceEmailConfig)
334
+
335
+
336
+ class DataSourcePhoneNumberProperty(DataSourceProperty):
337
+ type: Literal[PropertyType.PHONE_NUMBER] = PropertyType.PHONE_NUMBER
338
+ phone_number: DataSourcePhoneNumberConfig = Field(default_factory=DataSourcePhoneNumberConfig)
339
+
340
+
341
+ class DataSourceFilesProperty(DataSourceProperty):
342
+ type: Literal[PropertyType.FILES] = PropertyType.FILES
343
+ files: DataSourceFilesConfig = Field(default_factory=DataSourceFilesConfig)
344
+
345
+
346
+ class DataSourceFormulaProperty(DataSourceProperty):
347
+ type: Literal[PropertyType.FORMULA] = PropertyType.FORMULA
348
+ formula: DataSourceFormulaConfig
349
+
350
+ @property
351
+ def expression(self) -> str:
352
+ return self.formula.expression
353
+
354
+
355
+ class DataSourceRollupProperty(DataSourceProperty):
356
+ type: Literal[PropertyType.ROLLUP] = PropertyType.ROLLUP
357
+ rollup: DataSourceRollupConfig
358
+
359
+ @property
360
+ def rollup_function(self) -> RollupFunction:
361
+ return self.rollup.function
362
+
363
+
364
+ class DataSourceUniqueIdProperty(DataSourceProperty):
365
+ type: Literal[PropertyType.UNIQUE_ID] = PropertyType.UNIQUE_ID
366
+ unique_id: DataSourceUniqueIdConfig = Field(default_factory=DataSourceUniqueIdConfig)
367
+
368
+ @property
369
+ def prefix(self) -> str | None:
370
+ return self.unique_id.prefix
371
+
372
+
373
+ # ============================================================================
374
+ # Discriminated Union
375
+ # ============================================================================
376
+
377
+ DiscriminatedDataSourceProperty = Annotated[
378
+ DataSourceStatusProperty
379
+ | DataSourceSelectProperty
380
+ | DataSourceMultiSelectProperty
381
+ | DataSourceRelationProperty
382
+ | DataSourceDateProperty
383
+ | DataSourceCreatedTimeProperty
384
+ | DataSourceCreatedByProperty
385
+ | DataSourceLastEditedTimeProperty
386
+ | DataSourceLastEditedByProperty
387
+ | DataSourceTitleProperty
388
+ | DataSourceRichTextProperty
389
+ | DataSourceURLProperty
390
+ | DataSourcePeopleProperty
391
+ | DataSourceNumberProperty
392
+ | DataSourceCheckboxProperty
393
+ | DataSourceEmailProperty
394
+ | DataSourcePhoneNumberProperty
395
+ | DataSourceFilesProperty
396
+ | DataSourceFormulaProperty
397
+ | DataSourceRollupProperty
398
+ | DataSourceUniqueIdProperty,
399
+ Field(discriminator="type"),
400
+ ]
401
+
402
+ DataSourcePropertyT = TypeVar("DataSourcePropertyT", bound=DataSourceProperty)