notion_ruby_mapping 0.3.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
|  |
|
|
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
|
+
|  |  |
|
|
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
|