notion_ruby_mapping 0.1.1 → 0.1.4
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.
- checksums.yaml +4 -4
- data/README.md +266 -80
- data/images/serial_number.png +0 -0
- data/lib/notion_ruby_mapping/base.rb +23 -4
- data/lib/notion_ruby_mapping/database.rb +6 -2
- data/lib/notion_ruby_mapping/date_base_property.rb +1 -1
- data/lib/notion_ruby_mapping/date_property.rb +37 -0
- data/lib/notion_ruby_mapping/multi_select_property.rb +20 -0
- data/lib/notion_ruby_mapping/notion_cache.rb +0 -1
- data/lib/notion_ruby_mapping/number_property.rb +7 -5
- data/lib/notion_ruby_mapping/page.rb +4 -6
- data/lib/notion_ruby_mapping/property.rb +15 -7
- data/lib/notion_ruby_mapping/select_property.rb +21 -1
- data/lib/notion_ruby_mapping/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5aef3ce3be5f734faf9803496c1196e715ad8513fbabc143abe43b4d4780a274
|
4
|
+
data.tar.gz: 1384fc70512cc6a396693fb7a37f8a80311bac85e26616a22ea8a5b3c491e28e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf783b7b53434fefb0f556a9f0fd17ca4dc4bac220e90bb609abf454a1e05ec0de37f4937998cd04fc34c037e87bea9ca3c454593a53a1a0de7998fea7009c9f
|
7
|
+
data.tar.gz: ea70aa30d1f9d082cab295320d79b4a975a67255fc61ce4956379e98ca4b4996093ac9e0b1c19e80815b233792be5ff5d29b50a49115d0d1e68461237dfefdfd
|
data/README.md
CHANGED
@@ -6,25 +6,41 @@ Development note is here. → [Idea note of "notion_ruby_mapping"](https://www.n
|
|
6
6
|
|
7
7
|
## Table of Contents
|
8
8
|
- [NotionRubyMapping](#notionrubymapping)
|
9
|
-
- [
|
10
|
-
- [
|
11
|
-
- [
|
12
|
-
|
13
|
-
- [Create
|
14
|
-
- [
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
- [
|
19
|
-
- [
|
20
|
-
- [
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
- [
|
25
|
-
- [
|
26
|
-
|
27
|
-
|
9
|
+
- [Table of Contents](#table-of-contents)
|
10
|
+
- [1. Installation](#1-installation)
|
11
|
+
- [2. Example code](#2-example-code)
|
12
|
+
- [3. Usage](#3-usage)
|
13
|
+
- [3.1 Create a New Integration](#31-create-a-new-integration)
|
14
|
+
- [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} -->
|
42
|
+
|
43
|
+
## 1. Installation
|
28
44
|
|
29
45
|
Add this line to your application's Gemfile:
|
30
46
|
|
@@ -40,7 +56,7 @@ Or install it yourself as:
|
|
40
56
|
|
41
57
|
$ gem install notion_ruby_mapping
|
42
58
|
|
43
|
-
## Example code
|
59
|
+
## 2. Example code
|
44
60
|
|
45
61
|
The following code sets a "💿" icon on all unset pages in the database.
|
46
62
|
```Ruby
|
@@ -58,6 +74,10 @@ Database.query(database_id).each do |page|
|
|
58
74
|
end
|
59
75
|
```
|
60
76
|
|
77
|
+
|Before execution|After execution|
|
78
|
+
|---|---|
|
79
|
+
|||
|
80
|
+
|
61
81
|
The following code sets serial numbers to the pages whose title is not empty in ascending order of titles.
|
62
82
|
```Ruby
|
63
83
|
tp = RichTextProperty.new("TextTitle")
|
@@ -65,52 +85,59 @@ Database.query(database_id, tp.filter_is_not_empty.ascending(tp)).each.with_inde
|
|
65
85
|
page.properties["NumberTitle"].number = index
|
66
86
|
page.update
|
67
87
|
end
|
68
|
-
|
69
88
|
```
|
89
|
+
| After execution |
|
90
|
+
|-----------------------------------------------|
|
91
|
+
|  |
|
70
92
|
|
71
|
-
|
72
|
-
|---|---|
|
73
|
-
|||
|
93
|
+
## 3. Usage
|
74
94
|
|
75
|
-
|
76
|
-
|
77
|
-
### Create a New Integration
|
95
|
+
### 3.1 Create a New Integration
|
78
96
|
|
79
97
|
Please check [Notion documentation](https://developers.notion.com/docs#getting-started).
|
80
98
|
|
81
|
-
### Create client
|
99
|
+
### 3.2 Create client
|
82
100
|
|
101
|
+
Please create a client (notion-ruby-client) before you use the following class.
|
83
102
|
```Ruby
|
84
103
|
NotionCache.instance.create_client ENV["NOTION_API_TOKEN"]
|
85
104
|
```
|
86
|
-
Please create a client (notion-ruby-client) before you use the following class.
|
87
105
|
|
88
|
-
###
|
106
|
+
### 3.3 Retrieve a database
|
107
|
+
|
108
|
+
Database.find(id) creates a Database object from the results of Notion API.
|
89
109
|
|
90
|
-
|
110
|
+
```Ruby
|
111
|
+
db = Database.find("c37a2c66-e3aa-4a0d-a447-73de3b80c253")
|
112
|
+
```
|
91
113
|
|
92
|
-
|
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.
|
93
116
|
|
94
117
|
```Ruby
|
95
|
-
|
96
|
-
|
118
|
+
db = Database.new("c37a2c66-e3aa-4a0d-a447-73de3b80c253")
|
119
|
+
db.reload
|
97
120
|
```
|
98
121
|
|
99
|
-
|
122
|
+
### 3.4 Retrieve a page
|
123
|
+
|
124
|
+
Page.find(id) creates a Page object from the results of Notion API.
|
100
125
|
|
101
126
|
```Ruby
|
102
|
-
|
103
|
-
obj["icon"] # same as obj.icon
|
104
|
-
obj.properties["NumberTitle"]
|
127
|
+
page = Page.find("c01166c6-13ae-45cb-b968-18b4ef2f5a77")
|
105
128
|
```
|
106
129
|
|
107
|
-
|
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.
|
108
132
|
|
109
|
-
- Retrieve a database
|
110
133
|
```Ruby
|
111
|
-
|
134
|
+
page = Page.new("c01166c6-13ae-45cb-b968-18b4ef2f5a77")
|
135
|
+
page.reload
|
112
136
|
```
|
113
|
-
|
137
|
+
|
138
|
+
### 3.5 Query a database
|
139
|
+
|
140
|
+
#### 3.5.1 A simple example
|
114
141
|
|
115
142
|
Gets a List object of Page objects contained in the database.
|
116
143
|
You can obtain filtered and ordered pages using Query object.
|
@@ -119,8 +146,6 @@ Database.query("c37a2c66-e3aa-4a0d-a447-73de3b80c253") # retrieves all pages
|
|
119
146
|
Database.query("c37a2c66-e3aa-4a0d-a447-73de3b80c253", query) # retrieves using query
|
120
147
|
```
|
121
148
|
|
122
|
-
#### Query class and related *Property class
|
123
|
-
|
124
149
|
Query object can be generated from the following Property objects.
|
125
150
|
For example, in order to obtain the pages whose title starts with "A" and ordered by ascending,
|
126
151
|
the following code can be used.
|
@@ -130,6 +155,35 @@ query = tp.filter_starts_with("A").ascending(tp)
|
|
130
155
|
pages = Database.query database_id, query
|
131
156
|
```
|
132
157
|
|
158
|
+
#### 3.5.2 Property classes
|
159
|
+
|
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
|
+
```Ruby
|
164
|
+
xp = XXXProperty.new "property name"
|
165
|
+
```
|
166
|
+
|
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
|
184
|
+
|
185
|
+
#### 3.5.3 Query object generator of property objects
|
186
|
+
|
133
187
|
The following methods for the Property objects generate a query object.
|
134
188
|
- TitleProperty, RichTextProperty, UrlProperty, EmailProperty, PhoneNumberProperty
|
135
189
|
- filter_equals(value)
|
@@ -202,16 +256,19 @@ The following methods for the Property objects generate a query object.
|
|
202
256
|
- filter_is_empty
|
203
257
|
- filter_is_not_empty
|
204
258
|
|
259
|
+
#### 3.5.4 Complex conditions
|
205
260
|
Complex filters can be generated `and` / `or` methods.
|
261
|
+
Here are some sample scripts and the json parameters created from them.
|
262
|
+
|
206
263
|
```Ruby
|
207
|
-
# Prepare sample properties
|
264
|
+
# Prepare some sample properties
|
208
265
|
tp = TitleProperty.new "tp"
|
209
266
|
np = NumberProperty.new "np"
|
210
267
|
cp = CheckboxProperty.new "cp"
|
211
268
|
letp = LastEditedTimeProperty.new "letp"
|
212
269
|
```
|
213
270
|
|
214
|
-
- (A and B) filter
|
271
|
+
- query1: (A and B) filter
|
215
272
|
```Ruby
|
216
273
|
query1 = tp.filter_starts_with("start")
|
217
274
|
.and(np.filter_greater_than(100))
|
@@ -231,7 +288,7 @@ query1 = tp.filter_starts_with("start")
|
|
231
288
|
}
|
232
289
|
```
|
233
290
|
|
234
|
-
- (A and B and C) filter
|
291
|
+
- query2: (A and B and C) filter
|
235
292
|
```Ruby
|
236
293
|
query2 = tp.filter_starts_with("start")
|
237
294
|
.and(np.filter_greater_than(100))
|
@@ -256,7 +313,7 @@ query2 = tp.filter_starts_with("start")
|
|
256
313
|
}
|
257
314
|
```
|
258
315
|
|
259
|
-
- (A or B) filter
|
316
|
+
- query3: (A or B) filter
|
260
317
|
```Ruby
|
261
318
|
query3 = tp.filter_starts_with("start")
|
262
319
|
.or(np.filter_greater_than(100))
|
@@ -276,7 +333,7 @@ query3 = tp.filter_starts_with("start")
|
|
276
333
|
}
|
277
334
|
```
|
278
335
|
|
279
|
-
- (A or B or C) filter
|
336
|
+
- query4: (A or B or C) filter
|
280
337
|
```Ruby
|
281
338
|
query4 = tp.filter_starts_with("start")
|
282
339
|
.or(np.filter_greater_than(100))
|
@@ -301,7 +358,7 @@ query4 = tp.filter_starts_with("start")
|
|
301
358
|
}
|
302
359
|
```
|
303
360
|
|
304
|
-
- ((A and B) or C) filter
|
361
|
+
- query5: ((A and B) or C) filter
|
305
362
|
```Ruby
|
306
363
|
query5 = tp.filter_starts_with("start")
|
307
364
|
.and(np.filter_greater_than(100))
|
@@ -330,7 +387,7 @@ query5 = tp.filter_starts_with("start")
|
|
330
387
|
}
|
331
388
|
```
|
332
389
|
|
333
|
-
- ((A or B) and C) filter
|
390
|
+
- query6: ((A or B) and C) filter
|
334
391
|
```Ruby
|
335
392
|
query6 = tp.filter_starts_with("start")
|
336
393
|
.or(np.filter_greater_than(100))
|
@@ -359,7 +416,7 @@ query6 = tp.filter_starts_with("start")
|
|
359
416
|
}
|
360
417
|
```
|
361
418
|
|
362
|
-
- ((A and B) or (C and D)) filter
|
419
|
+
- query7: ((A and B) or (C and D)) filter
|
363
420
|
```Ruby
|
364
421
|
query7 = np.filter_greater_than(100).and(np.filter_less_than(200))
|
365
422
|
.or(np.filter_greater_than(300).and(np.filter_less_than(400)))
|
@@ -395,7 +452,11 @@ query7 = np.filter_greater_than(100).and(np.filter_less_than(200))
|
|
395
452
|
}
|
396
453
|
```
|
397
454
|
|
398
|
-
|
455
|
+
#### 3.5.5 Sort criteria
|
456
|
+
Sort criteria can be appended to an existing query object.
|
457
|
+
If you don't use the previous filters, you can generate by `Query.new`.
|
458
|
+
|
459
|
+
- sort criteria only
|
399
460
|
```Ruby
|
400
461
|
query8 = Query.new.ascending tp
|
401
462
|
query9 = Query.new.ascending letp
|
@@ -427,86 +488,211 @@ query12 = Query.new.ascending(tp).descending letp
|
|
427
488
|
query13 = tp.filter_starts_with("A").ascending(tp)
|
428
489
|
|
429
490
|
# Result of query13.filter
|
430
|
-
{"property" => "tp", "title" => {"starts_with" => "start"}}
|
491
|
+
{"property" => "tp", "title" => {"starts_with" => "start"}}
|
431
492
|
|
432
493
|
# Result of query13.sort
|
433
494
|
[{"property" => "tp", "direction" => "ascending"}]
|
434
495
|
```
|
435
496
|
|
436
|
-
|
497
|
+
### 3.6 Access the database or page values and properties
|
498
|
+
|
499
|
+
Database or Page values can be accessed by [] access with keywords.
|
437
500
|
|
438
|
-
- Retrieve a page
|
439
501
|
```Ruby
|
440
|
-
|
502
|
+
obj["icon"]
|
441
503
|
```
|
442
504
|
|
443
|
-
|
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).
|
510
|
+
|
511
|
+
```Ruby
|
512
|
+
obj["properties"]
|
513
|
+
# or
|
514
|
+
obj.properties
|
515
|
+
```
|
516
|
+
|
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.
|
519
|
+
|
520
|
+
```Ruby
|
521
|
+
np = obj.properties["NumberTitle"]
|
522
|
+
```
|
523
|
+
|
524
|
+
## 3.7 Set icon (Database / Page)
|
525
|
+
|
526
|
+
Database or Page icon can update by `obj.set_icon` method.
|
527
|
+
You can set icon as emoji or external url.
|
528
|
+
|
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
|
+
```
|
533
|
+
|
534
|
+
## 3.8 Update page property values
|
444
535
|
|
445
536
|
Page properties can update in the following three ways.
|
446
537
|
|
447
|
-
|
538
|
+
### 3.8.1 Assign property and update it (fastest: one API call only)
|
539
|
+
|
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.
|
544
|
+
|
448
545
|
```Ruby
|
449
546
|
page = Page.new id: page_id
|
450
|
-
|
451
|
-
|
547
|
+
property = page.assign_property NumberProperty, "NumberTitle"
|
548
|
+
property.number = 2022
|
452
549
|
page.update # update page API call
|
453
550
|
print page
|
454
551
|
```
|
455
552
|
|
456
|
-
|
553
|
+
### 3.8.2 Update the loaded page (easy but slow: two API calls)
|
554
|
+
|
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).
|
560
|
+
|
457
561
|
```Ruby
|
458
562
|
page = Page.find first_page_id # retrieve page API call
|
459
|
-
page.properties["NumberTitle"]
|
563
|
+
property = page.properties["NumberTitle"]
|
564
|
+
property.number = 2022
|
460
565
|
page.update # update page API call
|
461
566
|
print page
|
462
567
|
```
|
463
568
|
|
464
|
-
|
569
|
+
### 3.8.3 Update the unloaded page with auto-load (easy but slow: two API calls)
|
570
|
+
|
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).
|
576
|
+
|
465
577
|
```Ruby
|
466
578
|
page = Page.new id: first_page_id
|
467
|
-
page.properties["NumberTitle"]
|
579
|
+
property = page.properties["NumberTitle"] # retrieve page API call (auto-load)
|
580
|
+
property.number = 12345
|
468
581
|
page.update # update page API call
|
469
582
|
print page
|
470
583
|
```
|
471
584
|
|
472
|
-
|
585
|
+
### 3.8.4 Explanation of how to update each property
|
586
|
+
|
587
|
+
#### 3.8.4.1 NumberProperty
|
588
|
+
|
589
|
+
NumberProperty can set a number by `.number=`.
|
590
|
+
|
591
|
+
```Ruby
|
592
|
+
np = page.properties["NumberTitle"]
|
593
|
+
np.number = 456
|
594
|
+
p np.create_json
|
595
|
+
# Result => {"number" => 456}
|
596
|
+
```
|
597
|
+
|
598
|
+
#### 3.8.4.2 SelectProperty
|
599
|
+
|
600
|
+
NumberProperty can set a select name by `.select=`.
|
601
|
+
|
473
602
|
```Ruby
|
474
|
-
|
603
|
+
sp = page.properties["SelectTitle"]
|
604
|
+
sp.select = "Select 2"
|
605
|
+
p sp.create_json
|
606
|
+
# Result => {"select" => {"name" => "Select 2"}}
|
475
607
|
```
|
476
608
|
|
477
|
-
####
|
609
|
+
#### 3.8.4.3 MultiSelectProperty
|
610
|
+
|
611
|
+
MultiSelectProperty can set a select value or Array of select values by `.multi_select=`.
|
478
612
|
|
479
|
-
- access for each components
|
480
613
|
```Ruby
|
481
|
-
|
482
|
-
|
483
|
-
|
614
|
+
msp = page.properties["MultiSelectTitle"]
|
615
|
+
msp.select = "MS2"
|
616
|
+
p msp.create_json
|
617
|
+
# Result => {"multi_select" => [{"name" => "MS2"}]}
|
618
|
+
|
619
|
+
msp.multi_select = %w[MS2 MS1]
|
620
|
+
p msp.create_json
|
621
|
+
# Result => {"multi_select" => [{"name" => "MS2"}, {"name" => "MS1"}]}
|
622
|
+
```
|
623
|
+
|
624
|
+
#### 3.8.4.4 DateProperty
|
625
|
+
|
626
|
+
DateProperty can set a start_date or end_date by `.start_date=` or `end_date=`.
|
627
|
+
Date, Time, DateTime or String object can be used to the argument.
|
628
|
+
|
629
|
+
```Ruby
|
630
|
+
dp = page.properties["DateTitle"]
|
631
|
+
dp.start_date = Date.new(2022, 2, 22)
|
632
|
+
p dp.create_json
|
633
|
+
# Result => {"start" => "2022-02-22"}
|
634
|
+
|
635
|
+
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"}
|
638
|
+
|
639
|
+
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"}
|
642
|
+
|
643
|
+
dp.start_date = Date.new(2022, 2, 20)
|
644
|
+
dp.end_date = Date.new(2022, 2, 22)
|
645
|
+
p dp.create_json
|
646
|
+
# Result => {"start" => "2022-02-20", "end" => "2022-02-22"}
|
647
|
+
|
648
|
+
dp.start_date = Time.new(2022, 2, 21, 1, 23, 45, "+09:00")
|
649
|
+
dp.end_date = Time.new(2022, 2, 22, 1, 23, 45, "+09:00")
|
650
|
+
p dp.create_json
|
651
|
+
# Result => {"start" => "2022-02-21T01:23:45+09:00", "end" => "2022-02-22T01:23:45+09:00"}
|
652
|
+
|
653
|
+
dp.start_date = DateTime.new(2022, 2, 21, 1, 23, 45, "+09:00")
|
654
|
+
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"}
|
484
657
|
```
|
485
658
|
|
486
|
-
|
659
|
+
### 3.9 Iteration of list object
|
487
660
|
|
488
|
-
|
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.
|
489
664
|
|
490
|
-
|
665
|
+
```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
|
670
|
+
```
|
491
671
|
|
672
|
+
## 4. ChangeLog
|
673
|
+
|
674
|
+
- 2022/2/25 add_property_for_update -> assign_property, update README.md
|
675
|
+
- 2022/2/20 add support for MultiSelectProperty
|
676
|
+
- 2022/2/19 add support for SelectProperty
|
677
|
+
- 2022/2/17 added Page#properties, Page#add_property_for_update, Page#update
|
492
678
|
- 2022/2/17 added Page#properties, Page#add_property_for_update, Page#update
|
493
679
|
- 2022/2/16 added PropertyCache and Payload class
|
494
680
|
- 2022/2/14 added Database#set_icon
|
495
681
|
- 2022/2/13 added Page#set_icon
|
496
682
|
- 2022/2/13 First commit
|
497
683
|
|
498
|
-
## Contributing
|
684
|
+
## 5. Contributing
|
499
685
|
|
500
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).
|
501
687
|
|
502
|
-
## License
|
688
|
+
## 6. License
|
503
689
|
|
504
690
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
505
691
|
|
506
|
-
## Code of Conduct
|
692
|
+
## 7. Code of Conduct
|
507
693
|
|
508
694
|
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).
|
509
695
|
|
510
|
-
## Acknowledgements
|
696
|
+
## 8. Acknowledgements
|
511
697
|
|
512
|
-
The code depends on [notion-ruby-client](https://github.com/orbit-love/notion-ruby-client).
|
698
|
+
The code depends on [notion-ruby-client](https://github.com/orbit-love/notion-ruby-client).
|
Binary file
|
@@ -40,12 +40,18 @@ module NotionRubyMapping
|
|
40
40
|
unless @json
|
41
41
|
return nil if @id.nil?
|
42
42
|
|
43
|
-
|
43
|
+
reload
|
44
44
|
end
|
45
45
|
@property_cache = PropertyCache.new json_properties
|
46
46
|
end
|
47
47
|
@property_cache
|
48
|
-
|
48
|
+
end
|
49
|
+
|
50
|
+
# @return [NotionRubyMapping::Base] reloaded self
|
51
|
+
def reload
|
52
|
+
update_json reload_json
|
53
|
+
self
|
54
|
+
end
|
49
55
|
|
50
56
|
# @return [Hash] json properties
|
51
57
|
def json_properties
|
@@ -85,7 +91,7 @@ module NotionRubyMapping
|
|
85
91
|
end
|
86
92
|
self
|
87
93
|
end
|
88
|
-
|
94
|
+
|
89
95
|
# @param [String] key
|
90
96
|
# @return [NotionRubyMapping::PropertyCache, Hash] obtained Page value or PropertyCache
|
91
97
|
def [](key)
|
@@ -110,10 +116,23 @@ module NotionRubyMapping
|
|
110
116
|
# @param [Property] property Property object for udpate or create
|
111
117
|
# @return [NotionRubyMapping::Base]
|
112
118
|
def add_property_for_update(property)
|
113
|
-
|
119
|
+
@property_cache ||= PropertyCache.new {}
|
120
|
+
@property_cache.add_property property, will_update: true
|
114
121
|
self
|
115
122
|
end
|
116
123
|
|
124
|
+
# @param [Class] klass
|
125
|
+
# @param [String] title
|
126
|
+
# @return [Property] generated property
|
127
|
+
def assign_property(klass, title)
|
128
|
+
@property_cache ||= PropertyCache.new {}
|
129
|
+
|
130
|
+
property = klass.new(title)
|
131
|
+
property.will_update = true
|
132
|
+
@property_cache.add_property property
|
133
|
+
property
|
134
|
+
end
|
135
|
+
|
117
136
|
# @return [Hash] created json
|
118
137
|
def create_json
|
119
138
|
payload.create_json @property_cache&.create_json
|
@@ -17,8 +17,12 @@ module NotionRubyMapping
|
|
17
17
|
# @param [String] id database_id (with or without "-")
|
18
18
|
# @param [Payload] payload
|
19
19
|
def update
|
20
|
-
update_json @nc.update_database
|
20
|
+
update_json @nc.update_database(@id, create_json)
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return [Hash]
|
24
|
+
def reload_json
|
25
|
+
@nc.database_json @id
|
21
26
|
end
|
22
27
|
end
|
23
28
|
end
|
24
|
-
|
@@ -7,7 +7,7 @@ module NotionRubyMapping
|
|
7
7
|
class DateBaseProperty < Property
|
8
8
|
include IsEmptyIsNotEmpty
|
9
9
|
|
10
|
-
# @param [Date, Time, DateTime, String] obj
|
10
|
+
# @param [Date, Time, DateTime, String, nil] obj
|
11
11
|
# @return [String] iso8601 format string
|
12
12
|
def value_str(obj)
|
13
13
|
case obj
|
@@ -3,5 +3,42 @@
|
|
3
3
|
module NotionRubyMapping
|
4
4
|
class DateProperty < DateBaseProperty
|
5
5
|
TYPE = "date"
|
6
|
+
|
7
|
+
# @param [String] name
|
8
|
+
# @param [Hash] json
|
9
|
+
# @param [Array] multi_select
|
10
|
+
def initialize(name, json: nil, start_date: nil, end_date: nil, time_zone: nil)
|
11
|
+
super(name, json: json)
|
12
|
+
@end_date = end_date
|
13
|
+
@start_date = start_date || end_date
|
14
|
+
@time_zone = time_zone
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Hash] created json
|
18
|
+
def create_json
|
19
|
+
if @end_date
|
20
|
+
{"date" => {"start" => value_str(@start_date || @end_date), "end" => value_str(@end_date)}}
|
21
|
+
elsif @start_date
|
22
|
+
{"date" => {"start" => value_str(@start_date)}}
|
23
|
+
else
|
24
|
+
{"date" => @json || {}}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# @param [Hash] multi_select
|
29
|
+
# @return [Array, nil] settled array
|
30
|
+
def start_date=(start_date)
|
31
|
+
@will_update = true
|
32
|
+
@start_date = start_date
|
33
|
+
@end_date = nil if @start_date.class != @end_date.class || @start_date > @end_date
|
34
|
+
end
|
35
|
+
|
36
|
+
# @param [Hash] multi_select
|
37
|
+
# @return [Array, nil] settled array
|
38
|
+
def end_date=(end_date)
|
39
|
+
@will_update = true
|
40
|
+
@end_date = end_date
|
41
|
+
@end_date = nil if @start_date.class != @end_date.class || @start_date > @end_date
|
42
|
+
end
|
6
43
|
end
|
7
44
|
end
|
@@ -4,5 +4,25 @@ module NotionRubyMapping
|
|
4
4
|
# MultiSelect property
|
5
5
|
class MultiSelectProperty < MultiProperty
|
6
6
|
TYPE = "multi_select"
|
7
|
+
|
8
|
+
# @param [String] name
|
9
|
+
# @param [Hash] json
|
10
|
+
# @param [Array] multi_select
|
11
|
+
def initialize(name, json: nil, multi_select: nil)
|
12
|
+
super(name, json: json)
|
13
|
+
@multi_select = multi_select ? Array(multi_select) : nil
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [Hash] created json
|
17
|
+
def create_json
|
18
|
+
{"multi_select" => @multi_select ? (@multi_select.map { |v| {"name" => v} }) : @json} || {}
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param [Hash] multi_select
|
22
|
+
# @return [Array, nil] settled array
|
23
|
+
def multi_select=(multi_select)
|
24
|
+
@will_update = true
|
25
|
+
@multi_select = multi_select ? Array(multi_select) : nil
|
26
|
+
end
|
7
27
|
end
|
8
28
|
end
|
@@ -9,15 +9,17 @@ module NotionRubyMapping
|
|
9
9
|
TYPE = "number"
|
10
10
|
|
11
11
|
# @param [String] name Property name
|
12
|
-
# @param [
|
13
|
-
# @param [
|
14
|
-
def initialize(name, number: nil)
|
15
|
-
super(name)
|
12
|
+
# @param [Hash] json
|
13
|
+
# @param [Float] number Number value (optional)
|
14
|
+
def initialize(name, json: nil, number: nil)
|
15
|
+
super(name, json: json)
|
16
16
|
@number = number
|
17
17
|
end
|
18
|
+
attr_reader :number
|
18
19
|
|
20
|
+
# @return [Hash]
|
19
21
|
def create_json
|
20
|
-
{"
|
22
|
+
{"number" => @number || @json}
|
21
23
|
end
|
22
24
|
|
23
25
|
def number=(n)
|
@@ -3,18 +3,16 @@
|
|
3
3
|
module NotionRubyMapping
|
4
4
|
# Notion page object
|
5
5
|
class Page < Base
|
6
|
-
def self.find(
|
7
|
-
NotionCache.instance.page
|
6
|
+
def self.find(id)
|
7
|
+
NotionCache.instance.page id
|
8
8
|
end
|
9
9
|
|
10
|
-
# @param [String] id page_id (with or without "-")
|
11
|
-
# @param [Payload] payload
|
12
10
|
def update
|
13
11
|
update_json @nc.update_page(@id, create_json)
|
14
12
|
end
|
15
|
-
|
13
|
+
|
16
14
|
# @return [Hash]
|
17
|
-
def
|
15
|
+
def reload_json
|
18
16
|
@nc.page_json @id
|
19
17
|
end
|
20
18
|
end
|
@@ -4,10 +4,12 @@ module NotionRubyMapping
|
|
4
4
|
# abstract class for property
|
5
5
|
class Property
|
6
6
|
# @param [String] name Property name
|
7
|
+
# @param [Hash] json
|
7
8
|
# @return [Property] generated Property object
|
8
|
-
def initialize(name)
|
9
|
+
def initialize(name, json: nil)
|
9
10
|
@name = name
|
10
11
|
@will_update = false
|
12
|
+
@json = json
|
11
13
|
end
|
12
14
|
attr_reader :name
|
13
15
|
attr_accessor :will_update
|
@@ -25,12 +27,18 @@ module NotionRubyMapping
|
|
25
27
|
end
|
26
28
|
|
27
29
|
# @param [String] key
|
28
|
-
# @param [Hash]
|
29
|
-
# @return [NotionRubyMapping::
|
30
|
-
def self.create_from_json(key,
|
31
|
-
|
32
|
-
|
33
|
-
NumberProperty.new key,
|
30
|
+
# @param [Hash] input_json
|
31
|
+
# @return [NotionRubyMapping::Property, nil] generated Property object
|
32
|
+
def self.create_from_json(key, input_json)
|
33
|
+
keys = input_json.keys
|
34
|
+
if keys.include? "number"
|
35
|
+
NumberProperty.new key, json: input_json["number"]
|
36
|
+
elsif keys.include? "select"
|
37
|
+
SelectProperty.new key, json: input_json["select"]
|
38
|
+
elsif keys.include? "multi_select"
|
39
|
+
MultiSelectProperty.new key, json: input_json["multi_select"]
|
40
|
+
elsif keys.include? "date"
|
41
|
+
DateProperty.new key, json: input_json["date"]
|
34
42
|
else
|
35
43
|
nil
|
36
44
|
end
|
@@ -6,5 +6,25 @@ module NotionRubyMapping
|
|
6
6
|
include EqualsDoesNotEqual
|
7
7
|
include IsEmptyIsNotEmpty
|
8
8
|
TYPE = "select"
|
9
|
+
|
10
|
+
# @param [String] name Property name
|
11
|
+
# @param [Hash] json
|
12
|
+
# @param [String] select String value (optional)
|
13
|
+
def initialize(name, json: nil, select: nil)
|
14
|
+
super(name, json: json)
|
15
|
+
@select = select
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Hash]
|
19
|
+
def create_json
|
20
|
+
{"select" => @select ? {"name" => @select} : @json} || {}
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param [String] select
|
24
|
+
# @return [String] settled value
|
25
|
+
def select=(select)
|
26
|
+
@will_update = true
|
27
|
+
@select = select
|
28
|
+
end
|
9
29
|
end
|
10
|
-
end
|
30
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: notion_ruby_mapping
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroyuki KOBAYASHI
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-02-
|
11
|
+
date: 2022-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: notion-ruby-client
|
@@ -115,6 +115,7 @@ files:
|
|
115
115
|
- env.yml.sample
|
116
116
|
- images/post_set_icon.png
|
117
117
|
- images/pre_set_icon.png
|
118
|
+
- images/serial_number.png
|
118
119
|
- lib/notion_ruby_mapping.rb
|
119
120
|
- lib/notion_ruby_mapping/base.rb
|
120
121
|
- lib/notion_ruby_mapping/block.rb
|