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,377 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ from collections.abc import AsyncIterator, Callable
5
+ from typing import TYPE_CHECKING, Self
6
+
7
+ from notionary.blocks.rich_text.rich_text_markdown_converter import RichTextToMarkdownConverter
8
+ from notionary.data_source.http.client import DataSourceClient
9
+ from notionary.data_source.http.data_source_instance_client import DataSourceInstanceClient
10
+ from notionary.data_source.properties.schemas import (
11
+ DataSourceMultiSelectProperty,
12
+ DataSourceProperty,
13
+ DataSourcePropertyOption,
14
+ DataSourcePropertyT,
15
+ DataSourceRelationProperty,
16
+ DataSourceSelectProperty,
17
+ DataSourceStatusProperty,
18
+ )
19
+ from notionary.data_source.query.builder import DataSourceQueryBuilder
20
+ from notionary.data_source.query.resolver import QueryResolver
21
+ from notionary.data_source.query.schema import (
22
+ DataSourceQueryParams,
23
+ )
24
+ from notionary.data_source.schema.service import DataSourcePropertySchemaFormatter
25
+ from notionary.data_source.schemas import DataSourceDto
26
+ from notionary.exceptions.data_source.properties import DataSourcePropertyNotFound, DataSourcePropertyTypeError
27
+ from notionary.page.properties.models import PageTitleProperty
28
+ from notionary.page.schemas import NotionPageDto
29
+ from notionary.shared.entity.dto_parsers import (
30
+ extract_cover_image_url_from_dto,
31
+ extract_database_id,
32
+ extract_description,
33
+ extract_emoji_icon_from_dto,
34
+ extract_external_icon_url_from_dto,
35
+ extract_title,
36
+ )
37
+ from notionary.shared.entity.entity_metadata_update_client import EntityMetadataUpdateClient
38
+ from notionary.shared.entity.service import Entity
39
+ from notionary.user.schemas import PartialUserDto
40
+ from notionary.workspace.query.service import WorkspaceQueryService
41
+
42
+ if TYPE_CHECKING:
43
+ from notionary import NotionDatabase, NotionPage
44
+
45
+
46
+ class NotionDataSource(Entity):
47
+ def __init__(
48
+ self,
49
+ id: str,
50
+ title: str,
51
+ created_time: str,
52
+ created_by: PartialUserDto,
53
+ last_edited_time: str,
54
+ last_edited_by: PartialUserDto,
55
+ archived: bool,
56
+ in_trash: bool,
57
+ url: str,
58
+ properties: dict[str, DataSourceProperty],
59
+ parent_database_id: str | None,
60
+ emoji_icon: str | None = None,
61
+ external_icon_url: str | None = None,
62
+ cover_image_url: str | None = None,
63
+ description: str | None = None,
64
+ public_url: str | None = None,
65
+ data_source_instance_client: DataSourceInstanceClient | None = None,
66
+ query_resolver: QueryResolver | None = None,
67
+ ) -> None:
68
+ super().__init__(
69
+ id=id,
70
+ created_time=created_time,
71
+ created_by=created_by,
72
+ last_edited_time=last_edited_time,
73
+ last_edited_by=last_edited_by,
74
+ in_trash=in_trash,
75
+ emoji_icon=emoji_icon,
76
+ external_icon_url=external_icon_url,
77
+ cover_image_url=cover_image_url,
78
+ )
79
+ self._parent_database_id = parent_database_id
80
+ self._parent_database: NotionDatabase | None = None
81
+ self._title = title
82
+ self._archived = archived
83
+ self._url = url
84
+ self._public_url = public_url
85
+ self._description = description
86
+ self._properties = properties or {}
87
+ self._data_source_client = data_source_instance_client or DataSourceInstanceClient(data_source_id=id)
88
+ self.query_resolver = query_resolver or QueryResolver()
89
+
90
+ @classmethod
91
+ async def from_id(
92
+ cls,
93
+ data_source_id: str,
94
+ data_source_client: DataSourceClient | None = None,
95
+ rich_text_converter: RichTextToMarkdownConverter | None = None,
96
+ ) -> Self:
97
+ client = data_source_client or DataSourceClient()
98
+ converter = rich_text_converter or RichTextToMarkdownConverter()
99
+ data_source_dto = await client.get_data_source(data_source_id)
100
+ return await cls._create_from_dto(data_source_dto, converter)
101
+
102
+ @classmethod
103
+ async def from_title(
104
+ cls,
105
+ data_source_title: str,
106
+ search_service: WorkspaceQueryService | None = None,
107
+ ) -> Self:
108
+ service = search_service or WorkspaceQueryService()
109
+ return await service.find_data_source(data_source_title)
110
+
111
+ @classmethod
112
+ async def _create_from_dto(
113
+ cls,
114
+ response: DataSourceDto,
115
+ rich_text_converter: RichTextToMarkdownConverter,
116
+ ) -> Self:
117
+ title, description = await asyncio.gather(
118
+ extract_title(response, rich_text_converter),
119
+ extract_description(response, rich_text_converter),
120
+ )
121
+
122
+ parent_database_id = extract_database_id(response)
123
+
124
+ return cls._create(
125
+ id=response.id,
126
+ title=title,
127
+ description=description,
128
+ created_time=response.created_time,
129
+ created_by=response.created_by,
130
+ last_edited_time=response.last_edited_time,
131
+ last_edited_by=response.last_edited_by,
132
+ archived=response.archived,
133
+ in_trash=response.in_trash,
134
+ url=response.url,
135
+ properties=response.properties,
136
+ parent_database_id=parent_database_id,
137
+ emoji_icon=extract_emoji_icon_from_dto(response),
138
+ external_icon_url=extract_external_icon_url_from_dto(response),
139
+ cover_image_url=extract_cover_image_url_from_dto(response),
140
+ public_url=response.url,
141
+ )
142
+
143
+ @classmethod
144
+ def _create(
145
+ cls,
146
+ id: str,
147
+ title: str,
148
+ created_time: str,
149
+ created_by: PartialUserDto,
150
+ last_edited_time: str,
151
+ last_edited_by: PartialUserDto,
152
+ archived: bool,
153
+ in_trash: bool,
154
+ url: str,
155
+ properties: dict[str, DataSourceProperty],
156
+ parent_database_id: str | None,
157
+ emoji_icon: str | None = None,
158
+ external_icon_url: str | None = None,
159
+ cover_image_url: str | None = None,
160
+ description: str | None = None,
161
+ public_url: str | None = None,
162
+ ) -> Self:
163
+ data_source_instance_client = DataSourceInstanceClient(data_source_id=id)
164
+ return cls(
165
+ id=id,
166
+ title=title,
167
+ created_time=created_time,
168
+ created_by=created_by,
169
+ last_edited_time=last_edited_time,
170
+ last_edited_by=last_edited_by,
171
+ archived=archived,
172
+ in_trash=in_trash,
173
+ url=url,
174
+ parent_database_id=parent_database_id,
175
+ emoji_icon=emoji_icon,
176
+ external_icon_url=external_icon_url,
177
+ cover_image_url=cover_image_url,
178
+ description=description,
179
+ public_url=public_url,
180
+ properties=properties,
181
+ data_source_instance_client=data_source_instance_client,
182
+ )
183
+
184
+ @property
185
+ def _entity_metadata_update_client(self) -> EntityMetadataUpdateClient:
186
+ return self._data_source_client
187
+
188
+ @property
189
+ def title(self) -> str:
190
+ return self._title
191
+
192
+ @property
193
+ def archived(self) -> bool:
194
+ return self._archived
195
+
196
+ @property
197
+ def description(self) -> str | None:
198
+ return self._description
199
+
200
+ @property
201
+ def properties(self) -> dict[str, DataSourceProperty]:
202
+ return self._properties
203
+
204
+ @property
205
+ def url(self) -> str:
206
+ return self._url
207
+
208
+ @property
209
+ def public_url(self) -> str | None:
210
+ return self._public_url
211
+
212
+ async def get_parent_database(self) -> NotionDatabase | None:
213
+ if self._parent_database is None and self._parent_database_id:
214
+ self._parent_database = await NotionDatabase.from_id(self._parent_database_id)
215
+ return self._parent_database
216
+
217
+ async def create_blank_page(self, title: str | None = None) -> NotionPage:
218
+ return await self._data_source_client.create_blank_page(title=title)
219
+
220
+ async def set_title(self, title: str) -> None:
221
+ data_source_dto = await self._data_source_client.update_title(title)
222
+ self._title = data_source_dto.title
223
+
224
+ async def archive(self) -> None:
225
+ if self._archived:
226
+ self.logger.info("Data source is already archived.")
227
+ return
228
+ await self._data_source_client.archive()
229
+ self._archived = True
230
+
231
+ async def unarchive(self) -> None:
232
+ if not self._archived:
233
+ self.logger.info("Data source is not archived.")
234
+ return
235
+ await self._data_source_client.unarchive()
236
+ self._archived = False
237
+
238
+ async def update_description(self, description: str) -> None:
239
+ self._description = await self._data_source_client.update_description(description)
240
+
241
+ async def get_options_for_property_by_name(self, property_name: str) -> list[str]:
242
+ prop = self._properties.get(property_name)
243
+
244
+ if prop is None:
245
+ return []
246
+
247
+ if isinstance(prop, DataSourceSelectProperty):
248
+ return prop.option_names
249
+
250
+ if isinstance(prop, DataSourceMultiSelectProperty):
251
+ return prop.option_names
252
+
253
+ if isinstance(prop, DataSourceStatusProperty):
254
+ return prop.option_names
255
+
256
+ if isinstance(prop, DataSourceRelationProperty):
257
+ return await self._get_relation_options(prop)
258
+
259
+ return []
260
+
261
+ def get_select_options_by_property_name(self, property_name: str) -> list[str]:
262
+ select_prop = self._get_typed_property_or_raise(property_name, DataSourceSelectProperty)
263
+ return select_prop.option_names
264
+
265
+ def get_multi_select_options_by_property_name(self, property_name: str) -> list[DataSourcePropertyOption]:
266
+ multi_select_prop = self._get_typed_property_or_raise(property_name, DataSourceMultiSelectProperty)
267
+ return multi_select_prop.option_names
268
+
269
+ def get_status_options_by_property_name(self, property_name: str) -> list[str]:
270
+ status_prop = self._get_typed_property_or_raise(property_name, DataSourceStatusProperty)
271
+ return status_prop.option_names
272
+
273
+ async def get_relation_options_by_property_name(self, property_name: str) -> list[str]:
274
+ relation_prop = self._get_typed_property_or_raise(property_name, DataSourceRelationProperty)
275
+ return await self._get_relation_options(relation_prop)
276
+
277
+ async def _get_relation_options(self, relation_prop: DataSourceRelationProperty) -> list[str]:
278
+ related_data_source_id = relation_prop.related_data_source_id
279
+ if not related_data_source_id:
280
+ return []
281
+
282
+ async with DataSourceInstanceClient(related_data_source_id) as related_client:
283
+ search_results = await related_client.query()
284
+
285
+ page_titles = []
286
+ for page_response in search_results.results:
287
+ title = self._extract_title_from_notion_page_dto(page_response)
288
+ if title:
289
+ page_titles.append(title)
290
+
291
+ return page_titles
292
+
293
+ def _extract_title_from_notion_page_dto(self, page: NotionPageDto) -> str | None:
294
+ if not page.properties:
295
+ return None
296
+
297
+ title_property = next(
298
+ (prop for prop in page.properties.values() if isinstance(prop, PageTitleProperty)),
299
+ None,
300
+ )
301
+
302
+ if not title_property:
303
+ return None
304
+
305
+ return "".join(item.plain_text for item in title_property.title)
306
+
307
+ def _get_typed_property_or_raise(self, name: str, property_type: type[DataSourcePropertyT]) -> DataSourcePropertyT:
308
+ prop = self._properties.get(name)
309
+
310
+ if prop is None:
311
+ raise DataSourcePropertyNotFound(
312
+ property_name=name,
313
+ available_properties=list(self._properties.keys()),
314
+ )
315
+
316
+ if not isinstance(prop, property_type):
317
+ raise DataSourcePropertyTypeError(
318
+ property_name=name, expected_type=property_type.__name__, actual_type=type(prop).__name__
319
+ )
320
+
321
+ return prop
322
+
323
+ def filter(self) -> DataSourceQueryBuilder:
324
+ return DataSourceQueryBuilder(properties=self._properties)
325
+
326
+ async def query_pages(
327
+ self, filter_fn: Callable[[DataSourceQueryBuilder], DataSourceQueryBuilder]
328
+ ) -> list[NotionPage]:
329
+ builder = DataSourceQueryBuilder(properties=self._properties)
330
+ configured_builder = filter_fn(builder)
331
+ query_params = configured_builder.build()
332
+
333
+ return await self.get_pages(query_params)
334
+
335
+ async def query_pages_stream(
336
+ self, filter_fn: Callable[[DataSourceQueryBuilder], DataSourceQueryBuilder]
337
+ ) -> AsyncIterator[NotionPage]:
338
+ builder = DataSourceQueryBuilder(properties=self._properties)
339
+ configured_builder = filter_fn(builder)
340
+ query_params = configured_builder.build()
341
+
342
+ async for page in self.get_pages_stream(query_params):
343
+ yield page
344
+
345
+ async def get_pages(
346
+ self,
347
+ query_params: DataSourceQueryParams | None = None,
348
+ ) -> list[NotionPage]:
349
+ from notionary import NotionPage
350
+
351
+ resolved_params = await self._resolve_query_params_if_needed(query_params)
352
+ query_response = await self._data_source_client.query(query_params=resolved_params)
353
+ return [await NotionPage.from_id(page.id) for page in query_response.results]
354
+
355
+ async def get_pages_stream(
356
+ self,
357
+ query_params: DataSourceQueryParams | None = None,
358
+ ) -> AsyncIterator[NotionPage]:
359
+ from notionary import NotionPage
360
+
361
+ resolved_params = await self._resolve_query_params_if_needed(query_params)
362
+
363
+ async for page in self._data_source_client.query_stream(query_params=resolved_params):
364
+ yield await NotionPage.from_id(page.id)
365
+
366
+ async def _resolve_query_params_if_needed(
367
+ self,
368
+ query_params: DataSourceQueryParams | None,
369
+ ) -> DataSourceQueryParams | None:
370
+ if query_params is None:
371
+ return None
372
+
373
+ return await self.query_resolver.resolve_params(query_params)
374
+
375
+ async def get_schema_description(self) -> str:
376
+ formatter = DataSourcePropertySchemaFormatter(relation_options_fetcher=self._get_relation_options)
377
+ return await formatter.format(title=self._title, description=self._description, properties=self._properties)
@@ -1,148 +1,43 @@
1
- from typing import Any, Dict, Optional
2
-
3
- from notionary.base_notion_client import BaseNotionClient
4
- from notionary.database.models import (
5
- NotionDatabaseResponse,
6
- NotionDatabaseSearchResponse,
7
- NotionPageResponse,
8
- NotionQueryDatabaseResponse,
1
+ from notionary.blocks.rich_text.rich_text_markdown_converter import RichTextToMarkdownConverter
2
+ from notionary.database.schemas import (
3
+ NotionDatabaseDto,
4
+ NotionDatabaseUpdateDto,
9
5
  )
6
+ from notionary.http.client import NotionHttpClient
10
7
 
11
8
 
12
- class NotionDatabaseClient(BaseNotionClient):
13
- """
14
- Specialized Notion client for database operations.
15
- Inherits connection management and HTTP methods from BaseNotionClient.
16
- """
17
-
18
- def __init__(self, token: Optional[str] = None, timeout: int = 30):
19
- super().__init__(token, timeout)
20
-
21
- async def create_database(
22
- self,
23
- title: str,
24
- parent_page_id: Optional[str],
25
- properties: Optional[Dict[str, Any]] = None,
26
- ) -> NotionDatabaseResponse:
27
- """
28
- Creates a new database as child of the specified page.
29
- """
30
- if properties is None:
31
- properties = {"Name": {"title": {}}}
32
-
33
- database_data = {
34
- "parent": {"page_id": parent_page_id},
35
- "title": [{"type": "text", "text": {"content": title}}],
36
- "properties": properties,
37
- }
38
-
39
- response = await self.post("databases", database_data)
40
- return NotionDatabaseResponse.model_validate(response)
41
-
42
- async def get_database(self, database_id: str) -> NotionDatabaseResponse:
43
- """
44
- Gets metadata for a Notion database by its ID.
45
- """
46
- response = await self.get(f"databases/{database_id}")
47
- return NotionDatabaseResponse.model_validate(response)
48
-
49
- async def patch_database(
50
- self, database_id: str, data: Dict[str, Any]
51
- ) -> NotionDatabaseResponse:
52
- """
53
- Updates a Notion database with the provided data.
54
- """
55
- response = await self.patch(f"databases/{database_id}", data=data)
56
- return NotionDatabaseResponse.model_validate(response)
57
-
58
- async def query_database(
59
- self, database_id: str, query_data: Dict[str, Any] = None
60
- ) -> NotionQueryDatabaseResponse:
61
- """
62
- Queries a Notion database with the provided filter and sorts.
63
- """
64
- response = await self.post(f"databases/{database_id}/query", data=query_data)
65
- return NotionQueryDatabaseResponse.model_validate(response)
9
+ class NotionDatabaseHttpClient(NotionHttpClient):
10
+ def __init__(self, database_id: str, timeout: int = 30) -> None:
11
+ super().__init__(timeout)
12
+ self._database_id = database_id
66
13
 
67
- async def query_database_by_title(
68
- self, database_id: str, page_title: str
69
- ) -> NotionQueryDatabaseResponse:
70
- """
71
- Queries a Notion database by title.
72
- """
73
- query_data = {
74
- "filter": {"property": "title", "title": {"contains": page_title}}
75
- }
14
+ async def get_database(self) -> NotionDatabaseDto:
15
+ response = await self.get(f"databases/{self._database_id}")
16
+ return NotionDatabaseDto.model_validate(response)
76
17
 
77
- return await self.query_database(database_id=database_id, query_data=query_data)
18
+ async def patch_database(self, update_database_dto: NotionDatabaseUpdateDto) -> NotionDatabaseDto:
19
+ update_database_dto_dict = update_database_dto.model_dump(exclude_none=True)
78
20
 
79
- async def search_databases(
80
- self, query: str = "", sort_ascending: bool = True, limit: int = 100
81
- ) -> NotionDatabaseSearchResponse:
82
- """
83
- Searches for databases in Notion using the search endpoint.
21
+ response = await self.patch(f"databases/{self._database_id}", data=update_database_dto_dict)
22
+ return NotionDatabaseDto.model_validate(response)
84
23
 
85
- Args:
86
- query: Search query string
87
- sort_ascending: Whether to sort in ascending order
88
- limit: Maximum number of results to return
89
- """
90
- search_data = {
91
- "query": query,
92
- "filter": {"value": "database", "property": "object"},
93
- "sort": {
94
- "direction": "ascending" if sort_ascending else "descending",
95
- "timestamp": "last_edited_time",
96
- },
97
- "page_size": limit,
98
- }
24
+ async def update_database_title(self, title: str) -> NotionDatabaseDto:
25
+ from notionary.blocks.rich_text.markdown_rich_text_converter import MarkdownRichTextConverter
99
26
 
100
- response = await self.post("search", search_data)
101
- return NotionDatabaseSearchResponse.model_validate(response)
27
+ markdown_rich_text_formatter = MarkdownRichTextConverter()
28
+ database_rich_text = await markdown_rich_text_formatter.to_rich_text(title)
102
29
 
103
- async def create_page(self, parent_database_id: str) -> NotionPageResponse:
104
- """
105
- Creates a new blank page in the given database with minimal properties.
106
- """
107
- page_data = {
108
- "parent": {"database_id": parent_database_id},
109
- "properties": {},
110
- }
111
- response = await self.post("pages", page_data)
112
- return NotionPageResponse.model_validate(response)
30
+ database_title_update_dto = NotionDatabaseUpdateDto(title=database_rich_text)
31
+ return await self.patch_database(database_title_update_dto)
113
32
 
114
- async def update_database_title(
115
- self, database_id: str, title: str
116
- ) -> NotionDatabaseResponse:
117
- """
118
- Updates the title of a database.
119
- """
120
- data = {"title": [{"text": {"content": title}}]}
121
- return await self.patch_database(database_id, data)
33
+ async def update_database_description(self, description: str) -> str:
34
+ from notionary.blocks.rich_text.markdown_rich_text_converter import MarkdownRichTextConverter
122
35
 
123
- async def update_database_emoji(
124
- self, database_id: str, emoji: str
125
- ) -> NotionDatabaseResponse:
126
- """
127
- Updates the emoji/icon of a database.
128
- """
129
- data = {"icon": {"type": "emoji", "emoji": emoji}}
130
- return await self.patch_database(database_id, data)
36
+ markdown_to_rich_text_converter = MarkdownRichTextConverter()
37
+ rich_text_description = await markdown_to_rich_text_converter.to_rich_text(description)
131
38
 
132
- async def update_database_cover_image(
133
- self, database_id: str, image_url: str
134
- ) -> NotionDatabaseResponse:
135
- """
136
- Updates the cover image of a database.
137
- """
138
- data = {"cover": {"type": "external", "external": {"url": image_url}}}
139
- return await self.patch_database(database_id, data)
39
+ database_description_update_dto = NotionDatabaseUpdateDto(description=rich_text_description)
40
+ update_database_response = await self.patch_database(database_description_update_dto)
140
41
 
141
- async def update_database_external_icon(
142
- self, database_id: str, icon_url: str
143
- ) -> NotionDatabaseResponse:
144
- """
145
- Updates the database icon with an external image URL.
146
- """
147
- data = {"icon": {"type": "external", "external": {"url": icon_url}}}
148
- return await self.patch_database(database_id, data)
42
+ rich_text_to_markdown_converter = RichTextToMarkdownConverter()
43
+ return await rich_text_to_markdown_converter.to_markdown(update_database_response.description)
@@ -0,0 +1,19 @@
1
+ from typing import override
2
+
3
+ from notionary.database.schemas import NotionDatabaseDto
4
+ from notionary.http.client import NotionHttpClient
5
+ from notionary.shared.entity.entity_metadata_update_client import EntityMetadataUpdateClient
6
+ from notionary.shared.entity.schemas import NotionEntityUpdateDto
7
+
8
+
9
+ class DatabaseMetadataUpdateClient(NotionHttpClient, EntityMetadataUpdateClient):
10
+ def __init__(self, database_id: str, timeout: int = 30) -> None:
11
+ super().__init__(timeout)
12
+ self._database_id = database_id
13
+
14
+ @override
15
+ async def patch_metadata(self, updated_data: NotionEntityUpdateDto) -> NotionDatabaseDto:
16
+ updated_data_dict = updated_data.model_dump(exclude_unset=True, exclude_none=True)
17
+
18
+ response_dict = await self.patch(f"databases/{self._database_id}", data=updated_data_dict)
19
+ return NotionDatabaseDto.model_validate(response_dict)
@@ -0,0 +1,29 @@
1
+ from pydantic import BaseModel, Field
2
+
3
+ from notionary.blocks.rich_text.models import RichText
4
+ from notionary.shared.entity.schemas import EntityResponseDto
5
+ from notionary.shared.models.cover import NotionCover
6
+ from notionary.shared.models.icon import Icon
7
+
8
+
9
+ class _DataSourceDiscoveryDto(BaseModel):
10
+ id: str
11
+ name: str
12
+
13
+
14
+ class NotionDatabaseDto(EntityResponseDto):
15
+ title: list[RichText]
16
+ description: list[RichText]
17
+ is_inline: bool
18
+ is_locked: bool
19
+ data_sources: list[_DataSourceDiscoveryDto] = Field(default_factory=list)
20
+ url: str
21
+ public_url: str | None = None
22
+
23
+
24
+ class NotionDatabaseUpdateDto(BaseModel):
25
+ title: list[RichText] | None = None
26
+ icon: Icon | None = None
27
+ cover: NotionCover | None = None
28
+ archived: bool | None = None
29
+ description: list[RichText] | None = None