notion_ruby_mapping 0.3.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +44 -1237
- data/env.yml.sample +0 -13
- data/examples/change_title.md +1 -1
- data/examples/renumbering_pages.md +3 -3
- data/examples/set_icon_to_all_icon_unsettled_pages.md +4 -4
- data/lib/notion_ruby_mapping/{base.rb → blocks/base.rb} +163 -92
- data/lib/notion_ruby_mapping/blocks/block.rb +145 -0
- data/lib/notion_ruby_mapping/blocks/bookmark_block.rb +11 -0
- data/lib/notion_ruby_mapping/blocks/breadcrumb_block.rb +19 -0
- data/lib/notion_ruby_mapping/blocks/bulleted_list_item_block.rb +11 -0
- data/lib/notion_ruby_mapping/blocks/callout_block.rb +82 -0
- data/lib/notion_ruby_mapping/blocks/child_base_block.rb +21 -0
- data/lib/notion_ruby_mapping/blocks/child_database_block.rb +11 -0
- data/lib/notion_ruby_mapping/blocks/child_page_block.rb +11 -0
- data/lib/notion_ruby_mapping/blocks/code_block.rb +50 -0
- data/lib/notion_ruby_mapping/blocks/column_block.rb +29 -0
- data/lib/notion_ruby_mapping/blocks/column_list_block.rb +33 -0
- data/lib/notion_ruby_mapping/{database.rb → blocks/database.rb} +41 -8
- data/lib/notion_ruby_mapping/blocks/divider_block.rb +19 -0
- data/lib/notion_ruby_mapping/blocks/embed_block.rb +11 -0
- data/lib/notion_ruby_mapping/blocks/equation_block.rb +43 -0
- data/lib/notion_ruby_mapping/blocks/file_base_block.rb +50 -0
- data/lib/notion_ruby_mapping/blocks/file_block.rb +11 -0
- data/lib/notion_ruby_mapping/blocks/heading1_block.rb +18 -0
- data/lib/notion_ruby_mapping/blocks/heading2_block.rb +18 -0
- data/lib/notion_ruby_mapping/blocks/heading3_block.rb +18 -0
- data/lib/notion_ruby_mapping/blocks/image_block.rb +11 -0
- data/lib/notion_ruby_mapping/blocks/link_preview_block.rb +16 -0
- data/lib/notion_ruby_mapping/blocks/link_to_page_block.rb +40 -0
- data/lib/notion_ruby_mapping/{list.rb → blocks/list.rb} +37 -6
- data/lib/notion_ruby_mapping/blocks/numbered_list_item_block.rb +11 -0
- data/lib/notion_ruby_mapping/blocks/page.rb +77 -0
- data/lib/notion_ruby_mapping/blocks/paragraph_block.rb +11 -0
- data/lib/notion_ruby_mapping/{block.rb → blocks/pdf_block.rb} +4 -3
- data/lib/notion_ruby_mapping/blocks/quote_block.rb +11 -0
- data/lib/notion_ruby_mapping/blocks/synced_block.rb +44 -0
- data/lib/notion_ruby_mapping/blocks/table_block.rb +50 -0
- data/lib/notion_ruby_mapping/blocks/table_of_contents_block.rb +34 -0
- data/lib/notion_ruby_mapping/blocks/table_row_block.rb +34 -0
- data/lib/notion_ruby_mapping/blocks/template_block.rb +34 -0
- data/lib/notion_ruby_mapping/blocks/text_sub_block_color_base_block.rb +45 -0
- data/lib/notion_ruby_mapping/blocks/to_do_block.rb +42 -0
- data/lib/notion_ruby_mapping/blocks/toggle_block.rb +11 -0
- data/lib/notion_ruby_mapping/blocks/toggle_heading1_block.rb +11 -0
- data/lib/notion_ruby_mapping/blocks/toggle_heading2_block.rb +11 -0
- data/lib/notion_ruby_mapping/blocks/toggle_heading3_block.rb +11 -0
- data/lib/notion_ruby_mapping/blocks/url_base_block.rb +34 -0
- data/lib/notion_ruby_mapping/blocks/url_caption_base_block.rb +46 -0
- data/lib/notion_ruby_mapping/blocks/video_block.rb +11 -0
- data/lib/notion_ruby_mapping/{notion_cache.rb → controllers/notion_cache.rb} +144 -102
- data/lib/notion_ruby_mapping/{payload.rb → controllers/payload.rb} +32 -18
- data/lib/notion_ruby_mapping/{property_cache.rb → controllers/property_cache.rb} +21 -20
- data/lib/notion_ruby_mapping/{query.rb → controllers/query.rb} +27 -19
- data/lib/notion_ruby_mapping/{rich_text_array.rb → controllers/rich_text_array.rb} +39 -17
- data/lib/notion_ruby_mapping/objects/emoji_object.rb +40 -0
- data/lib/notion_ruby_mapping/objects/equation_object.rb +43 -0
- data/lib/notion_ruby_mapping/objects/file_object.rb +60 -0
- data/lib/notion_ruby_mapping/{mention_object.rb → objects/mention_object.rb} +11 -0
- data/lib/notion_ruby_mapping/{rich_text_object.rb → objects/rich_text_object.rb} +12 -4
- data/lib/notion_ruby_mapping/{text_object.rb → objects/text_object.rb} +0 -1
- data/lib/notion_ruby_mapping/{user_object.rb → objects/user_object.rb} +9 -4
- data/lib/notion_ruby_mapping/{checkbox_property.rb → properties/checkbox_property.rb} +3 -0
- data/lib/notion_ruby_mapping/{created_by_property.rb → properties/created_by_property.rb} +1 -0
- data/lib/notion_ruby_mapping/{created_time_property.rb → properties/created_time_property.rb} +1 -0
- data/lib/notion_ruby_mapping/properties/date_base_property.rb +135 -0
- data/lib/notion_ruby_mapping/{date_property.rb → properties/date_property.rb} +13 -0
- data/lib/notion_ruby_mapping/{email_property.rb → properties/email_property.rb} +2 -2
- data/lib/notion_ruby_mapping/{files_property.rb → properties/files_property.rb} +26 -13
- data/lib/notion_ruby_mapping/{formula_property.rb → properties/formula_property.rb} +5 -1
- data/lib/notion_ruby_mapping/{last_edited_by_property.rb → properties/last_edited_by_property.rb} +1 -0
- data/lib/notion_ruby_mapping/{last_edited_time_property.rb → properties/last_edited_time_property.rb} +1 -0
- data/lib/notion_ruby_mapping/{multi_property.rb → properties/multi_property.rb} +0 -0
- data/lib/notion_ruby_mapping/{multi_select_property.rb → properties/multi_select_property.rb} +4 -3
- data/lib/notion_ruby_mapping/{number_property.rb → properties/number_property.rb} +4 -0
- data/lib/notion_ruby_mapping/{people_property.rb → properties/people_property.rb} +8 -3
- data/lib/notion_ruby_mapping/{phone_number_property.rb → properties/phone_number_property.rb} +4 -1
- data/lib/notion_ruby_mapping/{property.rb → properties/property.rb} +33 -0
- data/lib/notion_ruby_mapping/{relation_property.rb → properties/relation_property.rb} +30 -10
- data/lib/notion_ruby_mapping/{rich_text_property.rb → properties/rich_text_property.rb} +0 -0
- data/lib/notion_ruby_mapping/{rollup_property.rb → properties/rollup_property.rb} +7 -0
- data/lib/notion_ruby_mapping/{select_property.rb → properties/select_property.rb} +8 -2
- data/lib/notion_ruby_mapping/{text_property.rb → properties/text_property.rb} +0 -0
- data/lib/notion_ruby_mapping/{title_property.rb → properties/title_property.rb} +0 -0
- data/lib/notion_ruby_mapping/{url_property.rb → properties/url_property.rb} +4 -1
- data/lib/notion_ruby_mapping/version.rb +1 -1
- data/lib/notion_ruby_mapping.rb +21 -7
- metadata +82 -40
- data/lib/notion_ruby_mapping/date_base_property.rb +0 -75
- data/lib/notion_ruby_mapping/page.rb +0 -50
data/env.yml.sample
CHANGED
@@ -1,15 +1,2 @@
|
|
1
1
|
---
|
2
2
|
notion_token: "secret_XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
|
3
|
-
top_page: "c01166c613ae45cbb96818b4ef2f5a77"
|
4
|
-
unpermitted_page: "4a6eb31244204fecb488da11f3caf871"
|
5
|
-
database: "c37a2c66e3aa4a0da44773de3b80c253"
|
6
|
-
unpermitted_database: "668d797c76fa49349b05ad288df2d136"
|
7
|
-
h1block: "0250fb6d600142eca4c74efb8794fc6b"
|
8
|
-
unpermitted_block: "0c940186ab704351bb342d16f0635d49"
|
9
|
-
db_first_page: "dcdc805c85fa4155a55c20fc28771af7"
|
10
|
-
db_second_page: "6601e719a39a460c908e8909467fcccf"
|
11
|
-
db_update_page: "206ffaa277744a99baf593e28730240c"
|
12
|
-
user_hkob: "2200a911-6a96-44bb-bd38-6bfb1e01b9f6"
|
13
|
-
parent1_page: "860753bb6d1f48de96211fa6e0e31f82"
|
14
|
-
parent_database: "1d6b1040a9fb48d99a3d041429816e9f"
|
15
|
-
created_database: "c7697137d49f49c2bbcdd6a665c4f921"
|
data/examples/change_title.md
CHANGED
@@ -12,9 +12,9 @@ db.query_database(tp.filter_is_not_empty.ascending(tp)).each.with_index(1) do |p
|
|
12
12
|
end
|
13
13
|
```
|
14
14
|
|
15
|
-
| After execution
|
16
|
-
|
15
|
+
| After execution |
|
16
|
+
|--------------------------------------------------|
|
17
17
|
| ![After exuecution](../images/serial_number.png) |
|
18
18
|
|
19
19
|
---
|
20
|
-
[Return to README.md](../README.md
|
20
|
+
[Return to README.md](../README.md)
|
@@ -22,9 +22,9 @@ db.query_database.each do |page|
|
|
22
22
|
end
|
23
23
|
```
|
24
24
|
|
25
|
-
|Before execution|After execution|
|
26
|
-
|
27
|
-
|
25
|
+
| Before execution | After execution |
|
26
|
+
|-------------------------------------------------|-------------------------------------------------|
|
27
|
+
| ![Before execution](../images/pre_set_icon.png) | ![After execution](../images/post_set_icon.png) |
|
28
28
|
|
29
29
|
---
|
30
|
-
[Return to README.md](../README.md
|
30
|
+
[Return to README.md](../README.md)
|
@@ -2,20 +2,21 @@
|
|
2
2
|
|
3
3
|
module NotionRubyMapping
|
4
4
|
# Notion Base object (Parent of Page / Database / List)
|
5
|
+
# The Public API method has a link to the API references.
|
5
6
|
class Base
|
6
|
-
#### Public announced methods
|
7
|
-
|
8
7
|
# @param [Hash, nil] json
|
9
8
|
# @param [String, nil] id
|
10
9
|
# @param [Array<Property, Class, String>] assign
|
11
10
|
def initialize(json: nil, id: nil, assign: [], parent: nil)
|
12
11
|
@nc = NotionCache.instance
|
13
12
|
@json = json
|
14
|
-
@id = @nc.hex_id(id || json && @json["id"])
|
13
|
+
@id = @nc.hex_id(id || @json && @json["id"])
|
14
|
+
@archived = @json && @json["archived"]
|
15
|
+
@has_children = @json && @json["has_children"]
|
15
16
|
@new_record = true unless parent.nil?
|
16
|
-
raise StandardError, "Unknown id" if !is_a?(List) && @id.nil? && parent.nil?
|
17
|
+
raise StandardError, "Unknown id" if !is_a?(List) && !is_a?(Block) && @id.nil? && parent.nil?
|
17
18
|
|
18
|
-
@payload = Payload.new(parent && {"parent" => parent})
|
19
|
+
@payload = Payload.new(!is_a?(Block) && parent && {"parent" => parent})
|
19
20
|
@property_cache = nil
|
20
21
|
@created_time = nil
|
21
22
|
@last_edited_time = nil
|
@@ -26,9 +27,40 @@ module NotionRubyMapping
|
|
26
27
|
end
|
27
28
|
attr_reader :json, :id
|
28
29
|
|
30
|
+
# @param [Hash, Notion::Messages] json
|
31
|
+
# @return [NotionRubyMapping::Base]
|
32
|
+
def self.create_from_json(json)
|
33
|
+
case json["object"]
|
34
|
+
when "page"
|
35
|
+
Page.new json: json
|
36
|
+
when "database"
|
37
|
+
Database.new json: json
|
38
|
+
when "list"
|
39
|
+
List.new json: json
|
40
|
+
when "block"
|
41
|
+
Block.decode_block json
|
42
|
+
else
|
43
|
+
raise StandardError, json.inspect
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# @param [Object] method
|
48
|
+
# @param [Object] path
|
49
|
+
# @param [nil] json
|
50
|
+
def self.dry_run_script(method, path, json = nil)
|
51
|
+
shell = [
|
52
|
+
"#!/bin/sh\ncurl #{method == :get ? "" : "-X #{method.to_s.upcase}"} 'https://api.notion.com/#{path}'",
|
53
|
+
" -H 'Notion-Version: 2022-02-22'",
|
54
|
+
" -H 'Authorization: Bearer '\"$NOTION_API_KEY\"''",
|
55
|
+
]
|
56
|
+
shell << " -H 'Content-Type: application/json'" if %i[post patch].include?(method)
|
57
|
+
shell << " --data '#{JSON.generate json}'" if json
|
58
|
+
shell.join(" \\\n")
|
59
|
+
end
|
60
|
+
|
29
61
|
# @param [String] key
|
30
62
|
# @return [NotionRubyMapping::PropertyCache, Hash] obtained Page value or PropertyCache
|
31
|
-
def
|
63
|
+
def get(key)
|
32
64
|
unless @json
|
33
65
|
raise StandardError, "Unknown id" if @id.nil?
|
34
66
|
|
@@ -42,9 +74,85 @@ module NotionRubyMapping
|
|
42
74
|
end
|
43
75
|
end
|
44
76
|
|
77
|
+
# @param [Array<Block>] blocks
|
78
|
+
# @param [Boolean] dry_run
|
79
|
+
# @return [NotionRubyMapping::Block, String]
|
80
|
+
# @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#44bbf83d852c419485c5efe9fe1558fb
|
81
|
+
# @see https://www.notion.so/hkob/Block-689ad4cbff50404d8a1baf67b6d6d78d#2c47f7fedae543cf8566389ba1677132
|
82
|
+
def append_block_children(*blocks, dry_run: false)
|
83
|
+
raise StandardError, "This block can have no children." unless page? || (block? && can_have_children)
|
84
|
+
|
85
|
+
only_one = blocks.length == 1
|
86
|
+
json = {
|
87
|
+
"children" => Array(blocks).map do |block|
|
88
|
+
assert_parent_children_pair block
|
89
|
+
block.block_json
|
90
|
+
end,
|
91
|
+
}
|
92
|
+
if dry_run
|
93
|
+
path = @nc.append_block_children_page_path(id)
|
94
|
+
self.class.dry_run_script :patch, path, json
|
95
|
+
else
|
96
|
+
response = @nc.append_block_children_request @id, json
|
97
|
+
raise StandardError, response unless response["results"]
|
98
|
+
|
99
|
+
answers = response["results"].map { |sub_json| Block.new json: sub_json }
|
100
|
+
only_one ? answers.first : answers
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# @param [NotionRubyMapping::Block] block
|
105
|
+
def assert_parent_children_pair(block)
|
106
|
+
raise StandardError, "the argument is not a block." unless block.block?
|
107
|
+
|
108
|
+
raise StandardError, "#{type} cannot have children." if block? && !@can_have_children
|
109
|
+
|
110
|
+
return if block.can_append
|
111
|
+
|
112
|
+
bt = block.type
|
113
|
+
raise StandardError, "Internal file block can not append." if bt == "file"
|
114
|
+
|
115
|
+
raise StandardError, "Column block can only append column_list block" unless bt == "column" &&
|
116
|
+
block? && type == "column_list"
|
117
|
+
end
|
118
|
+
|
119
|
+
# @param [NotionRubyMapping::Property] klass
|
120
|
+
# @param [String] title
|
121
|
+
# @return [NotionRubyMapping::Property] generated property
|
122
|
+
def assign_property(klass, title)
|
123
|
+
@property_cache ||= PropertyCache.new({}, base_type: database? ? :database : :page)
|
124
|
+
property = if database?
|
125
|
+
klass.new(title, will_update: new_record?, base_type: :database)
|
126
|
+
else
|
127
|
+
klass.new(title, will_update: true, base_type: :page)
|
128
|
+
end
|
129
|
+
@property_cache.add_property property
|
130
|
+
property
|
131
|
+
end
|
132
|
+
|
133
|
+
# @return [TrueClass, FalseClass] true if Block object
|
134
|
+
def block?
|
135
|
+
is_a? Block
|
136
|
+
end
|
137
|
+
|
138
|
+
# @param [NotionRubyMapping::Query] query
|
139
|
+
# @param [Boolean] dry_run
|
140
|
+
# @return [NotionRubyMapping::List, String]
|
141
|
+
def children(query = Query.new, dry_run: false)
|
142
|
+
if dry_run
|
143
|
+
path = @nc.block_children_page_path(id) + query.query_string
|
144
|
+
self.class.dry_run_script :get, path
|
145
|
+
elsif @children
|
146
|
+
@children
|
147
|
+
else
|
148
|
+
response = @nc.block_children_request @id, query.query_string
|
149
|
+
@children = List.new json: response, parent: self, query: query
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
45
153
|
# @return [NotionRubyMapping::CreatedTimeProperty]
|
46
154
|
def created_time
|
47
|
-
@created_time ||= CreatedTimeProperty.new("__timestamp__")
|
155
|
+
@created_time ||= CreatedTimeProperty.new("__timestamp__", json: self["created_time"])
|
48
156
|
end
|
49
157
|
|
50
158
|
# @return [TrueClass, FalseClass] true if Database object
|
@@ -53,16 +161,28 @@ module NotionRubyMapping
|
|
53
161
|
end
|
54
162
|
|
55
163
|
# @return [Hash, nil] obtained Hash
|
164
|
+
# @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#e13d526bd709451e9b06fd32e8d07fcd
|
56
165
|
def icon
|
57
166
|
self["icon"]
|
58
167
|
end
|
59
168
|
|
169
|
+
# @return [String (frozen)]
|
170
|
+
def inspect
|
171
|
+
"#{self.class.name}-#{@id}"
|
172
|
+
end
|
173
|
+
|
174
|
+
# @return [Hash] json properties
|
175
|
+
def json_properties
|
176
|
+
@json && @json["properties"]
|
177
|
+
end
|
178
|
+
|
60
179
|
# @return [NotionRubyMapping::LastEditedTimeProperty]
|
61
180
|
def last_edited_time
|
62
|
-
@last_edited_time ||= LastEditedTimeProperty.new("__timestamp__")
|
181
|
+
@last_edited_time ||= LastEditedTimeProperty.new("__timestamp__", json: self["last_edited_time"])
|
63
182
|
end
|
64
183
|
|
65
184
|
# @return [Boolean] true if new record
|
185
|
+
# @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#307af6e40d3840c59f8a82513a572d51
|
66
186
|
def new_record?
|
67
187
|
@new_record
|
68
188
|
end
|
@@ -73,6 +193,7 @@ module NotionRubyMapping
|
|
73
193
|
end
|
74
194
|
|
75
195
|
# @return [NotionRubyMapping::PropertyCache] get or created PropertyCache object
|
196
|
+
# @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#8f0b28e09dd74e2a9ff06126c48d64d4
|
76
197
|
def properties
|
77
198
|
unless @property_cache
|
78
199
|
unless @json
|
@@ -85,70 +206,6 @@ module NotionRubyMapping
|
|
85
206
|
@property_cache
|
86
207
|
end
|
87
208
|
|
88
|
-
# @return [NotionRubyMapping::Base, String]
|
89
|
-
def save(dry_run: false)
|
90
|
-
if dry_run
|
91
|
-
@new_record ? create(dry_run: true) : update(dry_run: true)
|
92
|
-
else
|
93
|
-
@new_record ? create : update
|
94
|
-
@property_cache.clear_will_update
|
95
|
-
@payload.clear
|
96
|
-
self
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
# @param [String] emoji
|
101
|
-
# @param [String] url
|
102
|
-
# @return [NotionRubyMapping::Base]
|
103
|
-
def set_icon(emoji: nil, url: nil)
|
104
|
-
@payload.set_icon(emoji: emoji, url: url) if page? || database?
|
105
|
-
self
|
106
|
-
end
|
107
|
-
|
108
|
-
# @return [String] title
|
109
|
-
def title
|
110
|
-
properties.select { |p| p.is_a? TitleProperty }.map(&:full_text).join ""
|
111
|
-
end
|
112
|
-
|
113
|
-
### Not public announced methods
|
114
|
-
|
115
|
-
# @param [Hash, Notion::Messages] json
|
116
|
-
# @return [NotionRubyMapping::Base]
|
117
|
-
def self.create_from_json(json)
|
118
|
-
case json["object"]
|
119
|
-
when "page"
|
120
|
-
Page.new json: json
|
121
|
-
when "database"
|
122
|
-
Database.new json: json
|
123
|
-
when "list"
|
124
|
-
List.new json: json
|
125
|
-
when "block"
|
126
|
-
Block.new json: json
|
127
|
-
else
|
128
|
-
raise StandardError, json.inspect
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
# @param [NotionRubyMapping::Property] klass
|
133
|
-
# @param [String] title
|
134
|
-
# @return [NotionRubyMapping::Property] generated property
|
135
|
-
def assign_property(klass, title)
|
136
|
-
@property_cache ||= PropertyCache.new({}, base_type: database? ? :database : :page)
|
137
|
-
|
138
|
-
property = if database?
|
139
|
-
klass.new(title, will_update: new_record?, base_type: :database)
|
140
|
-
else
|
141
|
-
klass.new(title, will_update: true, base_type: :page)
|
142
|
-
end
|
143
|
-
@property_cache.add_property property
|
144
|
-
property
|
145
|
-
end
|
146
|
-
|
147
|
-
# @return [NotionRubyMapping::List]
|
148
|
-
def children
|
149
|
-
@children ||= @nc.block_children(id)
|
150
|
-
end
|
151
|
-
|
152
209
|
# @return [Hash] created json for update page
|
153
210
|
def property_values_json
|
154
211
|
@payload.property_values_json @property_cache
|
@@ -173,10 +230,42 @@ module NotionRubyMapping
|
|
173
230
|
self
|
174
231
|
end
|
175
232
|
|
233
|
+
# @param [Boolean] dry_run
|
234
|
+
# @return [NotionRubyMapping::Base, String]
|
235
|
+
# @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#277085c8439841c798a4b94eae9a7326
|
236
|
+
def save(dry_run: false)
|
237
|
+
if dry_run
|
238
|
+
@new_record ? create(dry_run: true) : update(dry_run: true)
|
239
|
+
else
|
240
|
+
@new_record ? create : update
|
241
|
+
@property_cache.clear_will_update unless block?
|
242
|
+
@payload.clear
|
243
|
+
self
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
# @param [String] emoji
|
248
|
+
# @param [String] url
|
249
|
+
# @return [NotionRubyMapping::Base]
|
250
|
+
# @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#62eea67af7824496820c6bb903503540
|
251
|
+
# @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#e13d526bd709451e9b06fd32e8d07fcd
|
252
|
+
def set_icon(emoji: nil, url: nil)
|
253
|
+
@payload.set_icon(emoji: emoji, url: url) if page? || database?
|
254
|
+
self
|
255
|
+
end
|
256
|
+
|
257
|
+
# @return [FalseClass] return false except block
|
258
|
+
def synced_block_original?
|
259
|
+
false
|
260
|
+
end
|
261
|
+
|
176
262
|
# @param [Hash] json
|
177
263
|
# @return [NotionRubyMapping::Base]
|
178
264
|
def update_json(json)
|
179
|
-
|
265
|
+
unless json["object"] != "error" && (@json.nil? || @json["type"] == json["type"])
|
266
|
+
raise StandardError,
|
267
|
+
json.inspect
|
268
|
+
end
|
180
269
|
|
181
270
|
@json = json
|
182
271
|
@id = @nc.hex_id(@json["id"])
|
@@ -184,25 +273,7 @@ module NotionRubyMapping
|
|
184
273
|
self
|
185
274
|
end
|
186
275
|
|
187
|
-
|
188
|
-
# @return [Hash] json properties
|
189
|
-
def json_properties
|
190
|
-
@json && @json["properties"]
|
191
|
-
end
|
192
|
-
|
193
|
-
# @param [Object] method
|
194
|
-
# @param [Object] path
|
195
|
-
# @param [nil] json
|
196
|
-
def self.dry_run_script(method, path, json = nil)
|
197
|
-
shell = [
|
198
|
-
"#!/bin/sh\ncurl #{method == :get ? "" : "-X #{method.to_s.upcase}"} 'https://api.notion.com/#{path}'",
|
199
|
-
" -H 'Notion-Version: 2022-02-22'",
|
200
|
-
" -H 'Authorization: Bearer '\"$NOTION_API_KEY\"''",
|
201
|
-
]
|
202
|
-
shell << " -H 'Content-Type: application/json'" unless path == :get
|
203
|
-
shell << " --data '#{JSON.generate json}'" if json
|
204
|
-
shell.join(" \\\n")
|
205
|
-
end
|
276
|
+
### Not public announced methods
|
206
277
|
|
207
278
|
protected
|
208
279
|
|
@@ -0,0 +1,145 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NotionRubyMapping
|
4
|
+
# Notion block
|
5
|
+
class Block < Base
|
6
|
+
### Public announced methods
|
7
|
+
|
8
|
+
# @see https://www.notion.so/hkob/BreadcrumbBlock-3d0905b858524cdd8c868f80fd5d089a#d3b517be0c4b4825bed98206ce3ef41a
|
9
|
+
# @see https://www.notion.so/hkob/DividerBlock-d943b964dc4d4eff8f1d24ee0684e29e#f0ac8179c9a044bf95b87de1eb338413
|
10
|
+
def initialize(json: nil, id: nil, parent: nil)
|
11
|
+
super
|
12
|
+
@can_have_children = false
|
13
|
+
@can_append = true
|
14
|
+
end
|
15
|
+
attr_reader :can_have_children, :can_append, :type, :rich_text_array, :url, :caption, :color, :language
|
16
|
+
|
17
|
+
def self.type2class(type, has_children = false)
|
18
|
+
@type2class ||= {
|
19
|
+
false => {
|
20
|
+
"bookmark" => BookmarkBlock,
|
21
|
+
"breadcrumb" => BreadcrumbBlock,
|
22
|
+
"bulleted_list_item" => BulletedListItemBlock,
|
23
|
+
"callout" => CalloutBlock,
|
24
|
+
"child_database" => ChildDatabaseBlock,
|
25
|
+
"child_page" => ChildPageBlock,
|
26
|
+
"code" => CodeBlock,
|
27
|
+
"column" => ColumnBlock,
|
28
|
+
"column_list" => ColumnListBlock,
|
29
|
+
"divider" => DividerBlock,
|
30
|
+
"embed" => EmbedBlock,
|
31
|
+
"equation" => EquationBlock,
|
32
|
+
"file" => FileBlock,
|
33
|
+
"heading_1" => Heading1Block,
|
34
|
+
"heading_2" => Heading2Block,
|
35
|
+
"heading_3" => Heading3Block,
|
36
|
+
"image" => ImageBlock,
|
37
|
+
"link_preview" => LinkPreviewBlock,
|
38
|
+
"link_to_page" => LinkToPageBlock,
|
39
|
+
"numbered_list_item" => NumberedListItemBlock,
|
40
|
+
"paragraph" => ParagraphBlock,
|
41
|
+
"pdf" => PdfBlock,
|
42
|
+
"quote" => QuoteBlock,
|
43
|
+
"synced_block" => SyncedBlock,
|
44
|
+
"table" => TableBlock,
|
45
|
+
"table_row" => TableRowBlock,
|
46
|
+
"table_of_contents" => TableOfContentsBlock,
|
47
|
+
"template" => TemplateBlock,
|
48
|
+
"to_do" => ToDoBlock,
|
49
|
+
"toggle" => ToggleBlock,
|
50
|
+
"video" => VideoBlock,
|
51
|
+
},
|
52
|
+
true => {
|
53
|
+
"heading_1" => ToggleHeading1Block,
|
54
|
+
"heading_2" => ToggleHeading2Block,
|
55
|
+
"heading_3" => ToggleHeading3Block,
|
56
|
+
}
|
57
|
+
}
|
58
|
+
@klass = @type2class[has_children][type] || @type2class[false][type] || Block
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.decode_block(json)
|
62
|
+
type2class(json["type"], json["has_children"]).new json: json
|
63
|
+
end
|
64
|
+
|
65
|
+
# @see https://www.notion.so/hkob/Block-689ad4cbff50404d8a1baf67b6d6d78d#298916c7c379424682f39ff09ee38544
|
66
|
+
# @param [String] id
|
67
|
+
# @return [NotionRubyMapping::Block]
|
68
|
+
def self.find(id, dry_run: false)
|
69
|
+
nc = NotionCache.instance
|
70
|
+
if dry_run
|
71
|
+
Base.dry_run_script :get, nc.block_path(id)
|
72
|
+
else
|
73
|
+
nc.block id
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# @param [Boolean] not_update false when update
|
78
|
+
# @return [Hash{String (frozen)->Hash}]
|
79
|
+
def block_json(not_update: true)
|
80
|
+
ans = {"type" => type}
|
81
|
+
ans["object"] = "block"
|
82
|
+
ans["archived"] = true if @archived
|
83
|
+
ans
|
84
|
+
end
|
85
|
+
|
86
|
+
# @return [Hash{String (frozen)->Array<Hash{String (frozen)->Hash}>}]
|
87
|
+
def children_block_json
|
88
|
+
{"children" => [block_json]}
|
89
|
+
end
|
90
|
+
|
91
|
+
# @return [NotionRubyMapping::RichTextArray]
|
92
|
+
def decode_block_caption
|
93
|
+
@caption = RichTextArray.new "caption", json: @json[type]["caption"]
|
94
|
+
end
|
95
|
+
|
96
|
+
# @return [String]
|
97
|
+
def decode_color
|
98
|
+
@color = @json[type]["color"]
|
99
|
+
end
|
100
|
+
|
101
|
+
# @return [NotionRubyMapping::RichTextArray]
|
102
|
+
def decode_block_rich_text_array
|
103
|
+
@rich_text_array = RichTextArray.new "rich_text", json: @json[type]["rich_text"]
|
104
|
+
end
|
105
|
+
|
106
|
+
# @param [Boolean] dry_run
|
107
|
+
# @return [NotionRubyMapping::Base, String]
|
108
|
+
def destroy(dry_run: false)
|
109
|
+
if dry_run
|
110
|
+
Base.dry_run_script :delete, @nc.block_path(@id)
|
111
|
+
else
|
112
|
+
@nc.destroy_block id
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# @return [NotionRubyMapping::Base, String]
|
117
|
+
def update(dry_run: false)
|
118
|
+
if dry_run
|
119
|
+
dry_run_script :patch, @nc.block_path(@id), :update_block_json
|
120
|
+
else
|
121
|
+
update_json @nc.update_block_request(@id, update_block_json)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# @return [Hash]
|
126
|
+
def update_block_json
|
127
|
+
@payload.update_block_json type, block_json(not_update: false)
|
128
|
+
end
|
129
|
+
|
130
|
+
protected
|
131
|
+
|
132
|
+
def add_sub_blocks(sub_blocks)
|
133
|
+
@sub_blocks = Array(sub_blocks) if sub_blocks
|
134
|
+
@can_have_children = true
|
135
|
+
end
|
136
|
+
|
137
|
+
# @param [String] type
|
138
|
+
# @param [String] color
|
139
|
+
def rich_text_array_and_color(type, text_info, color = "default")
|
140
|
+
@rich_text_array = RichTextArray.rich_text_array type, text_info
|
141
|
+
@color = color
|
142
|
+
self
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NotionRubyMapping
|
4
|
+
# Notion block
|
5
|
+
class BreadcrumbBlock < Block
|
6
|
+
# @return [String (frozen)]
|
7
|
+
def type
|
8
|
+
"breadcrumb"
|
9
|
+
end
|
10
|
+
|
11
|
+
# @param [Boolean] not_update false when update
|
12
|
+
# @return [Hash{String (frozen)->Hash}]
|
13
|
+
def block_json(not_update: true)
|
14
|
+
ans = super
|
15
|
+
ans[type] = {}
|
16
|
+
ans
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NotionRubyMapping
|
4
|
+
# Notion block
|
5
|
+
class CalloutBlock < Block
|
6
|
+
# @param [RichTextArray, String, Array<String>, RichTextObject, Array<RichTextObject>] text_info
|
7
|
+
# @param [String] emoji
|
8
|
+
# @param [String] file_url
|
9
|
+
# @param [String] color
|
10
|
+
# @param [NotionRubyMapping::Block, Array<NotionRubyMapping::Block>, nil] sub_blocks
|
11
|
+
def initialize(text_info = nil, emoji: nil, file_url: nil, sub_blocks: nil, color: "default", json: nil, id: nil,
|
12
|
+
parent: nil)
|
13
|
+
super(json: json, id: id, parent: parent)
|
14
|
+
if @json
|
15
|
+
decode_block_rich_text_array
|
16
|
+
decode_color
|
17
|
+
else
|
18
|
+
rich_text_array_and_color "rich_text", text_info, color
|
19
|
+
@emoji = EmojiObject.emoji_object emoji if emoji
|
20
|
+
@file_object = FileObject.file_object file_url if file_url
|
21
|
+
add_sub_blocks sub_blocks
|
22
|
+
end
|
23
|
+
@can_have_children = true
|
24
|
+
end
|
25
|
+
|
26
|
+
# @see https://www.notion.so/hkob/CalloutBlock-0eb8b64bea664bc89fad706a866a6e26#db689d47cbcc44359a5ade17ca754cdd
|
27
|
+
# @see https://www.notion.so/hkob/CalloutBlock-0eb8b64bea664bc89fad706a866a6e26#4314e4d50617485f8d0fc3505c5b3e9b
|
28
|
+
attr_reader :color, :rich_text_array
|
29
|
+
|
30
|
+
# @param [Boolean] not_update false when update
|
31
|
+
# @return [Hash{String (frozen)->Hash}]
|
32
|
+
def block_json(not_update: true)
|
33
|
+
ans = super
|
34
|
+
ans[type] = @rich_text_array.update_property_schema_json not_update
|
35
|
+
ans[type]["color"] = @color
|
36
|
+
ans[type]["icon"] = @emoji.property_values_json if @emoji
|
37
|
+
ans[type]["icon"] = @file_object.property_values_json if @file_object
|
38
|
+
ans[type]["children"] = @sub_blocks.map(&:block_json) if @sub_blocks
|
39
|
+
ans
|
40
|
+
end
|
41
|
+
|
42
|
+
# @param [String] new_color
|
43
|
+
# @see https://www.notion.so/hkob/CalloutBlock-0eb8b64bea664bc89fad706a866a6e26#b3598e385c2d4a23ada506441a7f0f32
|
44
|
+
def color=(new_color)
|
45
|
+
@color = new_color
|
46
|
+
@payload.add_update_block_key "color"
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [String, nil]
|
50
|
+
# @see https://www.notion.so/hkob/CalloutBlock-0eb8b64bea664bc89fad706a866a6e26#611496b7fd96499882fad138ef248b04
|
51
|
+
def emoji
|
52
|
+
@emoji&.emoji
|
53
|
+
end
|
54
|
+
|
55
|
+
# @param [String] emoji
|
56
|
+
# @see https://www.notion.so/hkob/CalloutBlock-0eb8b64bea664bc89fad706a866a6e26#0bd030c398184f94b819358830c2e26d
|
57
|
+
def emoji=(emoji)
|
58
|
+
@emoji = EmojiObject.emoji_object emoji
|
59
|
+
@file_object = nil
|
60
|
+
@payload.add_update_block_key "icon"
|
61
|
+
end
|
62
|
+
|
63
|
+
# @return [String]
|
64
|
+
# @see https://www.notion.so/hkob/CalloutBlock-0eb8b64bea664bc89fad706a866a6e26#57a8fc88f2ee49f7963942ad30cbca04
|
65
|
+
def file_url
|
66
|
+
@file_object&.url
|
67
|
+
end
|
68
|
+
|
69
|
+
# @param [String] url
|
70
|
+
# @see https://www.notion.so/hkob/CalloutBlock-0eb8b64bea664bc89fad706a866a6e26#041dd676bbfb442699229486fd30370a
|
71
|
+
def file_url=(url)
|
72
|
+
@file_object = FileObject.file_object url
|
73
|
+
@emoji = nil
|
74
|
+
@payload.add_update_block_key "icon"
|
75
|
+
end
|
76
|
+
|
77
|
+
# @return [String (frozen)]
|
78
|
+
def type
|
79
|
+
"callout"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module NotionRubyMapping
|
4
|
+
# Notion block
|
5
|
+
class ChildBaseBlock < Block
|
6
|
+
def initialize(json: nil, id: nil, parent: nil)
|
7
|
+
super
|
8
|
+
@title = @json[type]["title"]
|
9
|
+
@can_append = false
|
10
|
+
@can_append = false
|
11
|
+
end
|
12
|
+
|
13
|
+
# @param [Boolean] not_update false when update
|
14
|
+
# @return [Hash{String (frozen)->Hash}]
|
15
|
+
def block_json(not_update: true)
|
16
|
+
ans = super
|
17
|
+
ans[type] = {"title" => @title}
|
18
|
+
ans
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|