Skip to content

Commit d01a805

Browse files
authored
Added helper functions related to data sources in helpers.py and more namespace exports (#299)
* - Added `is_full_data_source` function - Renamed `is_full_page_or_database` to `is_full_page_or_data_source` - Removed `title` check from `is_full_database` - Exported related functions in the main namespace * - Added tests for the newly added functions in `helpers.py` * - Updated the docstring of `is_full_page_or_data_source` to replace “database” with “data_source”
1 parent e755ed7 commit d01a805

File tree

6 files changed

+537
-167
lines changed

6 files changed

+537
-167
lines changed

notion_client/__init__.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,41 @@
99
from .client import AsyncClient, Client
1010
from .errors import APIErrorCode, APIResponseError
1111
from .helpers import (
12-
extract_block_id,
13-
extract_database_id,
12+
collect_paginated_api,
13+
iterate_paginated_api,
14+
collect_data_source_templates,
15+
iterate_data_source_templates,
16+
is_full_block,
17+
is_full_data_source,
18+
is_full_database,
19+
is_full_page,
20+
is_full_user,
21+
is_full_comment,
22+
is_full_page_or_data_source,
1423
extract_notion_id,
24+
extract_database_id,
1525
extract_page_id,
26+
extract_block_id,
1627
)
1728

1829
__all__ = [
1930
"AsyncClient",
2031
"Client",
2132
"APIErrorCode",
2233
"APIResponseError",
23-
"extract_block_id",
24-
"extract_database_id",
34+
"collect_paginated_api",
35+
"iterate_paginated_api",
36+
"collect_data_source_templates",
37+
"iterate_data_source_templates",
38+
"is_full_block",
39+
"is_full_data_source",
40+
"is_full_database",
41+
"is_full_page",
42+
"is_full_user",
43+
"is_full_comment",
44+
"is_full_page_or_data_source",
2545
"extract_notion_id",
46+
"extract_database_id",
2647
"extract_page_id",
48+
"extract_block_id",
2749
]

notion_client/helpers.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,20 @@ def is_full_page(response: Dict[Any, Any]) -> bool:
9999
return response.get("object") == "page" and "url" in response
100100

101101

102+
def is_full_data_source(response: Dict[Any, Any]) -> bool:
103+
"""* Return `true` if `response` is a full data source."""
104+
return response.get("object") == "data_source"
105+
106+
102107
def is_full_database(response: Dict[Any, Any]) -> bool:
103108
"""Return `True` if response is a full database."""
104109
return response.get("object") == "database" and "title" in response
105110

106111

107-
def is_full_page_or_database(response: Dict[Any, Any]) -> bool:
108-
"""Return `True` if `response` is a full database or a full page."""
109-
if response.get("object") == "database":
110-
return is_full_database(response)
112+
def is_full_page_or_data_source(response: Dict[Any, Any]) -> bool:
113+
"""Return `True` if `response` is a full data_source or a full page."""
114+
if response.get("object") == "data_source":
115+
return is_full_data_source(response)
111116
return is_full_page(response)
112117

113118

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
interactions:
2+
- request:
3+
body: '{"parent":{"page_id":"26899f72bada80dc843deacaf51e89ad"},"properties":{"title":[{"text":{"content":"Test
4+
2025-11-03 18:58:08.590357"}}]},"children":[]}'
5+
headers:
6+
accept:
7+
- '*/*'
8+
accept-encoding:
9+
- gzip, deflate
10+
authorization:
11+
- ntn_...
12+
connection:
13+
- keep-alive
14+
content-length:
15+
- '151'
16+
content-type:
17+
- application/json
18+
host:
19+
- api.notion.com
20+
notion-version:
21+
- '2025-09-03'
22+
method: POST
23+
uri: https://api.notion.com/v1/pages
24+
response:
25+
body:
26+
string: '{"object":"page","id":"2a099f72-bada-81f6-8619-dcd6259d9936","created_time":"2025-11-03T10:58:00.000Z","last_edited_time":"2025-11-03T10:58:00.000Z","created_by":{"object":"user","id":"5b8183bd-8984-4417-b2a6-7dc8e439e679"},"last_edited_by":{"object":"user","id":"5b8183bd-8984-4417-b2a6-7dc8e439e679"},"cover":null,"icon":null,"parent":{"type":"page_id","page_id":"26899f72-bada-80dc-843d-eacaf51e89ad"},"archived":false,"in_trash":false,"is_locked":false,"properties":{"title":{"id":"title","type":"title","title":[{"type":"text","text":{"content":"Test
27+
2025-11-03 18:58:08.590357","link":null},"annotations":{"bold":false,"italic":false,"strikethrough":false,"underline":false,"code":false,"color":"default"},"plain_text":"Test
28+
2025-11-03 18:58:08.590357","href":null}]}},"url":"https://www.notion.so/Test-2025-11-03-18-58-08-590357-2a099f72bada81f68619dcd6259d9936","public_url":null,"request_id":"25d5c1bb-e855-4e8a-8869-c763c82e1bbf"}'
29+
headers:
30+
Content-Type:
31+
- application/json; charset=utf-8
32+
content-length:
33+
- '940'
34+
status:
35+
code: 200
36+
message: OK
37+
- request:
38+
body: '{"parent":{"type":"page_id","page_id":"2a099f72-bada-81f6-8619-dcd6259d9936"},"title":[{"type":"text","text":{"content":"Test
39+
Database - 2025-11-03 18:58:09.248005"}}]}'
40+
headers:
41+
accept:
42+
- '*/*'
43+
accept-encoding:
44+
- gzip, deflate
45+
authorization:
46+
- ntn_...
47+
connection:
48+
- keep-alive
49+
content-length:
50+
- '168'
51+
content-type:
52+
- application/json
53+
host:
54+
- api.notion.com
55+
notion-version:
56+
- '2025-09-03'
57+
method: POST
58+
uri: https://api.notion.com/v1/databases
59+
response:
60+
body:
61+
string: '{"object":"database","id":"eeab385d-00fd-41c8-80ce-df6614ef6f7d","title":[{"type":"text","text":{"content":"Test
62+
Database - 2025-11-03 18:58:09.248005","link":null},"annotations":{"bold":false,"italic":false,"strikethrough":false,"underline":false,"code":false,"color":"default"},"plain_text":"Test
63+
Database - 2025-11-03 18:58:09.248005","href":null}],"description":[],"parent":{"type":"page_id","page_id":"2a099f72-bada-81f6-8619-dcd6259d9936"},"is_inline":false,"in_trash":false,"is_locked":false,"created_time":"2025-11-03T10:58:09.443+00:00","last_edited_time":"2025-11-03T10:58:09.443+00:00","data_sources":[{"id":"e941010a-1a48-40d9-97de-88b1f73ff081","name":"Test
64+
Database - 2025-11-03 18:58:09.248005"}],"icon":null,"cover":null,"url":"https://www.notion.so/eeab385d00fd41c880cedf6614ef6f7d","public_url":null,"request_id":"43bad6fe-9207-48a2-a665-88eefe537971"}'
65+
headers:
66+
Content-Type:
67+
- application/json; charset=utf-8
68+
content-length:
69+
- '870'
70+
status:
71+
code: 200
72+
message: OK
73+
- request:
74+
body: "{\"parent\":{\"type\":\"database_id\",\"database_id\":\"eeab385d-00fd-41c8-80ce-df6614ef6f7d\"},\"properties\":{\"Name\":{\"type\":\"title\",\"title\":{}}},\"title\":[{\"type\":\"text\",\"text\":{\"content\":\"Test
75+
Data Source - 2025-11-03 18:58:10.317738\"}}],\"icon\":{\"type\":\"emoji\",\"emoji\":\"\u2699\uFE0F\"}}"
76+
headers:
77+
accept:
78+
- '*/*'
79+
accept-encoding:
80+
- gzip, deflate
81+
authorization:
82+
- ntn_...
83+
connection:
84+
- keep-alive
85+
content-length:
86+
- '270'
87+
content-type:
88+
- application/json
89+
host:
90+
- api.notion.com
91+
notion-version:
92+
- '2025-09-03'
93+
method: POST
94+
uri: https://api.notion.com/v1/data_sources
95+
response:
96+
body:
97+
string: "{\"object\":\"data_source\",\"id\":\"2a099f72-bada-81dc-8798-000bb2655ca5\",\"cover\":null,\"icon\":{\"type\":\"emoji\",\"emoji\":\"\u2699\uFE0F\"},\"created_time\":\"2025-11-03T10:58:00.000Z\",\"created_by\":{\"object\":\"user\",\"id\":\"5b8183bd-8984-4417-b2a6-7dc8e439e679\"},\"last_edited_by\":{\"object\":\"user\",\"id\":\"5b8183bd-8984-4417-b2a6-7dc8e439e679\"},\"last_edited_time\":\"2025-11-03T10:58:00.000Z\",\"title\":[{\"type\":\"text\",\"text\":{\"content\":\"Test
98+
Data Source - 2025-11-03 18:58:10.317738\",\"link\":null},\"annotations\":{\"bold\":false,\"italic\":false,\"strikethrough\":false,\"underline\":false,\"code\":false,\"color\":\"default\"},\"plain_text\":\"Test
99+
Data Source - 2025-11-03 18:58:10.317738\",\"href\":null}],\"description\":[],\"is_inline\":false,\"properties\":{\"Name\":{\"id\":\"title\",\"name\":\"Name\",\"description\":null,\"type\":\"title\",\"title\":{}}},\"parent\":{\"type\":\"database_id\",\"database_id\":\"eeab385d-00fd-41c8-80ce-df6614ef6f7d\"},\"database_parent\":{\"type\":\"page_id\",\"page_id\":\"2a099f72-bada-81f6-8619-dcd6259d9936\"},\"url\":\"https://www.notion.so/eeab385d00fd41c880cedf6614ef6f7d\",\"public_url\":null,\"archived\":false,\"in_trash\":false,\"request_id\":\"72232e22-83b4-4224-a301-0ad4810d7ef3\"}"
100+
headers:
101+
Content-Type:
102+
- application/json; charset=utf-8
103+
content-length:
104+
- '1126'
105+
status:
106+
code: 200
107+
message: OK
108+
- request:
109+
body: ''
110+
headers:
111+
accept:
112+
- '*/*'
113+
accept-encoding:
114+
- gzip, deflate
115+
authorization:
116+
- ntn_...
117+
connection:
118+
- keep-alive
119+
host:
120+
- api.notion.com
121+
notion-version:
122+
- '2025-09-03'
123+
method: GET
124+
uri: https://api.notion.com/v1/data_sources/2a099f72-bada-81dc-8798-000bb2655ca5
125+
response:
126+
body:
127+
string: "{\"object\":\"data_source\",\"id\":\"2a099f72-bada-81dc-8798-000bb2655ca5\",\"cover\":null,\"icon\":{\"type\":\"emoji\",\"emoji\":\"\u2699\uFE0F\"},\"created_time\":\"2025-11-03T10:58:00.000Z\",\"created_by\":{\"object\":\"user\",\"id\":\"5b8183bd-8984-4417-b2a6-7dc8e439e679\"},\"last_edited_by\":{\"object\":\"user\",\"id\":\"5b8183bd-8984-4417-b2a6-7dc8e439e679\"},\"last_edited_time\":\"2025-11-03T10:58:00.000Z\",\"title\":[{\"type\":\"text\",\"text\":{\"content\":\"Test
128+
Data Source - 2025-11-03 18:58:10.317738\",\"link\":null},\"annotations\":{\"bold\":false,\"italic\":false,\"strikethrough\":false,\"underline\":false,\"code\":false,\"color\":\"default\"},\"plain_text\":\"Test
129+
Data Source - 2025-11-03 18:58:10.317738\",\"href\":null}],\"description\":[],\"is_inline\":false,\"properties\":{\"Name\":{\"id\":\"title\",\"name\":\"Name\",\"description\":null,\"type\":\"title\",\"title\":{}}},\"parent\":{\"type\":\"database_id\",\"database_id\":\"eeab385d-00fd-41c8-80ce-df6614ef6f7d\"},\"database_parent\":{\"type\":\"page_id\",\"page_id\":\"2a099f72-bada-81f6-8619-dcd6259d9936\"},\"url\":\"https://www.notion.so/eeab385d00fd41c880cedf6614ef6f7d\",\"public_url\":null,\"archived\":false,\"in_trash\":false,\"request_id\":\"2e5c6227-a208-4786-a2c3-38513a6a3b08\"}"
130+
headers:
131+
Content-Type:
132+
- application/json; charset=utf-8
133+
content-length:
134+
- '1126'
135+
status:
136+
code: 200
137+
message: OK
138+
- request:
139+
body: '{"archived":true}'
140+
headers:
141+
accept:
142+
- '*/*'
143+
accept-encoding:
144+
- gzip, deflate
145+
authorization:
146+
- ntn_...
147+
connection:
148+
- keep-alive
149+
content-length:
150+
- '17'
151+
content-type:
152+
- application/json
153+
host:
154+
- api.notion.com
155+
notion-version:
156+
- '2025-09-03'
157+
method: PATCH
158+
uri: https://api.notion.com/v1/data_sources/2a099f72-bada-81dc-8798-000bb2655ca5
159+
response:
160+
body:
161+
string: "{\"object\":\"data_source\",\"id\":\"2a099f72-bada-81dc-8798-000bb2655ca5\",\"cover\":null,\"icon\":{\"type\":\"emoji\",\"emoji\":\"\u2699\uFE0F\"},\"created_time\":\"2025-11-03T10:58:00.000Z\",\"created_by\":{\"object\":\"user\",\"id\":\"5b8183bd-8984-4417-b2a6-7dc8e439e679\"},\"last_edited_by\":{\"object\":\"user\",\"id\":\"5b8183bd-8984-4417-b2a6-7dc8e439e679\"},\"last_edited_time\":\"2025-11-03T10:58:00.000Z\",\"title\":[{\"type\":\"text\",\"text\":{\"content\":\"Test
162+
Data Source - 2025-11-03 18:58:10.317738\",\"link\":null},\"annotations\":{\"bold\":false,\"italic\":false,\"strikethrough\":false,\"underline\":false,\"code\":false,\"color\":\"default\"},\"plain_text\":\"Test
163+
Data Source - 2025-11-03 18:58:10.317738\",\"href\":null}],\"description\":[],\"is_inline\":false,\"properties\":{\"Name\":{\"id\":\"title\",\"name\":\"Name\",\"description\":null,\"type\":\"title\",\"title\":{}}},\"parent\":{\"type\":\"database_id\",\"database_id\":\"eeab385d-00fd-41c8-80ce-df6614ef6f7d\"},\"database_parent\":{\"type\":\"page_id\",\"page_id\":\"2a099f72-bada-81f6-8619-dcd6259d9936\"},\"url\":\"https://www.notion.so/eeab385d00fd41c880cedf6614ef6f7d\",\"public_url\":null,\"archived\":true,\"in_trash\":true,\"request_id\":\"80d15ee2-2cb5-4ac3-92f2-43c199ba7d8c\"}"
164+
headers:
165+
Content-Type:
166+
- application/json; charset=utf-8
167+
content-length:
168+
- '1124'
169+
status:
170+
code: 200
171+
message: OK
172+
- request:
173+
body: ''
174+
headers:
175+
accept:
176+
- '*/*'
177+
accept-encoding:
178+
- gzip, deflate
179+
authorization:
180+
- ntn_...
181+
connection:
182+
- keep-alive
183+
host:
184+
- api.notion.com
185+
notion-version:
186+
- '2025-09-03'
187+
method: DELETE
188+
uri: https://api.notion.com/v1/blocks/eeab385d-00fd-41c8-80ce-df6614ef6f7d
189+
response:
190+
body:
191+
string: '{"object":"block","id":"eeab385d-00fd-41c8-80ce-df6614ef6f7d","parent":{"type":"page_id","page_id":"2a099f72-bada-81f6-8619-dcd6259d9936"},"created_time":"2025-11-03T10:58:00.000Z","last_edited_time":"2025-11-03T10:58:00.000Z","created_by":{"object":"user","id":"5b8183bd-8984-4417-b2a6-7dc8e439e679"},"last_edited_by":{"object":"user","id":"5b8183bd-8984-4417-b2a6-7dc8e439e679"},"has_children":false,"archived":true,"in_trash":true,"type":"child_database","child_database":{"title":"Test
192+
Database - 2025-11-03 18:58:09.248005"},"request_id":"47c1cb4c-6adc-4af3-afc5-551758f678d0"}'
193+
headers:
194+
Content-Type:
195+
- application/json; charset=utf-8
196+
content-length:
197+
- '582'
198+
status:
199+
code: 200
200+
message: OK
201+
- request:
202+
body: ''
203+
headers:
204+
accept:
205+
- '*/*'
206+
accept-encoding:
207+
- gzip, deflate
208+
authorization:
209+
- ntn_...
210+
connection:
211+
- keep-alive
212+
host:
213+
- api.notion.com
214+
notion-version:
215+
- '2025-09-03'
216+
method: DELETE
217+
uri: https://api.notion.com/v1/blocks/2a099f72-bada-81f6-8619-dcd6259d9936
218+
response:
219+
body:
220+
string: '{"object":"block","id":"2a099f72-bada-81f6-8619-dcd6259d9936","parent":{"type":"page_id","page_id":"26899f72-bada-80dc-843d-eacaf51e89ad"},"created_time":"2025-11-03T10:58:00.000Z","last_edited_time":"2025-11-03T10:58:00.000Z","created_by":{"object":"user","id":"5b8183bd-8984-4417-b2a6-7dc8e439e679"},"last_edited_by":{"object":"user","id":"5b8183bd-8984-4417-b2a6-7dc8e439e679"},"has_children":false,"archived":true,"in_trash":true,"type":"child_page","child_page":{"title":"Test
221+
2025-11-03 18:58:08.590357"},"request_id":"67264053-1856-4f61-8e2b-ef12fd306eb0"}'
222+
headers:
223+
Content-Type:
224+
- application/json; charset=utf-8
225+
content-length:
226+
- '563'
227+
status:
228+
code: 200
229+
message: OK
230+
version: 1

0 commit comments

Comments
 (0)