better-notion 2.1.2__tar.gz → 2.1.4__tar.gz

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 (203) hide show
  1. {better_notion-2.1.2 → better_notion-2.1.4}/PKG-INFO +1 -1
  2. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/utils/agents/schemas.py +7 -5
  3. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/utils/agents/workspace.py +67 -41
  4. {better_notion-2.1.2 → better_notion-2.1.4}/pyproject.toml +1 -1
  5. {better_notion-2.1.2 → better_notion-2.1.4}/.gitignore +0 -0
  6. {better_notion-2.1.2 → better_notion-2.1.4}/LICENSE +0 -0
  7. {better_notion-2.1.2 → better_notion-2.1.4}/README.md +0 -0
  8. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/__init__.py +0 -0
  9. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/__init__.py +0 -0
  10. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/client.py +0 -0
  11. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/collections/__init__.py +0 -0
  12. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/collections/blocks.py +0 -0
  13. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/collections/comments.py +0 -0
  14. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/collections/databases.py +0 -0
  15. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/collections/pages.py +0 -0
  16. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/collections/users.py +0 -0
  17. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/entities/__init__.py +0 -0
  18. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/entities/block.py +0 -0
  19. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/entities/comment.py +0 -0
  20. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/entities/database.py +0 -0
  21. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/entities/page.py +0 -0
  22. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/entities/user.py +0 -0
  23. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/errors.py +0 -0
  24. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/oauth.py +0 -0
  25. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/properties/__init__.py +0 -0
  26. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/properties/base.py +0 -0
  27. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/properties/checkbox.py +0 -0
  28. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/properties/date.py +0 -0
  29. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/properties/email.py +0 -0
  30. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/properties/number.py +0 -0
  31. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/properties/phone.py +0 -0
  32. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/properties/relation.py +0 -0
  33. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/properties/rich_text.py +0 -0
  34. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/properties/select.py +0 -0
  35. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/properties/title.py +0 -0
  36. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/properties/url.py +0 -0
  37. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/utils/__init__.py +0 -0
  38. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_api/utils/pagination.py +0 -0
  39. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/__init__.py +0 -0
  40. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/async_typer.py +0 -0
  41. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/commands/__init__.py +0 -0
  42. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/commands/auth.py +0 -0
  43. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/commands/blocks.py +0 -0
  44. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/commands/comments.py +0 -0
  45. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/commands/config.py +0 -0
  46. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/commands/databases.py +0 -0
  47. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/commands/pages.py +0 -0
  48. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/commands/plugins.py +0 -0
  49. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/commands/search.py +0 -0
  50. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/commands/update.py +0 -0
  51. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/commands/users.py +0 -0
  52. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/commands/workspace.py +0 -0
  53. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/config.py +0 -0
  54. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/display.py +0 -0
  55. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/docs/__init__.py +0 -0
  56. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/docs/base.py +0 -0
  57. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/docs/formatters.py +0 -0
  58. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/docs/registry.py +0 -0
  59. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/errors.py +0 -0
  60. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/main.py +0 -0
  61. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/markdown.py +0 -0
  62. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/response.py +0 -0
  63. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_cli/utils/__init__.py +0 -0
  64. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/__init__.py +0 -0
  65. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/base/__init__.py +0 -0
  66. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/base/entity.py +0 -0
  67. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/cache/__init__.py +0 -0
  68. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/cache/cache.py +0 -0
  69. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/client.py +0 -0
  70. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/managers/__init__.py +0 -0
  71. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/managers/block_manager.py +0 -0
  72. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/managers/comment_manager.py +0 -0
  73. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/managers/database_manager.py +0 -0
  74. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/managers/page_manager.py +0 -0
  75. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/managers/user_manager.py +0 -0
  76. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/__init__.py +0 -0
  77. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/block.py +0 -0
  78. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/__init__.py +0 -0
  79. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/audio.py +0 -0
  80. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/bookmark.py +0 -0
  81. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/breadcrumb.py +0 -0
  82. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/bullet.py +0 -0
  83. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/callout.py +0 -0
  84. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/code.py +0 -0
  85. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/column.py +0 -0
  86. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/column_list.py +0 -0
  87. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/divider.py +0 -0
  88. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/embed.py +0 -0
  89. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/equation.py +0 -0
  90. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/file.py +0 -0
  91. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/heading.py +0 -0
  92. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/image.py +0 -0
  93. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/numbered.py +0 -0
  94. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/paragraph.py +0 -0
  95. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/pdf.py +0 -0
  96. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/quote.py +0 -0
  97. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/synced_block.py +0 -0
  98. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/table.py +0 -0
  99. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/table_row.py +0 -0
  100. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/template.py +0 -0
  101. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/todo.py +0 -0
  102. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/toggle.py +0 -0
  103. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/blocks/video.py +0 -0
  104. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/comment.py +0 -0
  105. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/database.py +0 -0
  106. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/page.py +0 -0
  107. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/models/user.py +0 -0
  108. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/parents/__init__.py +0 -0
  109. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/plugins.py +0 -0
  110. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/properties/__init__.py +0 -0
  111. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/properties/formula.py +0 -0
  112. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/properties/parsers.py +0 -0
  113. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/properties/relation.py +0 -0
  114. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/query/__init__.py +0 -0
  115. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/query/database_query.py +0 -0
  116. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/_sdk/query/filter_translator.py +0 -0
  117. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/plugins/__init__.py +0 -0
  118. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/plugins/base.py +0 -0
  119. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/plugins/loader.py +0 -0
  120. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/plugins/official/__init__.py +0 -0
  121. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/plugins/official/agents.py +0 -0
  122. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/plugins/official/agents_cli.py +0 -0
  123. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/plugins/official/agents_schema.py +0 -0
  124. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/plugins/official/agents_sdk/__init__.py +0 -0
  125. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/plugins/official/agents_sdk/managers.py +0 -0
  126. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/plugins/official/agents_sdk/models.py +0 -0
  127. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/plugins/official/agents_sdk/plugin.py +0 -0
  128. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/plugins/official/productivity.py +0 -0
  129. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/plugins/state.py +0 -0
  130. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/utils/__init__.py +0 -0
  131. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/utils/agents/__init__.py +0 -0
  132. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/utils/agents/auth.py +0 -0
  133. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/utils/agents/dependency_resolver.py +0 -0
  134. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/utils/agents/metadata.py +0 -0
  135. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/utils/agents/project_context.py +0 -0
  136. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/utils/agents/rbac.py +0 -0
  137. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/utils/agents/state_machine.py +0 -0
  138. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/utils/helpers.py +0 -0
  139. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/utils/retry.py +0 -0
  140. {better_notion-2.1.2 → better_notion-2.1.4}/better_notion/utils/validators.py +0 -0
  141. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/base/test_entity.py +0 -0
  142. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/cache/test_cache.py +0 -0
  143. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/models/__init__.py +0 -0
  144. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/models/blocks/test_advanced_blocks.py +0 -0
  145. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/models/test_block.py +0 -0
  146. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/models/test_database.py +0 -0
  147. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/models/test_database_bug.py +0 -0
  148. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/models/test_page.py +0 -0
  149. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/models/test_user.py +0 -0
  150. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/properties/test_formula.py +0 -0
  151. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/properties/test_parsers.py +0 -0
  152. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/properties/test_relation.py +0 -0
  153. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/query/test_database_query.py +0 -0
  154. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/query/test_filter_translator.py +0 -0
  155. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/test_client.py +0 -0
  156. {better_notion-2.1.2 → better_notion-2.1.4}/tests/_sdk/test_comment.py +0 -0
  157. {better_notion-2.1.2 → better_notion-2.1.4}/tests/agents/__init__.py +0 -0
  158. {better_notion-2.1.2 → better_notion-2.1.4}/tests/agents/test_auth.py +0 -0
  159. {better_notion-2.1.2 → better_notion-2.1.4}/tests/agents/test_dependency_resolver.py +0 -0
  160. {better_notion-2.1.2 → better_notion-2.1.4}/tests/agents/test_plugin.py +0 -0
  161. {better_notion-2.1.2 → better_notion-2.1.4}/tests/agents/test_project_context.py +0 -0
  162. {better_notion-2.1.2 → better_notion-2.1.4}/tests/agents/test_rbac.py +0 -0
  163. {better_notion-2.1.2 → better_notion-2.1.4}/tests/agents/test_schemas.py +0 -0
  164. {better_notion-2.1.2 → better_notion-2.1.4}/tests/agents/test_state_machine.py +0 -0
  165. {better_notion-2.1.2 → better_notion-2.1.4}/tests/agents/test_workspace.py +0 -0
  166. {better_notion-2.1.2 → better_notion-2.1.4}/tests/cli/__init__.py +0 -0
  167. {better_notion-2.1.2 → better_notion-2.1.4}/tests/cli/test_async_typer.py +0 -0
  168. {better_notion-2.1.2 → better_notion-2.1.4}/tests/cli/test_config.py +0 -0
  169. {better_notion-2.1.2 → better_notion-2.1.4}/tests/cli/test_display.py +0 -0
  170. {better_notion-2.1.2 → better_notion-2.1.4}/tests/cli/test_errors.py +0 -0
  171. {better_notion-2.1.2 → better_notion-2.1.4}/tests/cli/test_main.py +0 -0
  172. {better_notion-2.1.2 → better_notion-2.1.4}/tests/cli/test_pages_commands.py +0 -0
  173. {better_notion-2.1.2 → better_notion-2.1.4}/tests/cli/test_response.py +0 -0
  174. {better_notion-2.1.2 → better_notion-2.1.4}/tests/cli/test_update.py +0 -0
  175. {better_notion-2.1.2 → better_notion-2.1.4}/tests/conftest.py +0 -0
  176. {better_notion-2.1.2 → better_notion-2.1.4}/tests/integration/conftest.py +0 -0
  177. {better_notion-2.1.2 → better_notion-2.1.4}/tests/integration/test_blocks.py +0 -0
  178. {better_notion-2.1.2 → better_notion-2.1.4}/tests/integration/test_databases.py +0 -0
  179. {better_notion-2.1.2 → better_notion-2.1.4}/tests/integration/test_pages.py +0 -0
  180. {better_notion-2.1.2 → better_notion-2.1.4}/tests/integration/test_search.py +0 -0
  181. {better_notion-2.1.2 → better_notion-2.1.4}/tests/integration/test_users.py +0 -0
  182. {better_notion-2.1.2 → better_notion-2.1.4}/tests/plugins/__init__.py +0 -0
  183. {better_notion-2.1.2 → better_notion-2.1.4}/tests/plugins/test_agents_cli.py +0 -0
  184. {better_notion-2.1.2 → better_notion-2.1.4}/tests/plugins/test_agents_sdk_integration.py +0 -0
  185. {better_notion-2.1.2 → better_notion-2.1.4}/tests/plugins/test_agents_sdk_managers.py +0 -0
  186. {better_notion-2.1.2 → better_notion-2.1.4}/tests/plugins/test_agents_sdk_models.py +0 -0
  187. {better_notion-2.1.2 → better_notion-2.1.4}/tests/plugins/test_base.py +0 -0
  188. {better_notion-2.1.2 → better_notion-2.1.4}/tests/plugins/test_loader.py +0 -0
  189. {better_notion-2.1.2 → better_notion-2.1.4}/tests/plugins/test_marketplace.py +0 -0
  190. {better_notion-2.1.2 → better_notion-2.1.4}/tests/plugins/test_plugin_commands_state.py +0 -0
  191. {better_notion-2.1.2 → better_notion-2.1.4}/tests/plugins/test_productivity_plugin.py +0 -0
  192. {better_notion-2.1.2 → better_notion-2.1.4}/tests/plugins/test_state.py +0 -0
  193. {better_notion-2.1.2 → better_notion-2.1.4}/tests/sdk/__init__.py +0 -0
  194. {better_notion-2.1.2 → better_notion-2.1.4}/tests/sdk/test_plugin_system.py +0 -0
  195. {better_notion-2.1.2 → better_notion-2.1.4}/tests/test_metadata.py +0 -0
  196. {better_notion-2.1.2 → better_notion-2.1.4}/tests/test_schema_command.py +0 -0
  197. {better_notion-2.1.2 → better_notion-2.1.4}/tests/unit/test_client.py +0 -0
  198. {better_notion-2.1.2 → better_notion-2.1.4}/tests/unit/test_collections.py +0 -0
  199. {better_notion-2.1.2 → better_notion-2.1.4}/tests/unit/test_entities.py +0 -0
  200. {better_notion-2.1.2 → better_notion-2.1.4}/tests/unit/test_errors.py +0 -0
  201. {better_notion-2.1.2 → better_notion-2.1.4}/tests/unit/test_helpers.py +0 -0
  202. {better_notion-2.1.2 → better_notion-2.1.4}/tests/unit/test_properties.py +0 -0
  203. {better_notion-2.1.2 → better_notion-2.1.4}/tests/utils/test_retry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: better-notion
3
- Version: 2.1.2
3
+ Version: 2.1.4
4
4
  Summary: A high-level Python SDK for the Notion API with developer experience in mind.
5
5
  Project-URL: Homepage, https://github.com/nesalia-inc/better-notion
6
6
  Project-URL: Documentation, https://github.com/nesalia-inc/better-notion#readme
@@ -421,7 +421,13 @@ class TaskSchema:
421
421
 
422
422
  @staticmethod
423
423
  def get_schema() -> Dict[str, Dict[str, Any]]:
424
- """Return Notion database schema for Tasks."""
424
+ """Return Notion database schema for Tasks.
425
+
426
+ Note: The following properties are NOT included here and will be added
427
+ after database creation via database.update():
428
+ - "Dependencies": Self-referential relation (requires database's own ID)
429
+ - "Related Work Issue": Relation to Work Issues (Work Issues created after Tasks)
430
+ """
425
431
  return {
426
432
  "Title": PropertyBuilder.title("Title"),
427
433
  "Version": PropertyBuilder.relation("Version"),
@@ -458,10 +464,6 @@ class TaskSchema:
458
464
  SelectOption.option("Low", "blue"),
459
465
  ],
460
466
  ),
461
- # Dependencies: Self-referential relation (will be updated after database creation)
462
- "Dependencies": PropertyBuilder.relation("Dependencies", dual_property=False),
463
- # Related Work Issue: Relation to Work Issues (will be updated after database creation)
464
- "Related Work Issue": PropertyBuilder.relation("Related Work Issue", dual_property=False),
465
467
  "Estimated Hours": PropertyBuilder.number("Estimated Hours"),
466
468
  "Actual Hours": PropertyBuilder.number("Actual Hours"),
467
469
  "Assignee": PropertyBuilder.people("Assignee"),
@@ -141,11 +141,21 @@ class WorkspaceInitializer:
141
141
  logger.info(f"✓ {display_name} database created: {self._database_ids[key]}")
142
142
  except Exception as e:
143
143
  # Clean up databases created so far
144
+ import traceback
144
145
  logger.error(f"Failed to create {display_name} database: {str(e)}")
146
+ logger.error(f"Full traceback:\n{traceback.format_exc()}")
147
+
148
+ # Try to get more error details if available
149
+ error_details = str(e)
150
+ if hasattr(e, 'response') and hasattr(e.response, 'text'):
151
+ logger.error(f"Notion API response: {e.response.text}")
152
+ error_details += f"\nNotion API response: {e.response.text}"
153
+
145
154
  logger.warning(f"Cleaning up {len(self._database_ids)} databases that were created...")
146
155
  await self._delete_existing_databases(parent, self._database_ids)
156
+
147
157
  error_msg = (
148
- f"Failed to create {display_name} database: {str(e)}\n"
158
+ f"Failed to create {display_name} database: {error_details}\n"
149
159
  f"All partially created databases have been deleted.\n"
150
160
  f"Parent page: {parent_page_id}\n"
151
161
  f"Workspace name: {workspace_name}"
@@ -159,6 +169,14 @@ class WorkspaceInitializer:
159
169
  # Update cross-database relations that require both databases to exist
160
170
  await self._update_cross_database_relations()
161
171
 
172
+ # Add self-referential Dependencies relation to Tasks database
173
+ if "tasks" in self._database_ids:
174
+ await self._update_relation(
175
+ self._database_ids["tasks"],
176
+ "Dependencies",
177
+ self._database_ids["tasks"] # Self-reference
178
+ )
179
+
162
180
  # Save workspace metadata
163
181
  self.save_database_ids()
164
182
 
@@ -239,7 +257,7 @@ class WorkspaceInitializer:
239
257
  )
240
258
 
241
259
  async def _create_tasks_db(self, parent: Page) -> None:
242
- """Create Tasks database with relations to Versions (self-referencing for dependencies)."""
260
+ """Create Tasks database with relations to Versions."""
243
261
  schema = TaskSchema.get_schema()
244
262
 
245
263
  # Update relations with Versions database ID
@@ -249,8 +267,6 @@ class WorkspaceInitializer:
249
267
  "versions"
250
268
  ]
251
269
 
252
- # Tasks reference themselves for dependencies
253
- # Will be updated after database creation
254
270
  db = await self._client.databases.create(
255
271
  parent=parent,
256
272
  title="Tasks",
@@ -259,9 +275,6 @@ class WorkspaceInitializer:
259
275
 
260
276
  self._database_ids["tasks"] = db.id
261
277
 
262
- # Update self-referential relations
263
- await self._update_self_relations(db.id)
264
-
265
278
  # Update Versions database with reverse relation
266
279
  await self._add_reverse_relation(
267
280
  self._database_ids["versions"],
@@ -387,29 +400,6 @@ class WorkspaceInitializer:
387
400
  logger.warning(f"Failed to delete database {database_id}: {str(e)}")
388
401
  # Continue with other deletions even if this one fails
389
402
 
390
- async def _update_self_relations(self, database_id: str) -> None:
391
- """Update self-referential relations in Tasks database.
392
-
393
- Note: The database was created with placeholder relations.
394
- This method updates them to point to themselves.
395
- """
396
- # Get the current database schema
397
- db = await self._client.databases.get(database_id)
398
-
399
- # Update the Dependencies relation to point to itself
400
- schema = db.schema
401
- if "Dependencies" in schema:
402
- schema["Dependencies"]["relation"]["database_id"] = database_id
403
-
404
- # Update the database schema via API
405
- await self._client._api._request(
406
- "PATCH",
407
- f"/databases/{database_id}",
408
- json={"properties": schema}
409
- )
410
-
411
- logger.info(f"Updated self-referential relations for Tasks database {database_id}")
412
-
413
403
  async def _update_cross_database_relations(self) -> None:
414
404
  """Update cross-database relations after all databases are created.
415
405
 
@@ -453,7 +443,7 @@ class WorkspaceInitializer:
453
443
  property_name: str,
454
444
  target_database_id: Optional[str],
455
445
  ) -> None:
456
- """Update a relation property to point to the target database.
446
+ """Add or update a relation property to point to the target database.
457
447
 
458
448
  Args:
459
449
  database_id: Database to update
@@ -468,20 +458,56 @@ class WorkspaceInitializer:
468
458
  db = await self._client.databases.get(database_id)
469
459
  schema = db.schema
470
460
 
471
- # Update the relation property
461
+ # Add or update the relation property
462
+ # Some properties (like Dependencies, Related Work Issue) are added AFTER
463
+ # database creation, so they may not exist in the initial schema
472
464
  if property_name in schema:
465
+ # Property exists, just update the database_id
473
466
  schema[property_name]["relation"]["database_id"] = target_database_id
467
+ else:
468
+ # Property doesn't exist, ADD it
469
+ # This handles cases where the property couldn't be in the initial schema
470
+ if property_name == "Dependencies":
471
+ # Self-referential relation
472
+ schema[property_name] = {
473
+ "relation": {
474
+ "database_id": database_id, # Self-reference
475
+ "type": "dual_property",
476
+ "dual_property": {
477
+ "synced_property_name": "Dependent Tasks",
478
+ "synced_property_type": "relation"
479
+ }
480
+ }
481
+ }
482
+ elif property_name == "Related Work Issue":
483
+ # Relation to Work Issues database
484
+ schema[property_name] = {
485
+ "relation": {
486
+ "database_id": target_database_id,
487
+ "type": "dual_property",
488
+ "dual_property": {
489
+ "synced_property_name": "Related Tasks",
490
+ "synced_property_type": "relation"
491
+ }
492
+ }
493
+ }
494
+ else:
495
+ # Generic relation
496
+ schema[property_name] = {
497
+ "relation": {
498
+ "database_id": target_database_id,
499
+ "dual_property": {}
500
+ }
501
+ }
474
502
 
475
- # Update the database schema via API
476
- await self._client._api._request(
477
- "PATCH",
478
- f"/databases/{database_id}",
479
- json={"properties": schema}
480
- )
503
+ # Update the database schema via API
504
+ await self._client._api._request(
505
+ "PATCH",
506
+ f"/databases/{database_id}",
507
+ json={"properties": schema}
508
+ )
481
509
 
482
- logger.info(f"Updated {property_name} relation to {target_database_id}")
483
- else:
484
- logger.warning(f"Property {property_name} not found in database {database_id}")
510
+ logger.info(f"Added/Updated {property_name} relation to {target_database_id}")
485
511
 
486
512
  def save_database_ids(self, path: Optional[Path] = None) -> None:
487
513
  """Save workspace metadata (database IDs and workspace info) to config file.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "better-notion"
3
- version = "2.1.2"
3
+ version = "2.1.4"
4
4
  description = "A high-level Python SDK for the Notion API with developer experience in mind."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
File without changes
File without changes
File without changes