notion-ruby-client 0.0.5 → 0.1.0.pre.beta1

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +1 -0
  3. data/.gitignore +7 -0
  4. data/.rubocop.yml +9 -0
  5. data/CHANGELOG.md +32 -0
  6. data/CODE_OF_CONDUCT.md +128 -0
  7. data/Gemfile.lock +37 -11
  8. data/README.md +318 -47
  9. data/bin/console +31 -0
  10. data/lib/notion/api/endpoints/blocks.rb +35 -7
  11. data/lib/notion/api/endpoints/databases.rb +67 -17
  12. data/lib/notion/api/endpoints/pages.rb +7 -7
  13. data/lib/notion/api/endpoints/search.rb +41 -0
  14. data/lib/notion/api/endpoints/users.rb +6 -3
  15. data/lib/notion/api/endpoints.rb +3 -1
  16. data/lib/notion/api/errors/too_many_requests.rb +15 -0
  17. data/lib/notion/api/errors.rb +0 -2
  18. data/lib/notion/config.rb +2 -0
  19. data/lib/notion/faraday/request.rb +1 -0
  20. data/lib/notion/pagination/cursor.rb +5 -2
  21. data/lib/notion/version.rb +3 -2
  22. data/lib/notion-ruby-client.rb +2 -0
  23. data/notion-ruby-client.gemspec +3 -1
  24. data/spec/fixtures/notion/block.yml +146 -0
  25. data/spec/fixtures/notion/block_append_children.yml +76 -62
  26. data/spec/fixtures/notion/block_children.yml +80 -65
  27. data/spec/fixtures/notion/create_database.yml +149 -0
  28. data/spec/fixtures/notion/create_page.yml +76 -61
  29. data/spec/fixtures/notion/database.yml +78 -61
  30. data/spec/fixtures/notion/database_query.yml +81 -62
  31. data/spec/fixtures/notion/databases_list.yml +77 -60
  32. data/spec/fixtures/notion/page.yml +78 -61
  33. data/spec/fixtures/notion/paginated_block_children.yml +296 -242
  34. data/spec/fixtures/notion/paginated_database_query.yml +79 -62
  35. data/spec/fixtures/notion/paginated_databases_list.yml +78 -61
  36. data/spec/fixtures/notion/paginated_search.yml +301 -0
  37. data/spec/fixtures/notion/paginated_users_list.yml +143 -130
  38. data/spec/fixtures/notion/search.yml +160 -0
  39. data/spec/fixtures/notion/search_with_query.yml +152 -0
  40. data/spec/fixtures/notion/update_block.yml +148 -0
  41. data/spec/fixtures/notion/update_database.yml +152 -0
  42. data/spec/fixtures/notion/update_page.yml +79 -63
  43. data/spec/fixtures/notion/users.yml +69 -56
  44. data/spec/fixtures/notion/users_list.yml +143 -130
  45. data/spec/notion/api/endpoints/blocks_spec.rb +37 -11
  46. data/spec/notion/api/endpoints/databases_spec.rb +43 -9
  47. data/spec/notion/api/endpoints/pages_spec.rb +15 -13
  48. data/spec/notion/api/endpoints/search_spec.rb +26 -0
  49. data/spec/notion/api/endpoints/users_spec.rb +4 -4
  50. data/spec/notion/pagination/cursor_spec.rb +126 -0
  51. metadata +55 -8
  52. data/.rspec_status +0 -18
  53. data/notion-ruby-client-0.0.4.gem +0 -0
  54. data/scratchpad.rb +0 -22
  55. data/screenshots/create_notion_bot.png +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 526916d20ba8e6c2ec952e750ace9e3e1fb4293ffa0cd317ee8948315cd9b17f
4
- data.tar.gz: 14fb8b29995bad4ace873cc85c3ef10fa693322aecee0fbeae24cc1f1dc95092
3
+ metadata.gz: a9b83ad4b81b6b52c55b8b65bf33f3075733116d91470d237d000a2428f933ea
4
+ data.tar.gz: f77c9065b91514bfd3acb7ab42c8a8916c022f6725918861ab5ffce47dedd2df
5
5
  SHA512:
6
- metadata.gz: 2493d2fa1c779c4d6940814bb5669f30932d71022821e97a9f3116f3a69d594a68e892867edad9cdded2e9fa448f1ca04b1b96740c814a723b263374c3119ff0
7
- data.tar.gz: 26b90af6ad023ca0a52d950b16e1997b2e3b5e8d1728350b7dbbe43b4651d4cdafa825420eecbd7aa9815a13ddd996a2bc20effb5ff7435ae12af639089e1af5
6
+ metadata.gz: b080379a4840e4b925a6b7bcb5e4c5ea7a25a85856947281cc95eddcc718dd16bb14466d127fca2d2b02a028e4f5df62ea3225ac1a614057578144e43220288c
7
+ data.tar.gz: aebf1260e3c10c54abebf62259beb35ab0d4ad520c8f26de98a163ed26d5e1989b09ef3d2189622a0a9b34552ac0b0d0085c567d3cd3488fc4a788fd0ba082a9
@@ -1,4 +1,5 @@
1
1
  on: [push, pull_request]
2
+ name: Continuous Integration
2
3
  jobs:
3
4
  test:
4
5
  strategy:
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ .env
2
+ pkg
3
+ Gemfile.lock
4
+ .DS_Store
5
+ .bundle
6
+ .idea
7
+ .rspec_status
data/.rubocop.yml CHANGED
@@ -35,6 +35,15 @@ RSpec/ExampleLength:
35
35
  RSpec/MultipleExpectations:
36
36
  Enabled: false
37
37
 
38
+ RSpec/FilePath:
39
+ Enabled: false
40
+
41
+ RSpec/MessageSpies:
42
+ Enabled: false
43
+
44
+ RSpec/NestedGroups:
45
+ Max: 5
46
+
38
47
  Style/Documentation:
39
48
  Enabled: false
40
49
 
data/CHANGELOG.md CHANGED
@@ -1,3 +1,35 @@
1
+ ### 0.1.0-beta1 (2021-08-29)
2
+
3
+ #### New
4
+
5
+ - Add support for the following new endpoints:
6
+ - [Update database](https://developers.notion.com/reference/update-a-database)
7
+ - [Update page](https://developers.notion.com/reference/patch-page)
8
+ - [Retrieve a block](https://developers.notion.com/reference/retrieve-a-block)
9
+ - [Update a block](https://developers.notion.com/reference/update-a-block)
10
+ - [Search](https://developers.notion.com/reference/search)
11
+ - Update Notion API Version to `2021-08-16`
12
+ - Add `bin/console` command for better DX
13
+ - Overhauled documentation
14
+
15
+ #### Upgrade instructions
16
+
17
+ - Please refer to the Notion Changelog to see breaking changes for version `2021-08-16`
18
+ - Regarding this gem, a lot of `id` parameters got renamed to `block_id`, `page_id`, `user_id` and `database_id`. You might need to rename those in your code as well.
19
+
20
+ ### 0.0.8 (2021-07-27)
21
+
22
+ - Bump `Notion-Version` header to `2021-05-13` (@H0R15H0)
23
+ - Add support for the new Create database endpoint (@H0R15H0)
24
+
25
+ ### 0.0.7 (2021-06-17)
26
+
27
+ - Fixes the query parameter for fetching a page resource
28
+
29
+ ### 0.0.6 (2021-06-09)
30
+
31
+ - Added `Notion-Version` required header to all requests
32
+
1
33
  ### 0.0.5 (2020-04-25)
2
34
 
3
35
  - Added support for Blocks endpoints
@@ -0,0 +1,128 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our
6
+ community a harassment-free experience for everyone, regardless of age, body
7
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+ identity and expression, level of experience, education, socio-economic status,
9
+ nationality, personal appearance, race, religion, or sexual identity
10
+ and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment for our
18
+ community include:
19
+
20
+ * Demonstrating empathy and kindness toward other people
21
+ * Being respectful of differing opinions, viewpoints, and experiences
22
+ * Giving and gracefully accepting constructive feedback
23
+ * Accepting responsibility and apologizing to those affected by our mistakes,
24
+ and learning from the experience
25
+ * Focusing on what is best not just for us as individuals, but for the
26
+ overall community
27
+
28
+ Examples of unacceptable behavior include:
29
+
30
+ * The use of sexualized language or imagery, and sexual attention or
31
+ advances of any kind
32
+ * Trolling, insulting or derogatory comments, and personal or political attacks
33
+ * Public or private harassment
34
+ * Publishing others' private information, such as a physical or email
35
+ address, without their explicit permission
36
+ * Other conduct which could reasonably be considered inappropriate in a
37
+ professional setting
38
+
39
+ ## Enforcement Responsibilities
40
+
41
+ Community leaders are responsible for clarifying and enforcing our standards of
42
+ acceptable behavior and will take appropriate and fair corrective action in
43
+ response to any behavior that they deem inappropriate, threatening, offensive,
44
+ or harmful.
45
+
46
+ Community leaders have the right and responsibility to remove, edit, or reject
47
+ comments, commits, code, wiki edits, issues, and other contributions that are
48
+ not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+ decisions when appropriate.
50
+
51
+ ## Scope
52
+
53
+ This Code of Conduct applies within all community spaces, and also applies when
54
+ an individual is officially representing the community in public spaces.
55
+ Examples of representing our community include using an official e-mail address,
56
+ posting via an official social media account, or acting as an appointed
57
+ representative at an online or offline event.
58
+
59
+ ## Enforcement
60
+
61
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+ reported to the community leaders responsible for enforcement at
63
+ nicolas@orbit.love.
64
+ All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+ All community leaders are obligated to respect the privacy and security of the
67
+ reporter of any incident.
68
+
69
+ ## Enforcement Guidelines
70
+
71
+ Community leaders will follow these Community Impact Guidelines in determining
72
+ the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+ ### 1. Correction
75
+
76
+ **Community Impact**: Use of inappropriate language or other behavior deemed
77
+ unprofessional or unwelcome in the community.
78
+
79
+ **Consequence**: A private, written warning from community leaders, providing
80
+ clarity around the nature of the violation and an explanation of why the
81
+ behavior was inappropriate. A public apology may be requested.
82
+
83
+ ### 2. Warning
84
+
85
+ **Community Impact**: A violation through a single incident or series
86
+ of actions.
87
+
88
+ **Consequence**: A warning with consequences for continued behavior. No
89
+ interaction with the people involved, including unsolicited interaction with
90
+ those enforcing the Code of Conduct, for a specified period of time. This
91
+ includes avoiding interactions in community spaces as well as external channels
92
+ like social media. Violating these terms may lead to a temporary or
93
+ permanent ban.
94
+
95
+ ### 3. Temporary Ban
96
+
97
+ **Community Impact**: A serious violation of community standards, including
98
+ sustained inappropriate behavior.
99
+
100
+ **Consequence**: A temporary ban from any sort of interaction or public
101
+ communication with the community for a specified period of time. No public or
102
+ private interaction with the people involved, including unsolicited interaction
103
+ with those enforcing the Code of Conduct, is allowed during this period.
104
+ Violating these terms may lead to a permanent ban.
105
+
106
+ ### 4. Permanent Ban
107
+
108
+ **Community Impact**: Demonstrating a pattern of violation of community
109
+ standards, including sustained inappropriate behavior, harassment of an
110
+ individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+ **Consequence**: A permanent ban from any sort of public interaction within
113
+ the community.
114
+
115
+ ## Attribution
116
+
117
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+ version 2.0, available at
119
+ https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
120
+
121
+ Community Impact Guidelines were inspired by [Mozilla's code of conduct
122
+ enforcement ladder](https://github.com/mozilla/diversity).
123
+
124
+ [homepage]: https://www.contributor-covenant.org
125
+
126
+ For answers to common questions about this code of conduct, see the FAQ at
127
+ https://www.contributor-covenant.org/faq. Translations are available at
128
+ https://www.contributor-covenant.org/translations.
data/Gemfile.lock CHANGED
@@ -1,7 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- notion-ruby-client (0.0.5)
4
+ notion-ruby-client (0.1.0.pre.beta1)
5
+ activesupport
6
+ dotenv
5
7
  faraday (>= 1.0)
6
8
  faraday_middleware
7
9
  hashie
@@ -9,33 +11,54 @@ PATH
9
11
  GEM
10
12
  remote: http://rubygems.org/
11
13
  specs:
12
- addressable (2.7.0)
14
+ activesupport (6.1.4.1)
15
+ concurrent-ruby (~> 1.0, >= 1.0.2)
16
+ i18n (>= 1.6, < 2)
17
+ minitest (>= 5.1)
18
+ tzinfo (~> 2.0)
19
+ zeitwerk (~> 2.3)
20
+ addressable (2.8.0)
13
21
  public_suffix (>= 2.0.2, < 5.0)
14
22
  ast (2.4.2)
23
+ concurrent-ruby (1.1.9)
15
24
  crack (0.4.5)
16
25
  rexml
17
26
  diff-lcs (1.4.4)
18
- faraday (1.4.1)
27
+ dotenv (2.7.6)
28
+ faraday (1.7.0)
29
+ faraday-em_http (~> 1.0)
30
+ faraday-em_synchrony (~> 1.0)
19
31
  faraday-excon (~> 1.1)
32
+ faraday-httpclient (~> 1.0.1)
20
33
  faraday-net_http (~> 1.0)
21
34
  faraday-net_http_persistent (~> 1.1)
35
+ faraday-patron (~> 1.0)
36
+ faraday-rack (~> 1.0)
22
37
  multipart-post (>= 1.2, < 3)
23
38
  ruby2_keywords (>= 0.0.4)
39
+ faraday-em_http (1.0.0)
40
+ faraday-em_synchrony (1.0.0)
24
41
  faraday-excon (1.1.0)
42
+ faraday-httpclient (1.0.1)
25
43
  faraday-net_http (1.0.1)
26
- faraday-net_http_persistent (1.1.0)
27
- faraday_middleware (1.0.0)
44
+ faraday-net_http_persistent (1.2.0)
45
+ faraday-patron (1.0.0)
46
+ faraday-rack (1.0.0)
47
+ faraday_middleware (1.1.0)
28
48
  faraday (~> 1.0)
29
49
  hashdiff (1.0.1)
30
50
  hashie (4.1.0)
51
+ i18n (1.8.10)
52
+ concurrent-ruby (~> 1.0)
31
53
  jaro_winkler (1.5.4)
54
+ minitest (5.14.4)
32
55
  multipart-post (2.1.1)
33
56
  parallel (1.20.1)
34
- parser (3.0.1.0)
57
+ parser (3.0.1.1)
35
58
  ast (~> 2.4.1)
36
59
  public_suffix (4.0.6)
37
60
  rainbow (3.0.0)
38
- rake (10.5.0)
61
+ rake (13.0.6)
39
62
  rexml (3.2.5)
40
63
  rspec (3.10.0)
41
64
  rspec-core (~> 3.10.0)
@@ -63,14 +86,17 @@ GEM
63
86
  rubocop-rspec (1.39.0)
64
87
  rubocop (>= 0.68.1)
65
88
  ruby-progressbar (1.11.0)
66
- ruby2_keywords (0.0.4)
89
+ ruby2_keywords (0.0.5)
67
90
  timecop (0.9.4)
91
+ tzinfo (2.0.4)
92
+ concurrent-ruby (~> 1.0)
68
93
  unicode-display_width (1.7.0)
69
94
  vcr (6.0.0)
70
- webmock (3.12.2)
95
+ webmock (3.13.0)
71
96
  addressable (>= 2.3.6)
72
97
  crack (>= 0.3.2)
73
98
  hashdiff (>= 0.4.0, < 2.0.0)
99
+ zeitwerk (2.4.2)
74
100
 
75
101
  PLATFORMS
76
102
  arm64-darwin-20
@@ -78,7 +104,7 @@ PLATFORMS
78
104
 
79
105
  DEPENDENCIES
80
106
  notion-ruby-client!
81
- rake (~> 10)
107
+ rake (~> 13)
82
108
  rspec
83
109
  rubocop (~> 0.82.0)
84
110
  rubocop-performance (~> 1.5.2)
@@ -88,4 +114,4 @@ DEPENDENCIES
88
114
  webmock
89
115
 
90
116
  BUNDLED WITH
91
- 2.2.5
117
+ 2.2.16
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Notion Ruby Client
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/notion-ruby-client.svg)](http://badge.fury.io/rb/notion-ruby-client)
4
+ [![CI workflow badge](https://github.com/orbit-love/notion-ruby-client/actions/workflows/ci.yml/badge.svg)](https://github.com/orbit-love/notion-ruby-client/actions/workflows/ci.yml)
5
+
3
6
  A Ruby client for the Notion API.
4
7
 
5
8
  ## Table of Contents
@@ -7,8 +10,28 @@ A Ruby client for the Notion API.
7
10
  - [Installation](#installation)
8
11
  - [Usage](#usage)
9
12
  - [Create a New Bot Integration](#create-a-new-bot-integration)
10
- - [Declare the API Token](#declare-the-api-token)
13
+ - [Declare the API token](#declare-the-api-token)
11
14
  - [API Client](#api-client)
15
+ - [Instantiating a new Notion API client](#instantiating-a-new-notion-api-client)
16
+ - [Pagination](#pagination)
17
+ - [Endpoints](#endpoints)
18
+ - [Databases](#databases)
19
+ - [Query a database](#query-a-database)
20
+ - [Create a Database](#create-a-database)
21
+ - [Retrieve a database](#retrieve-a-database)
22
+ - [List databases](#list-databases)
23
+ - [Pages](#pages)
24
+ - [Retrieve a page](#retrieve-a-page)
25
+ - [Create a page](#create-a-page)
26
+ - [Update page](#update-page)
27
+ - [Blocks](#blocks)
28
+ - [Retrieve block children](#retrieve-block-children)
29
+ - [Append block children](#append-block-children)
30
+ - [Users](#users)
31
+ - [Retrieve a user](#retrieve-a-user)
32
+ - [List all users](#list-all-users)
33
+ - [Search](#search)
34
+ - [Acknowledgements](#acknowledgements)
12
35
 
13
36
  ## Installation
14
37
 
@@ -22,15 +45,15 @@ Run `bundle install`.
22
45
 
23
46
  ## Usage
24
47
 
25
- ### Create a New Bot Integration
48
+ ### Create a New Integration
26
49
 
27
- To integrate your bot with Notion, you must first [create a new Notion Bot](https://www.notion.so/Getting-started-da32a6fc1bcc4403a6126ee735710d89).
50
+ > :blue_book: **Before you start**
51
+ >
52
+ > Make sure you are an **Admin** user in your Notion workspace. If you're not an Admin in your current workspace, [create a new personal workspace for free](https://www.notion.so/notion/Create-join-switch-workspaces-3b9be78982a940a7a27ce712ca6bdcf5#9332861c775543d0965f918924448a6d).
28
53
 
29
- 1. Log into the workspace that you want your integration to be associated with.
30
- 2. Confirm that you are an Admin in the workspace (see Settings & Members > Members).
31
- 3. Go to Settings & Members, and click API
54
+ To create a new integration, follow the steps 1 & 2 outlined in the [Notion documentation](https://developers.notion.com/docs#getting-started). The “_Internal Integration Token_” is what is going to be used to authenticate API calls (referred to here as the “API token”).
32
55
 
33
- ![A screenshot of the Notion page to create a bot](screenshots/create_notion_bot.png)
56
+ > :blue_book: Integrations don't have access to any pages (or databases) in the workspace at first. **A user must share specific pages with an integration in order for those pages to be accessed using the API.**
34
57
 
35
58
  ### Declare the API token
36
59
 
@@ -44,7 +67,7 @@ For Rails projects, the snippet above would go to `config/application.rb`.
44
67
 
45
68
  ### API Client
46
69
 
47
- #### Instanciating a new Notion API client
70
+ #### Instantiating a new Notion API client
48
71
 
49
72
  ```ruby
50
73
  client = Notion::Client.new
@@ -56,36 +79,46 @@ You can specify the token or logger on a per-client basis:
56
79
  client = Notion::Client.new(token: '<secret Notion API token>')
57
80
  ```
58
81
 
59
- #### Users
82
+ #### Pagination
60
83
 
61
- Get a paginated list of [User objects](https://www.notion.so/User-object-4f8d1a2fc1e54680b5f810ed0c6903a6) for the workspace:
84
+ The client natively supports [cursor pagination](https://developers.notion.com/reference/pagination) for methods that allow it, such as `users_list`. Supply a block and the client will make repeated requests adjusting the value of `start_cursor` with every response. The default page size is set to 100 (Notion’s current default and maximum) and can be adjusted via `Notion::Client.config.default_page_size` or by passing it directly into the API call.
62
85
 
63
86
  ```ruby
64
- client.users_list # retrieves the first page
65
-
66
- client.users_list(start_cursor: 'fe2cc560-036c-44cd-90e8-294d5a74cebc')
67
-
68
- client.users_list do |page|
69
- # paginate through all users
87
+ all_users = []
88
+ client.users_list(page_size: 25) do |page|
89
+ all_users.concat(page.results)
70
90
  end
91
+ all_users # All users, retrieved 25 at a time
71
92
  ```
72
93
 
73
- Get a single User:
94
+ When using cursor pagination the client will automatically pause and then retry the request if it runs into [Notion rate limiting](https://developers.notion.com/reference/errors#request-limits). (It will pause for 10 seconds before retrying the request, a value that can be overriden with `Notion::Client.config.default_retry_after`.) If it receives too many rate-limited responses in a row it will give up and raise an error. The default number of retries is 100 and can be adjusted via `Notion::Client.config.default_max_retries` or by passing it directly into the method as `max_retries`.
95
+
96
+ You can also proactively avoid rate limiting by adding a pause between every paginated request with the `sleep_interval` parameter, which is given in seconds.
74
97
 
75
98
  ```ruby
76
- client.user(id: 'd40e767c-d7af-4b18-a86d-55c61f1e39a4')
99
+ all_users = []
100
+ client.users_list(sleep_interval: 5, max_retries: 20) do |page|
101
+ # pauses for 5 seconds between each request
102
+ # gives up after 20 consecutive rate-limited responses
103
+ all_users.concat(page.results)
104
+ end
105
+ all_users
77
106
  ```
78
107
 
79
- #### Databases
108
+ ## Endpoints
109
+
110
+ ### Databases
80
111
 
81
- Gets a paginated array of Page objects contained in the requested database, filtered and ordered according to the filter and sort references provided in the request.
112
+ #### Query a database
113
+
114
+ Gets a paginated array of [Page](https://developers.notion.com/reference/page) objects contained in the database, filtered and ordered according to the filter conditions and sort criteria provided in the request.
82
115
 
83
116
  ```ruby
84
- client.database_query(id: 'e383bcee-e0d8-4564-9c63-900d307abdb0') # retrieves the first page
117
+ client.database_query(database_id: 'e383bcee-e0d8-4564-9c63-900d307abdb0') # retrieves the first page
85
118
 
86
- client.database_query(id: 'e383bcee-e0d8-4564-9c63-900d307abdb0', start_cursor: 'fe2cc560-036c-44cd-90e8-294d5a74cebc')
119
+ client.database_query(database_id: 'e383bcee-e0d8-4564-9c63-900d307abdb0', start_cursor: 'fe2cc560-036c-44cd-90e8-294d5a74cebc')
87
120
 
88
- client.database_query((id: 'e383bcee-e0d8-4564-9c63-900d307abdb0') do |page|
121
+ client.database_query(database_id: 'e383bcee-e0d8-4564-9c63-900d307abdb0') do |page|
89
122
  # paginate through all pages
90
123
  end
91
124
 
@@ -112,16 +145,95 @@ filter = {
112
145
  }
113
146
  ]
114
147
  }
115
- client.database_query(id: 'e383bcee-e0d8-4564-9c63-900d307abdb0', sort: sort, filter: filter)
148
+ client.database_query(database_id: 'e383bcee-e0d8-4564-9c63-900d307abdb0', sort: sort, filter: filter)
116
149
  ```
117
150
 
118
- Get a single Database:
151
+ See [Pagination](#pagination) for details about how to iterate through the list.
152
+
153
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/post-database-query).
154
+
155
+ #### Create a Database
156
+
157
+ Creates a database as a subpage in the specified parent page, with the specified properties schema.
119
158
 
120
159
  ```ruby
121
- client.database(id: 'e383bcee-e0d8-4564-9c63-900d307abdb0')
160
+ title = [
161
+ {
162
+ "type": "text",
163
+ "text": {
164
+ "content": "Grocery List",
165
+ "link": nil
166
+ }
167
+ }
168
+ ]
169
+ properties = {
170
+ "Name": {
171
+ "title": {}
172
+ },
173
+ "Description": {
174
+ "rich_text": {}
175
+ },
176
+ "In stock": {
177
+ "checkbox": {}
178
+ },
179
+ "Food group": {
180
+ "select": {
181
+ "options": [
182
+ {
183
+ "name": "🥦Vegetable",
184
+ "color": "green"
185
+ },
186
+ {
187
+ "name": "🍎Fruit",
188
+ "color": "red"
189
+ },
190
+ {
191
+ "name": "💪Protein",
192
+ "color": "yellow"
193
+ }
194
+ ]
195
+ }
196
+ }
197
+ }
198
+ client.create_database(
199
+ parent: { page_id: '98ad959b-2b6a-4774-80ee-00246fb0ea9b' },
200
+ title: title,
201
+ properties: properties
202
+ )
122
203
  ```
123
204
 
124
- Lists databases:
205
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/create-a-database).
206
+
207
+ #### Update a Database
208
+
209
+ Updates an existing database as specified by the parameters.
210
+
211
+ ```ruby
212
+ title = [
213
+ {
214
+ "text": {
215
+ "content": "Orbit 💜 Notion"
216
+ }
217
+ }
218
+ ]
219
+ client.update_database(database_id: 'dd428e9dd3fe4171870da7a1902c748b', title: title)
220
+ ```
221
+
222
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/update-a-database).
223
+
224
+ #### Retrieve a database
225
+
226
+ Retrieves a [Database object](https://developers.notion.com/reference-link/database) using the ID specified.
227
+
228
+ ```ruby
229
+ client.database(database_id: 'e383bcee-e0d8-4564-9c63-900d307abdb0')
230
+ ```
231
+
232
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/retrieve-a-database).
233
+
234
+ #### List databases
235
+
236
+ List all [Databases](https://developers.notion.com/reference-link/database) shared with the authenticated integration.
125
237
 
126
238
  ```ruby
127
239
  client.databases_list # retrieves the first page
@@ -133,26 +245,54 @@ client.databases_list do |page|
133
245
  end
134
246
  ```
135
247
 
136
- #### Pages
248
+ See [Pagination](#pagination) for details about how to iterate through the list.
249
+
250
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/list-databases).
251
+
252
+ ### Pages
253
+
254
+ #### Retrieve a page
137
255
 
138
- Create a page:
256
+ Retrieves a [Page object](https://developers.notion.com/reference-link/page) using the ID specified.
257
+
258
+ > :blue_book: Responses contains page **properties**, not page content. To fetch page content, use the [retrieve block children](#retrieve-block-children) endpoint.
259
+
260
+ ```ruby
261
+ client.page(page_id: 'b55c9c91-384d-452b-81db-d1ef79372b75')
262
+ ```
263
+
264
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/retrieve-a-page).
265
+
266
+ #### Create a page
267
+
268
+ Creates a new page in the specified database or as a child of an existing page.
269
+
270
+ If the parent is a database, the [property values](https://developers.notion.com/reference-link/page-property-value) of the new page in the properties parameter must conform to the parent [database](https://developers.notion.com/reference-link/database)'s property schema.
271
+
272
+ If the parent is a page, the only valid property is `title`.
273
+
274
+ The new page may include page content, described as [blocks](https://developers.notion.com/reference-link/block) in the children parameter.
139
275
 
140
276
  ```ruby
141
277
  properties = {
142
- "Name": [
143
- {
144
- "text": {
145
- "content": "Tuscan Kale"
278
+ "Name": {
279
+ "title": [
280
+ {
281
+ "text": {
282
+ "content": "Tuscan Kale"
283
+ }
146
284
  }
147
- }
148
- ],
149
- "Description": [
150
- {
151
- "text": {
152
- "content": "A dark green leafy vegetable"
285
+ ]
286
+ },
287
+ "Description": {
288
+ "rich_text": [
289
+ {
290
+ "text": {
291
+ "content": "A dark green leafy vegetable"
292
+ }
153
293
  }
154
- }
155
- ],
294
+ ]
295
+ },
156
296
  "Food group": {
157
297
  "name": "🥦 Vegetable"
158
298
  },
@@ -189,17 +329,148 @@ client.create_page(
189
329
  )
190
330
  ```
191
331
 
192
- Retrieve a page:
332
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/post-page).
193
333
 
194
- ```ruby
195
- client.page(id: 'b55c9c91-384d-452b-81db-d1ef79372b75')
196
- ```
334
+ #### Update page
197
335
 
198
- Update page properties:
336
+ Updates [page property values](https://developers.notion.com/reference-link/page-property-value) for the specified page. Properties that are not set via the `properties` parameter will remain unchanged.
337
+
338
+ If the parent is a database, the new [property values](https://developers.notion.com/reference-link/page-property-value) in the `properties` parameter must conform to the parent [database](https://developers.notion.com/reference-link/database)'s property schema.
199
339
 
200
340
  ```ruby
201
341
  properties = {
202
342
  "In stock": true
203
343
  }
204
- client.update_page(id: 'b55c9c91-384d-452b-81db-d1ef79372b75', properties: properties)
344
+ client.update_page(page_id: 'b55c9c91-384d-452b-81db-d1ef79372b75', properties: properties)
345
+ ```
346
+
347
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/patch-page).
348
+
349
+ ### Blocks
350
+
351
+ #### Retrieve a block
352
+
353
+ Retrieves a [Block object](https://developers.notion.com/reference-link/block) using the ID specified.
354
+
355
+ > :blue_book: If a block contains the key `has_children: true`, use the [Retrieve block children](#retrieve-block-children) endpoint to get the list of children
356
+
357
+ ```ruby
358
+ client.block(block_id: '9bc30ad4-9373-46a5-84ab-0a7845ee52e6')
359
+ ```
360
+
361
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/retrieve-a-block).
362
+
363
+ #### Update a block
364
+
365
+ Updates the content for the specified block_id based on the block type. Supported fields based on the block object type (see [Block object](https://developers.notion.com/reference-link/block#block-type-object) for available fields and the expected input for each field).
366
+
367
+ **Note** The update replaces the entire value for a given field. If a field is omitted (ex: omitting checked when updating a to_do block), the value will not be changed.
368
+
369
+ ```ruby
370
+ to_do = {
371
+ 'text': [{
372
+ 'text': { 'content': 'Lacinato kale' }
373
+ }],
374
+ 'checked': false
375
+ }
376
+ client.update_block(block_id: '9bc30ad4-9373-46a5-84ab-0a7845ee52e6', 'to_do' => to_do)
377
+ ```
378
+
379
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/retrieve-a-block).
380
+
381
+ #### Retrieve block children
382
+
383
+ Returns a paginated array of child [block objects](https://developers.notion.com/reference-link/block) contained in the block using the ID specified. In order to receive a complete representation of a block, you may need to recursively retrieve the block children of child blocks.
384
+
385
+ ```ruby
386
+ client.block_children(block_id: 'b55c9c91-384d-452b-81db-d1ef79372b75')
387
+
388
+ client.block_children(block_id: 'b55c9c91-384d-452b-81db-d1ef79372b75', start_cursor: 'fe2cc560-036c-44cd-90e8-294d5a74cebc')
389
+
390
+ client.block_children(block_id: 'b55c9c91-384d-452b-81db-d1ef79372b75') do |page|
391
+ # paginate through all children
392
+ end
393
+ ```
394
+
395
+ See [Pagination](#pagination) for details about how to iterate through the list.
396
+
397
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/get-block-children).
398
+
399
+ #### Append block children
400
+
401
+ Creates and appends new children blocks to the parent block specified by `block_id`.
402
+
403
+ Returns a paginated list of newly created first level children block objects.
404
+
405
+ ```ruby
406
+ children = [
407
+ {
408
+ "object": 'block',
409
+ "type": 'heading_2',
410
+ "heading_2": {
411
+ "text": [{ "type": 'text', "text": { "content": 'A Second-level Heading' } }]
412
+ }
413
+ }
414
+ ]
415
+ client.block_append_children(block_id: 'b55c9c91-384d-452b-81db-d1ef79372b75', children: children)
205
416
  ```
417
+
418
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/patch-block-children).
419
+
420
+ ### Users
421
+
422
+ #### Retrieve a user
423
+
424
+ Retrieves a [User](https://developers.notion.com/reference/user) using the ID specified.
425
+
426
+ ```ruby
427
+ client.user(user_id: 'd40e767c-d7af-4b18-a86d-55c61f1e39a4')
428
+ ```
429
+
430
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/get-user).
431
+
432
+ #### List all users
433
+
434
+ Returns a paginated list of [Users](https://developers.notion.com/reference/user) for the workspace.
435
+
436
+ ```ruby
437
+ client.users_list # retrieves the first page
438
+
439
+ client.users_list(start_cursor: 'fe2cc560-036c-44cd-90e8-294d5a74cebc')
440
+
441
+ client.users_list do |page|
442
+ # paginate through all users
443
+ end
444
+ ```
445
+
446
+ See [Pagination](#pagination) for details about how to iterate through the list.
447
+
448
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/get-users).
449
+
450
+ ### Search
451
+
452
+ Searches all pages and child pages that are shared with the integration. The results may include databases.
453
+
454
+ ```ruby
455
+ client.search # search through every available page and database
456
+
457
+ client.search(query: 'Specific query') # limits which pages are returned by comparing the query to the page title
458
+
459
+ client.search(filter: { property: 'object', value: 'page' }) # only returns pages
460
+
461
+ client.search(sort: { direction: 'ascending', timestamp: 'last_edited_time' }) # sorts the results based on the provided criteria.
462
+
463
+ client.search(start_cursor: 'fe2cc560-036c-44cd-90e8-294d5a74cebc')
464
+
465
+ client.search do |page|
466
+ # paginate through all search pages
467
+ end
468
+ ```
469
+
470
+ See [Pagination](#pagination) for details about how to iterate through the list.
471
+
472
+ See the full endpoint documentation on [Notion Developers](https://developers.notion.com/reference/post-search).
473
+
474
+ ## Acknowledgements
475
+
476
+ The code, specs and documentation of this gem are an adaptation of the fantastic [Slack Ruby Client](https://github.com/slack-ruby/slack-ruby-client) gem. Many thanks to its author and maintainer [@dblock](https://github.com/dblock) and [contributors](https://github.com/slack-ruby/slack-ruby-client/graphs/contributors).