notion_ruby_mapping 0.1.4 → 0.2.0

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/Guardfile +1 -1
  3. data/README.md +494 -268
  4. data/env.yml.sample +7 -0
  5. data/lib/notion_ruby_mapping/base.rb +37 -30
  6. data/lib/notion_ruby_mapping/checkbox_property.rb +26 -0
  7. data/lib/notion_ruby_mapping/created_by_property.rb +21 -0
  8. data/lib/notion_ruby_mapping/created_time_property.rb +20 -0
  9. data/lib/notion_ruby_mapping/database.rb +8 -8
  10. data/lib/notion_ruby_mapping/date_base_property.rb +40 -38
  11. data/lib/notion_ruby_mapping/date_property.rb +42 -18
  12. data/lib/notion_ruby_mapping/email_property.rb +30 -1
  13. data/lib/notion_ruby_mapping/files_property.rb +40 -0
  14. data/lib/notion_ruby_mapping/formula_property.rb +18 -0
  15. data/lib/notion_ruby_mapping/last_edited_by_property.rb +21 -0
  16. data/lib/notion_ruby_mapping/last_edited_time_property.rb +20 -0
  17. data/lib/notion_ruby_mapping/list.rb +33 -2
  18. data/lib/notion_ruby_mapping/mention_object.rb +49 -0
  19. data/lib/notion_ruby_mapping/multi_select_property.rb +25 -6
  20. data/lib/notion_ruby_mapping/notion_cache.rb +126 -53
  21. data/lib/notion_ruby_mapping/number_property.rb +13 -8
  22. data/lib/notion_ruby_mapping/page.rb +5 -2
  23. data/lib/notion_ruby_mapping/payload.rb +10 -2
  24. data/lib/notion_ruby_mapping/people_property.rb +38 -0
  25. data/lib/notion_ruby_mapping/phone_number_property.rb +30 -1
  26. data/lib/notion_ruby_mapping/property.rb +79 -43
  27. data/lib/notion_ruby_mapping/property_cache.rb +31 -12
  28. data/lib/notion_ruby_mapping/query.rb +5 -2
  29. data/lib/notion_ruby_mapping/relation_property.rb +37 -0
  30. data/lib/notion_ruby_mapping/rich_text_object.rb +74 -0
  31. data/lib/notion_ruby_mapping/rich_text_property.rb +18 -0
  32. data/lib/notion_ruby_mapping/rollup_property.rb +29 -0
  33. data/lib/notion_ruby_mapping/select_property.rb +12 -6
  34. data/lib/notion_ruby_mapping/text_object.rb +89 -0
  35. data/lib/notion_ruby_mapping/text_property.rb +61 -0
  36. data/lib/notion_ruby_mapping/title_property.rb +18 -0
  37. data/lib/notion_ruby_mapping/url_property.rb +30 -1
  38. data/lib/notion_ruby_mapping/user_object.rb +38 -0
  39. data/lib/notion_ruby_mapping/version.rb +2 -1
  40. data/lib/notion_ruby_mapping.rb +3 -3
  41. data/notion_ruby_mapping.gemspec +3 -1
  42. metadata +40 -7
data/README.md CHANGED
@@ -1,44 +1,67 @@
1
- # NotionRubyMapping
1
+ # notion_ruby_mapping
2
2
 
3
3
  Notion Ruby mapping is currently under development.
4
4
 
5
5
  Development note is here. → [Idea note of "notion_ruby_mapping"](https://www.notion.so/hkob/Idea-note-of-notion_ruby_mapping-3b0a3bb3c171438a830f9579d41df501)
6
6
 
7
7
  ## Table of Contents
8
- - [NotionRubyMapping](#notionrubymapping)
8
+
9
+
10
+ <!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->
11
+
12
+ <!-- code_chunk_output -->
13
+
14
+ - [notion\_ruby\_mapping](#notion_ruby_mapping)
9
15
  - [Table of Contents](#table-of-contents)
10
16
  - [1. Installation](#1-installation)
11
17
  - [2. Example code](#2-example-code)
12
- - [3. Usage](#3-usage)
18
+ - [2.1 Set icon to all icon unsettled pages](#21-set-icon-to-all-icon-unsettled-pages)
19
+ - [2.2 Renumbering pages](#22-renumbering-pages)
20
+ - [2.3 Change title](#23-change-title)
21
+ - [Pattern 1 (replace existing text partially)](#pattern-1-replace-existing-text-partially)
22
+ - [Pattern 2 (replace all text)](#pattern-2-replace-all-text)
23
+ - [3. Preparation](#3-preparation)
13
24
  - [3.1 Create a New Integration](#31-create-a-new-integration)
14
25
  - [3.2 Create client](#32-create-client)
15
- - [3.3 Retrieve a database](#33-retrieve-a-database)
16
- - [3.4 Retrieve a page](#34-retrieve-a-page)
17
- - [3.5 Query a database](#35-query-a-database)
18
- - [3.5.1 A simple example](#351-a-simple-example)
19
- - [3.5.2 Property classes](#352-property-classes)
20
- - [3.5.3 Query object generator of property objects](#353-query-object-generator-of-property-objects)
21
- - [3.5.4 Complex conditions](#354-complex-conditions)
22
- - [3.5.5 Sort criteria](#355-sort-criteria)
23
- - [3.6 Access the database or page values and properties](#36-access-the-database-or-page-values-and-properties)
24
- - [3.7 Set icon (Database / Page)](#37-set-icon-database--page)
25
- - [3.8 Update page property values](#38-update-page-property-values)
26
- - [3.8.1 Assign property and update it (fastest: one API call only)](#381-assign-property-and-update-it-fastest-one-api-call-only)
27
- - [3.8.2 Update the loaded page (easy but slow: two API calls)](#382-update-the-loaded-page-easy-but-slow-two-api-calls)
28
- - [3.8.3 Update the unloaded page with auto-load (easy but slow: two API calls)](#383-update-the-unloaded-page-with-auto-load-easy-but-slow-two-api-calls)
29
- - [3.8.4 Explanation of how to update each property](#384-explanation-of-how-to-update-each-property)
30
- - [3.8.4.1 NumberProperty](#3841-numberproperty)
31
- - [3.8.4.2 SelectProperty](#3842-selectproperty)
32
- - [3.8.4.3 MultiSelectProperty](#3843-multiselectproperty)
33
- - [3.8.4.4 DateProperty](#3844-dateproperty)
34
- - [3.9 Iteration of list object](#39-iteration-of-list-object)
35
- - [4. ChangeLog](#4-changelog)
36
- - [5. Contributing](#5-contributing)
37
- - [6. License](#6-license)
38
- - [7. Code of Conduct](#7-code-of-conduct)
39
- - [8. Acknowledgements](#8-acknowledgements)
40
-
41
- <!-- @import "[TOC]" {cmd="toc" depthFrom=2 depthTo=4 orderedList=false} -->
26
+ - [4. Usage](#4-usage)
27
+ - [4.1 Page](#41-page)
28
+ - [4.1.1 Retrieve a page](#411-retrieve-a-page)
29
+ - [4.1.2 Update page properties](#412-update-page-properties)
30
+ - [4.1.3 Update other page information](#413-update-other-page-information)
31
+ - [4.1.4 other methods](#414-other-methods)
32
+ - [4.2 Page](#42-page)
33
+ - [4.2.1 Retrieve a database](#421-retrieve-a-database)
34
+ - [4.2.2 Query a database](#422-query-a-database)
35
+ - [4.2.2.1 Complex conditions](#4221-complex-conditions)
36
+ - [4.2.2.2 Sort criteria](#4222-sort-criteria)
37
+ - [4.2.3 Update database](#423-update-database)
38
+ - [4.3 List class](#43-list-class)
39
+ - [4.4 Block class](#44-block-class)
40
+ - [4.5 Property classes](#45-property-classes)
41
+ - [4.5.1 How to obtain Property object](#451-how-to-obtain-property-object)
42
+ - [4.5.2 Query object generator of property objects](#452-query-object-generator-of-property-objects)
43
+ - [4.5.3 create or update values for Page properties](#453-create-or-update-values-for-page-properties)
44
+ - [4.5.3.1 NumberProperty](#4531-numberproperty)
45
+ - [4.5.3.2 SelectProperty](#4532-selectproperty)
46
+ - [4.5.3.3 MultiSelectProperty](#4533-multiselectproperty)
47
+ - [4.5.3.4 DateProperty](#4534-dateproperty)
48
+ - [4.5.3.4 UrlProperty](#4534-urlproperty)
49
+ - [4.5.3.5 EmailProperty](#4535-emailproperty)
50
+ - [4.5.3.6 PhoneNumberProperty](#4536-phonenumberproperty)
51
+ - [4.5.3.7 PeopleProperty](#4537-peopleproperty)
52
+ - [4.5.3.8 TitleProperty, RichTextProperty](#4538-titleproperty-richtextproperty)
53
+ - [4.5.3.9 CheckboxProperty](#4539-checkboxproperty)
54
+ - [4.5.3.10 EmailProperty](#45310-emailproperty)
55
+ - [4.5.3.11 FilesProperty](#45311-filesproperty)
56
+ - [4.5.3.12 RelationProperty](#45312-relationproperty)
57
+ - [6. ChangeLog](#6-changelog)
58
+ - [6. Contributing](#6-contributing)
59
+ - [7. License](#7-license)
60
+ - [8. Code of Conduct](#8-code-of-conduct)
61
+ - [9. Acknowledgements](#9-acknowledgements)
62
+
63
+ <!-- /code_chunk_output -->
64
+
42
65
 
43
66
  ## 1. Installation
44
67
 
@@ -50,15 +73,22 @@ gem 'notion_ruby_mapping'
50
73
 
51
74
  And then execute:
52
75
 
53
- $ bundle install
76
+ ```shell
77
+ bundle install
78
+ ```
54
79
 
55
80
  Or install it yourself as:
56
81
 
57
- $ gem install notion_ruby_mapping
82
+ ```shell
83
+ gem install notion_ruby_mapping
84
+ ```
58
85
 
59
86
  ## 2. Example code
60
87
 
88
+ ### 2.1 Set icon to all icon unsettled pages
89
+
61
90
  The following code sets a "💿" icon on all unset pages in the database.
91
+
62
92
  ```Ruby
63
93
  require "notion_ruby_mapping"
64
94
 
@@ -69,7 +99,8 @@ database_id = ENV["DATABASE_ID"]
69
99
 
70
100
  NotionCache.instance.create_client token
71
101
 
72
- Database.query(database_id).each do |page|
102
+ db = Database.new id: database_id
103
+ db.query_database.each do |page|
73
104
  p page.set_icon(emoji: "💿").id unless page.icon
74
105
  end
75
106
  ```
@@ -78,19 +109,50 @@ end
78
109
  |---|---|
79
110
  |![Before execution](images/pre_set_icon.png)|![After execution](images/post_set_icon.png)|
80
111
 
112
+ ### 2.2 Renumbering pages
113
+
81
114
  The following code sets serial numbers to the pages whose title is not empty in ascending order of titles.
115
+
82
116
  ```Ruby
83
- tp = RichTextProperty.new("TextTitle")
84
- Database.query(database_id, tp.filter_is_not_empty.ascending(tp)).each.with_index(1) do |page, index|
117
+ db = Database.new id: database_id, assign: [RichTextProperty, "TextTitle"]
118
+ tp = db.properties["TextTitle"]
119
+ query = tp.filter_is_not_empty.ascending(tp)
120
+ db.query_database(tp.filter_is_not_empty.ascending(tp)).each.with_index(1) do |page, index|
85
121
  page.properties["NumberTitle"].number = index
86
122
  page.update
87
123
  end
88
124
  ```
125
+
89
126
  | After execution |
90
127
  |-----------------------------------------------|
91
128
  | ![After exuecution](images/serial_number.png) |
92
129
 
93
- ## 3. Usage
130
+ ### 2.3 Change title
131
+
132
+ The following code update the page title.
133
+
134
+ #### Pattern 1 (replace existing text partially)
135
+
136
+ ```Ruby
137
+ page = Page.find page_id # API access
138
+ print page.title # -> ABC\nDEF
139
+ tp = page.properties["Title"]
140
+ tp[1].text = "GHI"
141
+ page.update # API access
142
+ print page.title # -> ABC\nGHI
143
+ ```
144
+
145
+ #### Pattern 2 (replace all text)
146
+
147
+ ```Ruby
148
+ page = Page.new id: page_id, assign: [TitleProperty, "Title"]
149
+ tp = page.properties["Title"]
150
+ tp << TextObject.new("JKL")
151
+ page.update # API access
152
+ print page.title # -> JKL
153
+ ```
154
+
155
+ ## 3. Preparation
94
156
 
95
157
  ### 3.1 Create a New Integration
96
158
 
@@ -99,176 +161,143 @@ Please check [Notion documentation](https://developers.notion.com/docs#getting-s
99
161
  ### 3.2 Create client
100
162
 
101
163
  Please create a client (notion-ruby-client) before you use the following class.
164
+
102
165
  ```Ruby
103
166
  NotionCache.instance.create_client ENV["NOTION_API_TOKEN"]
104
167
  ```
105
168
 
106
- ### 3.3 Retrieve a database
169
+ ## 4. Usage
170
+
171
+ ### 4.1 Page
172
+
173
+ #### 4.1.1 Retrieve a page
107
174
 
108
- Database.find(id) creates a Database object from the results of Notion API.
175
+ `Page.find(id)` creates a Page object with `retrieving page API`.
176
+ The created object has page information generated from the JSON response.
109
177
 
110
178
  ```Ruby
111
- db = Database.find("c37a2c66-e3aa-4a0d-a447-73de3b80c253")
179
+ page = Page.find "c01166c6-13ae-45cb-b968-18b4ef2f5a77" # Notion API call
112
180
  ```
113
181
 
114
- Database.new(id) creates a Database object without accessing to Notion.
115
- If you want to retrieve the contents after creation, please use a `reload` method.
182
+ `Page.new(id)` creates a Page object without the Notion API.
183
+ Since Page.new does not acquire property information, so you need to assign yourself.
116
184
 
117
185
  ```Ruby
118
- db = Database.new("c37a2c66-e3aa-4a0d-a447-73de3b80c253")
119
- db.reload
186
+ # Assign some properties for update manually
187
+ # The argument of assign keyword is Array with the multiple pairs of PropertyClass and Property name
188
+ page = Page.new id: "c01166c6-13ae-45cb-b968-18b4ef2f5a77",
189
+ assign: [TitleProperty, "Title", NumberProperty, "NumberTitle"]
120
190
  ```
121
191
 
122
- ### 3.4 Retrieve a page
192
+ #### 4.1.2 Update page properties
123
193
 
124
- Page.find(id) creates a Page object from the results of Notion API.
194
+ Page properties with values can be obtained from the retrieved page using `find`.
195
+ On the other hand, Page properties without values can be obtained from the property assigned page.
125
196
 
126
197
  ```Ruby
127
- page = Page.find("c01166c6-13ae-45cb-b968-18b4ef2f5a77")
198
+ tp = page.properties["Title"] # TitleProperty
199
+ np = page.properties["Number"] # NumberProperty
128
200
  ```
129
201
 
130
- Page.new(id) creates a Page object without accessing to Notion.
131
- If you want to retrieve the contents after creation, please use a `reload` method.
202
+ Each property object can change values using corresponded methods.
203
+ After changing value, `will_update` flag of the property object also set to true.
204
+ These methods are explained in the section of each property object class.
132
205
 
133
206
  ```Ruby
134
- page = Page.new("c01166c6-13ae-45cb-b968-18b4ef2f5a77")
135
- page.reload
207
+ to = tp[1] # TitleProperty has Array of TextObject
208
+ to.text = "ABC" # TextObject can set text by ".text="
209
+ # or tp[1].text = "ABC"
210
+
211
+ np.number = 3.14159
136
212
  ```
137
213
 
138
- ### 3.5 Query a database
214
+ After update some properties, `page.update` method sends `update page API` and replace the page information using the response of API.
139
215
 
140
- #### 3.5.1 A simple example
216
+ ```Ruby
217
+ page.update # Notion API call
218
+ ```
219
+
220
+ #### 4.1.3 Update other page information
221
+
222
+ `page.set_icon` can change the page icon using emoji or external url.
141
223
 
142
- Gets a List object of Page objects contained in the database.
143
- You can obtain filtered and ordered pages using Query object.
144
224
  ```Ruby
145
- Database.query("c37a2c66-e3aa-4a0d-a447-73de3b80c253") # retrieves all pages
146
- Database.query("c37a2c66-e3aa-4a0d-a447-73de3b80c253", query) # retrieves using query
225
+ # both methods call Notion API
226
+ obj.set_icon emoji: "💿" # set emoji
227
+ obj.set_icon url: "https://cdn.profile-image.st-hatena.com/users/hkob/profile.png" # set external url
147
228
  ```
148
229
 
149
- Query object can be generated from the following Property objects.
150
- For example, in order to obtain the pages whose title starts with "A" and ordered by ascending,
151
- the following code can be used.
230
+ #### 4.1.4 other methods
231
+
232
+ - `page.title` returns plain_text string of `Title`.
233
+ - `page.icon` returns JSON hash for the page icon.
234
+ - `page[key]` returns a hash or an array object except "properties".
235
+
236
+ ### 4.2 Page
237
+
238
+ #### 4.2.1 Retrieve a database
239
+
240
+ `Database.find(id)` creates a Database object with `retrieving database API`.
241
+ The created object has database information generated from the JSON response.
242
+
152
243
  ```Ruby
153
- tp = TitleProperty.new "Title"
154
- query = tp.filter_starts_with("A").ascending(tp)
155
- pages = Database.query database_id, query
244
+ db = Database.find("c37a2c66-e3aa-4a0d-a447-73de3b80c253") # Notion API call
156
245
  ```
157
246
 
158
- #### 3.5.2 Property classes
247
+ `Database.new(id)` creates a Database object without the Notion API.
248
+ Since Database.new does not acquire property information, so you need to assign yourself.
159
249
 
160
- There are the following 17 XXXProperty classes corresponding to Notion databases.
161
- They are child classes of a `Property` class
162
- and these constructor method has a common form where the first argument is the property name.
163
250
  ```Ruby
164
- xp = XXXProperty.new "property name"
251
+ # assign some properties for update manually
252
+ db = Database.new id: "c37a2c66-e3aa-4a0d-a447-73de3b80c253",
253
+ assign: [TitleProperty, "Title", NumberProperty, "NumberTitle"]
165
254
  ```
166
255
 
167
- 1. TitleProperty
168
- 2. RichTextProperty
169
- 3. UrlProperty
170
- 4. EmailProperty
171
- 5. PhoneNumberProperty
172
- 6. NumberProperty
173
- 7. CheckboxProperty
174
- 8. SelectProperty
175
- 9. MultiSelectProperty
176
- 10. PeopleProperty
177
- 11. CreatedByProperty
178
- 12. LastEditedByProperty
179
- 13. DateProperty
180
- 14. CreatedTimeProperty
181
- 15. LastEditedTimeProperty
182
- 16. FilesProperty
183
- 17. FormulaProperty
256
+ #### 4.2.2 Query a database
184
257
 
185
- #### 3.5.3 Query object generator of property objects
258
+ `db.query_database` obtains a List object with Page objects contained in the database.
259
+ You can obtain filtered and ordered pages using Query object.
186
260
 
187
- The following methods for the Property objects generate a query object.
188
- - TitleProperty, RichTextProperty, UrlProperty, EmailProperty, PhoneNumberProperty
189
- - filter_equals(value)
190
- - filter_does_not_equal(value)
191
- - filter_contains(value)
192
- - filter_does_not_contain(value)
193
- - filter_starts_with(value)
194
- - filter_ends_with(value)
195
- - filter_is_empty
196
- - filter_is_not_empty
197
- - NumberProperty
198
- - filter_equals(value)
199
- - filter_does_not_equal(value)
200
- - filter_greater_than(value)
201
- - filter_less_than(value)
202
- - filter_greater_than_or_equal_to(value)
203
- - filter_less_than_or_equal_to(value)
204
- - filter_is_empty
205
- - filter_is_not_empty
206
- - CheckboxProperty
207
- - filter_equals(value)
208
- - filter_does_not_equal(value)
209
- - SelectProperty
210
- - filter_equals(value)
211
- - filter_does_not_equal(value)
212
- - filter_is_empty
213
- - filter_is_not_empty
214
- - MultiSelectProperty, PeopleProperty, CreatedByProperty, LastEditedByProperty
215
- - filter_contains(value)
216
- - filter_does_not_contain(value)
217
- - filter_is_empty
218
- - filter_is_not_empty
219
- - DateProperty, CreatedTimeProperty, LastEditedTimeProperty
220
- - filter_equals(value(Date / Time / DateTime / String))
221
- - filter_does_not_equal(value(Date / Time / DateTime / String))
222
- - filter_before(value(Date / Time / DateTime / String))
223
- - filter_after(value(Date / Time / DateTime / String))
224
- - filter_on_or_before(value(Date / Time / DateTime / String))
225
- - filter_on_or_after(value(Date / Time / DateTime / String))
226
- - filter_past_week
227
- - filter_past_month
228
- - filter_past_year
229
- - filter_next_week
230
- - filter_next_month
231
- - filter_next_year
232
- - FilesProperty
233
- - filter_is_empty
234
- - filter_is_not_empty
235
- - FormulaProperty
236
- - filter_equals(value(Date / Time / DateTime / String))
237
- - filter_does_not_equal(value(Date / Time / DateTime / String))
238
- - filter_before(value(Date / Time / DateTime / String))
239
- - filter_after(value(Date / Time / DateTime / String))
240
- - filter_on_or_before(value(Date / Time / DateTime / String))
241
- - filter_on_or_after(value(Date / Time / DateTime / String))
242
- - filter_past_week
243
- - filter_past_month
244
- - filter_past_year
245
- - filter_next_week
246
- - filter_next_month
247
- - filter_next_year
248
- - filter_contains(value)
249
- - filter_does_not_contain(value)
250
- - filter_starts_with(value)
251
- - filter_ends_with(value)
252
- - filter_greater_than(value)
253
- - filter_less_than(value)
254
- - filter_greater_than_or_equal_to(value)
255
- - filter_less_than_or_equal_to(value)
256
- - filter_is_empty
257
- - filter_is_not_empty
261
+ ```Ruby
262
+ # query_database method calls Notion API
263
+ db.query_database # retrieves all pages (no filter, no sort)
264
+ db.query_database query # retrieves using query
265
+ ```
266
+
267
+ The query object can be generated from the Property objects included in the database object.
268
+ The Property object can be obtained from the retrieved or assigned database object like as the Page object.
269
+
270
+ `filter_xxxx` methods of the property objects generates a query object.
271
+ These methods are explained in the section of each property object class.
272
+
273
+ ```Ruby
274
+ tp = db.properties["Title"]
275
+ query = tp.filter_starts_with("A").ascending(tp)
276
+ pages = db.query_database query
277
+ ```
278
+
279
+ ##### 4.2.2.1 Complex conditions
258
280
 
259
- #### 3.5.4 Complex conditions
260
- Complex filters can be generated `and` / `or` methods.
281
+ Complex filters can be generated `and` / `or` methods of the Query object.
261
282
  Here are some sample scripts and the json parameters created from them.
262
283
 
263
284
  ```Ruby
264
285
  # Prepare some sample properties
265
- tp = TitleProperty.new "tp"
266
- np = NumberProperty.new "np"
267
- cp = CheckboxProperty.new "cp"
268
- letp = LastEditedTimeProperty.new "letp"
286
+ db = Database.new id: "sample database id",
287
+ assign: [
288
+ TitleProperty, "tp",
289
+ NumberProperty, "np",
290
+ CheckboxProperty, "cp",
291
+ LastEditedTimeProperty, "letp",
292
+ ]
293
+ properties = db.properties # PropertyCache object
294
+ # PropertyCache object can receive [] or values_at methods.
295
+ # `values_at` method is useful when retrieving multiple properties at once.
296
+ (tp, np, cp, letp) = properties.values_at "tp", "np", "cp", "letp"
269
297
  ```
270
298
 
271
299
  - query1: (A and B) filter
300
+
272
301
  ```Ruby
273
302
  query1 = tp.filter_starts_with("start")
274
303
  .and(np.filter_greater_than(100))
@@ -289,6 +318,7 @@ query1 = tp.filter_starts_with("start")
289
318
  ```
290
319
 
291
320
  - query2: (A and B and C) filter
321
+
292
322
  ```Ruby
293
323
  query2 = tp.filter_starts_with("start")
294
324
  .and(np.filter_greater_than(100))
@@ -314,6 +344,7 @@ query2 = tp.filter_starts_with("start")
314
344
  ```
315
345
 
316
346
  - query3: (A or B) filter
347
+
317
348
  ```Ruby
318
349
  query3 = tp.filter_starts_with("start")
319
350
  .or(np.filter_greater_than(100))
@@ -334,6 +365,7 @@ query3 = tp.filter_starts_with("start")
334
365
  ```
335
366
 
336
367
  - query4: (A or B or C) filter
368
+
337
369
  ```Ruby
338
370
  query4 = tp.filter_starts_with("start")
339
371
  .or(np.filter_greater_than(100))
@@ -359,6 +391,7 @@ query4 = tp.filter_starts_with("start")
359
391
  ```
360
392
 
361
393
  - query5: ((A and B) or C) filter
394
+
362
395
  ```Ruby
363
396
  query5 = tp.filter_starts_with("start")
364
397
  .and(np.filter_greater_than(100))
@@ -388,6 +421,7 @@ query5 = tp.filter_starts_with("start")
388
421
  ```
389
422
 
390
423
  - query6: ((A or B) and C) filter
424
+
391
425
  ```Ruby
392
426
  query6 = tp.filter_starts_with("start")
393
427
  .or(np.filter_greater_than(100))
@@ -417,6 +451,7 @@ query6 = tp.filter_starts_with("start")
417
451
  ```
418
452
 
419
453
  - query7: ((A and B) or (C and D)) filter
454
+
420
455
  ```Ruby
421
456
  query7 = np.filter_greater_than(100).and(np.filter_less_than(200))
422
457
  .or(np.filter_greater_than(300).and(np.filter_less_than(400)))
@@ -452,11 +487,13 @@ query7 = np.filter_greater_than(100).and(np.filter_less_than(200))
452
487
  }
453
488
  ```
454
489
 
455
- #### 3.5.5 Sort criteria
490
+ ##### 4.2.2.2 Sort criteria
491
+
456
492
  Sort criteria can be appended to an existing query object.
457
493
  If you don't use the previous filters, you can generate by `Query.new`.
458
494
 
459
495
  - sort criteria only
496
+
460
497
  ```Ruby
461
498
  query8 = Query.new.ascending tp
462
499
  query9 = Query.new.ascending letp
@@ -484,6 +521,7 @@ query12 = Query.new.ascending(tp).descending letp
484
521
  ```
485
522
 
486
523
  - filter with sort
524
+
487
525
  ```Ruby
488
526
  query13 = tp.filter_starts_with("A").ascending(tp)
489
527
 
@@ -494,134 +532,187 @@ query13 = tp.filter_starts_with("A").ascending(tp)
494
532
  [{"property" => "tp", "direction" => "ascending"}]
495
533
  ```
496
534
 
497
- ### 3.6 Access the database or page values and properties
535
+ #### 4.2.3 Update database
498
536
 
499
- Database or Page values can be accessed by [] access with keywords.
537
+ === under construction ===
500
538
 
501
- ```Ruby
502
- obj["icon"]
503
- ```
539
+ ### 4.3 List class
504
540
 
505
- Almost values returns a hash or an array object except "properties".
506
- `obj["properties"]` or `obj.properties` returns a PropertyCache object.
507
- The PropertyCache object is created from json information on the first access and is cached to the Page or Database object.
508
- If page or database object is generated by `.new` method, the object don't have json information.
509
- In this case, the `.properties` method calls `reload` method automatically, then it creates the PropertyCache object from the loaded json information (called auto-load function).
541
+ `db.query_database` and other API list results returns a List object.
542
+ The list object is an Enumerable object, so usually combines with `.each` method.
510
543
 
511
544
  ```Ruby
512
- obj["properties"]
513
- # or
514
- obj.properties
545
+ db.query_database(query).each do |page|
546
+ # exec some methods for a page object
547
+ end
515
548
  ```
516
549
 
517
- Each Property object is obtained by [] access with the property name.
518
- The Property object is also created on the first access and is cached to the PropertyCache object.
550
+ Notion API returns only the first page-size objects.
551
+ The default page-size of this library is 100.
552
+ Since the above `.each` method is supported for paging, it will automatically execute API call that obtain the following 100 objects when you used the first 100 objects.
553
+ Users do not have to worry about paging.
519
554
 
520
- ```Ruby
521
- np = obj.properties["NumberTitle"]
522
- ```
555
+ ### 4.4 Block class
523
556
 
524
- ## 3.7 Set icon (Database / Page)
557
+ === under construction ===
525
558
 
526
- Database or Page icon can update by `obj.set_icon` method.
527
- You can set icon as emoji or external url.
559
+ ### 4.5 Property classes
528
560
 
529
- ```Ruby
530
- obj.set_icon emoji: "💿" # set emoji
531
- obj.set_icon url: "https://cdn.profile-image.st-hatena.com/users/hkob/profile.png" # set external url
532
- ```
561
+ #### 4.5.1 How to obtain Property object
533
562
 
534
- ## 3.8 Update page property values
535
-
536
- Page properties can update in the following three ways.
563
+ There are the following 17 XXXProperty classes corresponding to Notion databases.
537
564
 
538
- ### 3.8.1 Assign property and update it (fastest: one API call only)
565
+ 1. TitleProperty
566
+ 2. RichTextProperty
567
+ 3. UrlProperty
568
+ 4. EmailProperty
569
+ 5. PhoneNumberProperty
570
+ 6. NumberProperty
571
+ 7. CheckboxProperty
572
+ 8. SelectProperty
573
+ 9. MultiSelectProperty
574
+ 10. PeopleProperty
575
+ 11. CreatedByProperty
576
+ 12. LastEditedByProperty
577
+ 13. DateProperty
578
+ 14. CreatedTimeProperty
579
+ 15. LastEditedTimeProperty
580
+ 16. FilesProperty
581
+ 17. FormulaProperty
539
582
 
540
- This is the fastest way using an empty Page object.
541
- `page.assign_property` generates an empty PropertyCache and an empty XXXProperty.
542
- After updating the property value, please call `page.update`.
543
- Notion API will be called using a JSON payload generated from the PropertyCache object.
583
+ They are child classes of a `Property` class and generated from Page or Database objects.
544
584
 
545
585
  ```Ruby
546
- page = Page.new id: page_id
547
- property = page.assign_property NumberProperty, "NumberTitle"
548
- property.number = 2022
549
- page.update # update page API call
550
- print page
551
- ```
586
+ page = Page.new page_id, assign: [XXXProperty, "property_name"]
587
+ # or
588
+ page = Page.find page_id
552
589
 
553
- ### 3.8.2 Update the loaded page (easy but slow: two API calls)
590
+ xp = page.properties["property_name"]
591
+ # or
592
+ xp, yp = page.properties.values_at "xp_name", "yp_name"
593
+ ```
554
594
 
555
- This is an easiest way using a loaded Page object.
556
- A PropertyCache object is automatically generated by `page.properties`.
557
- After updating the property value, please call `page.update`.
558
- Notion API will be called using a JSON payload generated from the PropertyCache object.
559
- There are two API calls (find and update).
595
+ #### 4.5.2 Query object generator of property objects
560
596
 
561
- ```Ruby
562
- page = Page.find first_page_id # retrieve page API call
563
- property = page.properties["NumberTitle"]
564
- property.number = 2022
565
- page.update # update page API call
566
- print page
567
- ```
597
+ The following methods for the Property objects generate a query object.
568
598
 
569
- ### 3.8.3 Update the unloaded page with auto-load (easy but slow: two API calls)
599
+ - TitleProperty, RichTextProperty, UrlProperty, EmailProperty, PhoneNumberProperty
600
+ - filter_equals(value)
601
+ - filter_does_not_equal(value)
602
+ - filter_contains(value)
603
+ - filter_does_not_contain(value)
604
+ - filter_starts_with(value)
605
+ - filter_ends_with(value)
606
+ - filter_is_empty
607
+ - filter_is_not_empty
608
+ - NumberProperty
609
+ - filter_equals(value)
610
+ - filter_does_not_equal(value)
611
+ - filter_greater_than(value)
612
+ - filter_less_than(value)
613
+ - filter_greater_than_or_equal_to(value)
614
+ - filter_less_than_or_equal_to(value)
615
+ - filter_is_empty
616
+ - filter_is_not_empty
617
+ - CheckboxProperty
618
+ - filter_equals(value)
619
+ - filter_does_not_equal(value)
620
+ - SelectProperty
621
+ - filter_equals(value)
622
+ - filter_does_not_equal(value)
623
+ - filter_is_empty
624
+ - filter_is_not_empty
625
+ - MultiSelectProperty, PeopleProperty, CreatedByProperty, LastEditedByProperty
626
+ - filter_contains(value)
627
+ - filter_does_not_contain(value)
628
+ - filter_is_empty
629
+ - filter_is_not_empty
630
+ - DateProperty, CreatedTimeProperty, LastEditedTimeProperty
631
+ - filter_equals(value(Date / Time / DateTime / String))
632
+ - filter_does_not_equal(value(Date / Time / DateTime / String))
633
+ - filter_before(value(Date / Time / DateTime / String))
634
+ - filter_after(value(Date / Time / DateTime / String))
635
+ - filter_on_or_before(value(Date / Time / DateTime / String))
636
+ - filter_on_or_after(value(Date / Time / DateTime / String))
637
+ - filter_past_week
638
+ - filter_past_month
639
+ - filter_past_year
640
+ - filter_next_week
641
+ - filter_next_month
642
+ - filter_next_year
643
+ - FilesProperty
644
+ - filter_is_empty
645
+ - filter_is_not_empty
646
+ - FormulaProperty
647
+ - filter_equals(value(Date / Time / DateTime / String))
648
+ - filter_does_not_equal(value(Date / Time / DateTime / String))
649
+ - filter_before(value(Date / Time / DateTime / String))
650
+ - filter_after(value(Date / Time / DateTime / String))
651
+ - filter_on_or_before(value(Date / Time / DateTime / String))
652
+ - filter_on_or_after(value(Date / Time / DateTime / String))
653
+ - filter_past_week
654
+ - filter_past_month
655
+ - filter_past_year
656
+ - filter_next_week
657
+ - filter_next_month
658
+ - filter_next_year
659
+ - filter_contains(value)
660
+ - filter_does_not_contain(value)
661
+ - filter_starts_with(value)
662
+ - filter_ends_with(value)
663
+ - filter_greater_than(value)
664
+ - filter_less_than(value)
665
+ - filter_greater_than_or_equal_to(value)
666
+ - filter_less_than_or_equal_to(value)
667
+ - filter_is_empty
668
+ - filter_is_not_empty
570
669
 
571
- This is also an easiest way using an auto-load function of the Page object.
572
- A PropertyCache object is automatically generated by `page.properties` using the auto-load function of page objects.
573
- After updating the property value, please call `page.update`.
574
- Notion API will be called using a JSON payload generated from the PropertyCache object.
575
- There are also two API calls (find and update).
670
+ #### 4.5.3 create or update values for Page properties
576
671
 
577
- ```Ruby
578
- page = Page.new id: first_page_id
579
- property = page.properties["NumberTitle"] # retrieve page API call (auto-load)
580
- property.number = 12345
581
- page.update # update page API call
582
- print page
583
- ```
672
+ Retrieving Page object has XXXProperties with values.
673
+ On the other hand, Assigned Page object has also XXXProperties, but they don't have any information for pages.
584
674
 
585
- ### 3.8.4 Explanation of how to update each property
675
+ XXXProperties can change property values by setter methods.
676
+ Since the setter method is different for each class, it will be explained separately.
586
677
 
587
- #### 3.8.4.1 NumberProperty
678
+ ##### 4.5.3.1 NumberProperty
588
679
 
589
680
  NumberProperty can set a number by `.number=`.
590
681
 
591
682
  ```Ruby
592
683
  np = page.properties["NumberTitle"]
593
- np.number = 456
594
- p np.create_json
595
- # Result => {"number" => 456}
684
+ np.number = 3.14
685
+ p np.property_values_json
686
+ # Result => => {"np"=>{"number"=>3.14, "type"=>"number"}}
596
687
  ```
597
688
 
598
- #### 3.8.4.2 SelectProperty
689
+ ##### 4.5.3.2 SelectProperty
599
690
 
600
691
  NumberProperty can set a select name by `.select=`.
601
692
 
602
693
  ```Ruby
603
694
  sp = page.properties["SelectTitle"]
604
695
  sp.select = "Select 2"
605
- p sp.create_json
606
- # Result => {"select" => {"name" => "Select 2"}}
696
+ p sp.property_values_json
697
+ # Result => {"sp"=>{"type"=>"select", "select"=>{"name"=>"Select 2"}}}
607
698
  ```
608
699
 
609
- #### 3.8.4.3 MultiSelectProperty
700
+ ##### 4.5.3.3 MultiSelectProperty
610
701
 
611
702
  MultiSelectProperty can set a select value or Array of select values by `.multi_select=`.
612
703
 
613
704
  ```Ruby
614
705
  msp = page.properties["MultiSelectTitle"]
615
- msp.select = "MS2"
616
- p msp.create_json
617
- # Result => {"multi_select" => [{"name" => "MS2"}]}
706
+ msp.multi_select = "MS2"
707
+ p msp.property_values_json
708
+ # Result => {"msp"=>{"type"=>"multi_select", "multi_select"=>[{"name"=>"MS2"}]}}
618
709
 
619
710
  msp.multi_select = %w[MS2 MS1]
620
- p msp.create_json
621
- # Result => {"multi_select" => [{"name" => "MS2"}, {"name" => "MS1"}]}
711
+ p msp.property_values_json
712
+ # Result => {"msp"=>{"type"=>"multi_select", "multi_select"=>[{"name"=>"MS2"}, {"name"=>"MS1"}]}}
622
713
  ```
623
714
 
624
- #### 3.8.4.4 DateProperty
715
+ ##### 4.5.3.4 DateProperty
625
716
 
626
717
  DateProperty can set a start_date or end_date by `.start_date=` or `end_date=`.
627
718
  Date, Time, DateTime or String object can be used to the argument.
@@ -629,48 +720,183 @@ Date, Time, DateTime or String object can be used to the argument.
629
720
  ```Ruby
630
721
  dp = page.properties["DateTitle"]
631
722
  dp.start_date = Date.new(2022, 2, 22)
632
- p dp.create_json
633
- # Result => {"start" => "2022-02-22"}
723
+ p dp.property_values_json
724
+ # Result => {"dp"=>{"type"=>"date", "date"=>{"start"=>"2022-02-22", "end"=>nil, "time_zone"=>nil}}}
634
725
 
635
726
  dp.start_date = Time.new(2022, 2, 22, 1, 23, 45, "+09:00")
636
- p dp.create_json
637
- # Result => {"start" => "2022-02-22T01:23:45+09:00"}
727
+ p dp.property_values_json
728
+ # Result =>{"dp"=>{"type"=>"date", "date"=>{"start"=>"2022-02-22T01:23:45+09:00", "end"=>nil, "time_zone"=>nil}}}
638
729
 
639
730
  dp.start_date = DateTime.new(2022, 2, 23, 1, 23, 45, "+09:00")
640
- p dp.create_json
641
- # Result => {"start" => "2022-02-23T01:23:45+09:00"}
731
+ p dp.property_values_json
732
+ # Result => {"dp"=>{"type"=>"date", "date"=>{"start"=>"2022-02-23T01:23:45+09:00", "end"=>nil, "time_zone"=>nil}}}
642
733
 
643
734
  dp.start_date = Date.new(2022, 2, 20)
644
735
  dp.end_date = Date.new(2022, 2, 22)
645
- p dp.create_json
646
- # Result => {"start" => "2022-02-20", "end" => "2022-02-22"}
736
+ p dp.property_values_json
737
+ # Result => => {"dp"=>{"type"=>"date", "date"=>{"start"=>"2022-02-20", "end"=>"2022-02-22", "time_zone"=>nil}}}
647
738
 
648
739
  dp.start_date = Time.new(2022, 2, 21, 1, 23, 45, "+09:00")
649
740
  dp.end_date = Time.new(2022, 2, 22, 1, 23, 45, "+09:00")
650
- p dp.create_json
741
+ p dp.property_values_json
651
742
  # Result => {"start" => "2022-02-21T01:23:45+09:00", "end" => "2022-02-22T01:23:45+09:00"}
652
743
 
653
744
  dp.start_date = DateTime.new(2022, 2, 21, 1, 23, 45, "+09:00")
654
745
  dp.end_date = DateTime.new(2022, 2, 22, 1, 23, 45, "+09:00")
655
- p dp.create_json
656
- # result => {"start" => "2022-02-21T01:23:45+09:00", "end" => "2022-02-22T01:23:45+09:00"}
746
+ p dp.property_values_json
747
+ # result => {"dp"=>{"type"=>"date", "date"=>{"start"=>"2022-02-21T01:23:45+09:00", "end"=>nil, "time_zone"=>nil}}}
657
748
  ```
658
749
 
659
- ### 3.9 Iteration of list object
750
+ ##### 4.5.3.4 UrlProperty
660
751
 
661
- Some methods like as `Database.query` return a list object.
662
- Since the list object also has a json array object, `Enumerable` module is implemented.
663
- Each iteration creates a Page or Block object and calls the block with it as an argument.
752
+ UrlProperty can set a url by `.url=`.
664
753
 
665
754
  ```Ruby
666
- pages = Database.query("c37a2c66-e3aa-4a0d-a447-73de3b80c253") # retrieves all pages
667
- pages.each do |page| # obj's class is Page or Block
668
- page.set_icon(emoji: "💿") unless page["icon"]
669
- end
755
+ up = page.properties["UrlTitle"]
756
+ up.url = "https://www.google.com/"
757
+ p up.property_values_json
758
+ # result => {"up"=>{"url"=>"https://www.google.com/", "type"=>"url"}}
759
+ ```
760
+
761
+ ##### 4.5.3.5 EmailProperty
762
+
763
+ EmailProperty can set an email by `.email=`.
764
+
765
+ ```Ruby
766
+ ep = page.properties["MailTitle"]
767
+ ep.email = "https://www.google.com/"
768
+ p ep.property_values_json
769
+ # result => {"ep"=>{"email"=>"hkobhkob@gmail.com", "type"=>"email"}}
670
770
  ```
671
771
 
672
- ## 4. ChangeLog
772
+ ##### 4.5.3.6 PhoneNumberProperty
773
+
774
+ PhoneNumberProperty can set an phone number by `.phone_number=`.
775
+
776
+ ```Ruby
777
+ pp = page.properties["TelTitle"]
778
+ pp.phone_number = "xx-xxxx-xxxx"
779
+ p pp.property_values_json
780
+ # result => {"pp"=>{"phone_number"=>"xx-xxxx-xxxx", "type"=>"phone_number"}}
781
+ ```
782
+
783
+ ##### 4.5.3.7 PeopleProperty
784
+
785
+ PeopleProperty can set an people by `.people=`.
786
+ PeopleProperty can set a user_id/UserObject value or Array of user_id/UserObject values by `.people=`.
787
+
788
+ ```Ruby
789
+ pp = page.properties["UserTitle"]
790
+ pp.people = "user_id1"
791
+ p pp.property_values_json
792
+ # result => {"pp"=>{"type"=>"people", "people"=>[{"object"=>"user", "id"=>"user_id1"}]}}
793
+
794
+ pp.people = UserObject.new json: user1_json
795
+ p pp.property_values_json
796
+ # result => {"pp"=>{"type"=>"people", "people"=>[{"object"=>"user", "id"=>"user_id1_from_json"}]}}
797
+ ```
798
+
799
+ ```Ruby
800
+ pp.people = %w[user_id2 user_id3]
801
+ p pp.property_values_json
802
+ # result => {"pp"=>{"type"=>"people", "people"=>[{"object"=>"user", "id"=>"user_id2"}, {"object"=>"user", "id"=>"user_id3"}]}}
803
+
804
+ u2 = UserObject.new(json: user2_json)
805
+ u3 = UserObject.new(json: user3_json)
806
+ pp.people = [u2, u3]
807
+ p pp.property_values_json
808
+ # result => {"pp"=>{"type"=>"people", "people"=>[{"object"=>"user", "id"=>"user_id2_from_json"}, {"object"=>"user", "id"=>"user_id3_from_json"}]}}
809
+ ```
810
+
811
+ ##### 4.5.3.8 TitleProperty, RichTextProperty
812
+
813
+ TextProperty's subclasses (TitleProperty, RichTextProperty) have an array of TextObject objects.
814
+ `[]` method returns an existing TextObject.
815
+ The obtained TextObject can be set text by `.text=`.
816
+
817
+ ```Ruby
818
+ pp = page.properties["Title"]
819
+ tp[0].text = "ABC\n"
820
+ p tp.property_values_json
821
+ # result => {"tp"=>{"type"=>"title", "title"=>[{"type"=>"text", "text"=>{"content"=>"ABC\n", "link"=>nil}, "plain_text"=>"ABC\n", "href"=>nil}]}}
822
+ ```
823
+
824
+ `<<` method appends a new TextObject or a String.
825
+ ```Ruby
826
+ to = TextObject.new "DEF"
827
+ to.bold = true
828
+ to.italic = true
829
+ to.strikethrough = true
830
+ to.underline = true
831
+ to.code = true
832
+ to.color = "default"
833
+ tp << to
834
+ p tp.property_values_json
835
+ # result => {"tp"=>{"type"=>"title","title"=>[{"type"=>"text","text"=>{"content"=>"ABC\n","link"=>nil},"plain_text"=>"ABC\n","href"=>nil},{"type"=>"text","text"=>{"content"=>"DEF","link"=>nil},"plain_text"=>"DEF","href"=>nil,"annotations"=>{"bold"=>true,"italic"=>true,"strikethrough"=>true,"underline"=>true,"code"=>true,"color"=>"default"}}]}}
836
+ ```
837
+
838
+ `delete_at(index)` method remove a TextObject at index.
839
+ ```Ruby
840
+ tp.delete_at 1
841
+ tp << "GHI"
842
+ p tp.property_values_json
843
+ # result => {"tp"=>{"type"=>"title", "title"=>[{"type"=>"text", "text"=>{"content"=>"ABC\n", "link"=>nil}, "plain_text"=>"ABC\n", "href"=>nil}, {"type"=>"text", "text"=>{"content"=>"DEF", "link"=>nil}, "plain_text"=>"DEF", "href"=>nil, "annotations"=>{"bold"=>true, "italic"=>true, "strikethrough"=>true, "underline"=>true, "code"=>true, "color"=>"default"}}, {"type"=>"text", "text"=>{"content"=>"GHI", "link"=>nil}, "plain_text"=>"GHI", "href"=>nil}]}}
844
+ ```
845
+
846
+ ##### 4.5.3.9 CheckboxProperty
847
+
848
+ PeopleProperty can set a boolean value by `.checkbox=`.
849
+ ```Ruby
850
+ cp = page.properties["CheckboxTitle"]
851
+ cp.checkbox = true
852
+ p cp.property_values_json
853
+ # result => {"cp"=>{"checkbox"=>true, "type"=>"checkbox"}}
854
+ ```
855
+
856
+ ##### 4.5.3.10 EmailProperty
857
+
858
+ EmailProperty can set an email address by `.email=`.
859
+ ```Ruby
860
+ ep = page.properties["MailTitle"]
861
+ ep.email = "hkobhkob@gmail.com"
862
+ p ep.property_values_json
863
+ # result => {"ep"=>{"email"=>"hkobhkob@gmail.com", "type"=>"email"}}
864
+ ```
865
+
866
+ ##### 4.5.3.11 FilesProperty
867
+
868
+ FilesProperty can set an external url or Array of external urls by `.files=`.
869
+
870
+ ```Ruby
871
+ fp = page.properties["FilesTitle"]
872
+ fp.files = "F1"
873
+ p fp.property_values_json
874
+ # Result => {"fp"=>{"files"=>[{"name"=>"F1", "type"=>"external", "external"=>{"url"=>"F1"}}], "type"=>"files"}}
875
+
876
+ fp.files = %w[F2 F3]
877
+ p fp.property_values_json
878
+ # Result => {"fp"=>{"files"=>[{"name"=>"F2", "type"=>"external", "external"=>{"url"=>"F2"}}, {"name"=>"F3", "type"=>"external", "external"=>{"url"=>"F3"}}], "type"=>"files"}}
879
+ ```
880
+
881
+ ##### 4.5.3.12 RelationProperty
882
+
883
+ RelationProperty can set an relation's page_id or Array of relation's page_ids by `.relation=`.
884
+
885
+ ```Ruby
886
+ rp = page.properties["RelationTitle"]
887
+ rp.relation = "R1"
888
+ p rp.property_values_json
889
+ # Result => {"rp"=>{"type"=>"relation", "relation"=>[{"id"=>"R1"}]}}
890
+
891
+ rp.relation = %w[R2 R3]
892
+ p rp.property_values_json
893
+ # Result => {"rp"=>{"type"=>"relation", "relation"=>[{"id"=>"R2"}, {"id"=>"R3"}]}}
894
+ ```
895
+
896
+
897
+ ## 6. ChangeLog
673
898
 
899
+ - 2022/3/14 Exclude notion-ruby-client, update Property values, update for Notion-Version 2022-02-22
674
900
  - 2022/2/25 add_property_for_update -> assign_property, update README.md
675
901
  - 2022/2/20 add support for MultiSelectProperty
676
902
  - 2022/2/19 add support for SelectProperty
@@ -681,18 +907,18 @@ end
681
907
  - 2022/2/13 added Page#set_icon
682
908
  - 2022/2/13 First commit
683
909
 
684
- ## 5. Contributing
910
+ ## 6. Contributing
685
911
 
686
- Bug reports and pull requests are welcome on GitHub at https://github.com/hkob/notion_ruby_mapping. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/notion_ruby_mapping/blob/main/CODE_OF_CONDUCT.md).
912
+ Bug reports and pull requests are welcome on GitHub at <https://github.com/hkob/notion_ruby_mapping>. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/notion_ruby_mapping/blob/main/CODE_OF_CONDUCT.md).
687
913
 
688
- ## 6. License
914
+ ## 7. License
689
915
 
690
916
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
691
917
 
692
- ## 7. Code of Conduct
918
+ ## 8. Code of Conduct
693
919
 
694
920
  Everyone interacting in the NotionRubyMapping project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/notion_ruby_mapping/blob/main/CODE_OF_CONDUCT.md).
695
921
 
696
- ## 8. Acknowledgements
922
+ ## 9. Acknowledgements
697
923
 
698
924
  The code depends on [notion-ruby-client](https://github.com/orbit-love/notion-ruby-client).