notion_ruby_mapping 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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).