notion_ruby_mapping 0.3.2 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +34 -1224
  3. data/env.yml.sample +0 -13
  4. data/lib/notion_ruby_mapping/{base.rb → blocks/base.rb} +166 -90
  5. data/lib/notion_ruby_mapping/blocks/block.rb +565 -0
  6. data/lib/notion_ruby_mapping/{database.rb → blocks/database.rb} +40 -9
  7. data/lib/notion_ruby_mapping/{list.rb → blocks/list.rb} +35 -3
  8. data/lib/notion_ruby_mapping/blocks/page.rb +71 -0
  9. data/lib/notion_ruby_mapping/{notion_cache.rb → controllers/notion_cache.rb} +134 -98
  10. data/lib/notion_ruby_mapping/{payload.rb → controllers/payload.rb} +0 -0
  11. data/lib/notion_ruby_mapping/{property_cache.rb → controllers/property_cache.rb} +21 -20
  12. data/lib/notion_ruby_mapping/{query.rb → controllers/query.rb} +26 -18
  13. data/lib/notion_ruby_mapping/{rich_text_array.rb → controllers/rich_text_array.rb} +26 -15
  14. data/lib/notion_ruby_mapping/objects/emoji_object.rb +40 -0
  15. data/lib/notion_ruby_mapping/objects/equation_object.rb +43 -0
  16. data/lib/notion_ruby_mapping/objects/file_object.rb +60 -0
  17. data/lib/notion_ruby_mapping/{mention_object.rb → objects/mention_object.rb} +11 -0
  18. data/lib/notion_ruby_mapping/{rich_text_object.rb → objects/rich_text_object.rb} +11 -0
  19. data/lib/notion_ruby_mapping/{text_object.rb → objects/text_object.rb} +0 -1
  20. data/lib/notion_ruby_mapping/{user_object.rb → objects/user_object.rb} +9 -4
  21. data/lib/notion_ruby_mapping/{checkbox_property.rb → properties/checkbox_property.rb} +3 -0
  22. data/lib/notion_ruby_mapping/{created_by_property.rb → properties/created_by_property.rb} +0 -0
  23. data/lib/notion_ruby_mapping/{created_time_property.rb → properties/created_time_property.rb} +1 -0
  24. data/lib/notion_ruby_mapping/properties/date_base_property.rb +122 -0
  25. data/lib/notion_ruby_mapping/{date_property.rb → properties/date_property.rb} +13 -0
  26. data/lib/notion_ruby_mapping/{email_property.rb → properties/email_property.rb} +1 -0
  27. data/lib/notion_ruby_mapping/{files_property.rb → properties/files_property.rb} +26 -13
  28. data/lib/notion_ruby_mapping/{formula_property.rb → properties/formula_property.rb} +4 -0
  29. data/lib/notion_ruby_mapping/{last_edited_by_property.rb → properties/last_edited_by_property.rb} +1 -0
  30. data/lib/notion_ruby_mapping/{last_edited_time_property.rb → properties/last_edited_time_property.rb} +1 -0
  31. data/lib/notion_ruby_mapping/{multi_property.rb → properties/multi_property.rb} +0 -0
  32. data/lib/notion_ruby_mapping/{multi_select_property.rb → properties/multi_select_property.rb} +2 -3
  33. data/lib/notion_ruby_mapping/{number_property.rb → properties/number_property.rb} +4 -0
  34. data/lib/notion_ruby_mapping/{people_property.rb → properties/people_property.rb} +8 -3
  35. data/lib/notion_ruby_mapping/{phone_number_property.rb → properties/phone_number_property.rb} +4 -0
  36. data/lib/notion_ruby_mapping/{property.rb → properties/property.rb} +33 -0
  37. data/lib/notion_ruby_mapping/{relation_property.rb → properties/relation_property.rb} +30 -10
  38. data/lib/notion_ruby_mapping/{rich_text_property.rb → properties/rich_text_property.rb} +0 -0
  39. data/lib/notion_ruby_mapping/{rollup_property.rb → properties/rollup_property.rb} +7 -0
  40. data/lib/notion_ruby_mapping/{select_property.rb → properties/select_property.rb} +6 -1
  41. data/lib/notion_ruby_mapping/{text_property.rb → properties/text_property.rb} +0 -0
  42. data/lib/notion_ruby_mapping/{title_property.rb → properties/title_property.rb} +0 -0
  43. data/lib/notion_ruby_mapping/{url_property.rb → properties/url_property.rb} +5 -0
  44. data/lib/notion_ruby_mapping/version.rb +1 -1
  45. data/lib/notion_ruby_mapping.rb +14 -7
  46. metadata +43 -40
  47. data/lib/notion_ruby_mapping/block.rb +0 -10
  48. data/lib/notion_ruby_mapping/date_base_property.rb +0 -75
  49. 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"
@@ -2,9 +2,8 @@
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
@@ -13,16 +12,50 @@ module NotionRubyMapping
13
12
  @json = json
14
13
  @id = @nc.hex_id(id || json && @json["id"])
15
14
  @new_record = true unless parent.nil?
16
- raise StandardError, "Unknown id" if !is_a?(List) && @id.nil? && parent.nil?
15
+ raise StandardError, "Unknown id" if !is_a?(List) && !is_a?(Block) && @id.nil? && parent.nil?
17
16
 
18
- @payload = Payload.new(parent && {"parent" => parent})
17
+ @payload = Payload.new(!is_a?(Block) && parent && {"parent" => parent})
19
18
  @property_cache = nil
20
19
  @created_time = nil
21
20
  @last_edited_time = nil
21
+ return if assign.empty?
22
+
22
23
  assign.each_slice(2) { |(klass, key)| assign_property(klass, key) }
24
+ @json ||= {}
23
25
  end
24
26
  attr_reader :json, :id
25
27
 
28
+ # @param [Hash, Notion::Messages] json
29
+ # @return [NotionRubyMapping::Base]
30
+ def self.create_from_json(json)
31
+ case json["object"]
32
+ when "page"
33
+ Page.new json: json
34
+ when "database"
35
+ Database.new json: json
36
+ when "list"
37
+ List.new json: json
38
+ when "block"
39
+ Block.new(json: json).decode_block
40
+ else
41
+ raise StandardError, json.inspect
42
+ end
43
+ end
44
+
45
+ # @param [Object] method
46
+ # @param [Object] path
47
+ # @param [nil] json
48
+ def self.dry_run_script(method, path, json = nil)
49
+ shell = [
50
+ "#!/bin/sh\ncurl #{method == :get ? "" : "-X #{method.to_s.upcase}"} 'https://api.notion.com/#{path}'",
51
+ " -H 'Notion-Version: 2022-02-22'",
52
+ " -H 'Authorization: Bearer '\"$NOTION_API_KEY\"''",
53
+ ]
54
+ shell << " -H 'Content-Type: application/json'" if %i[post patch].include?(method)
55
+ shell << " --data '#{JSON.generate json}'" if json
56
+ shell.join(" \\\n")
57
+ end
58
+
26
59
  # @param [String] key
27
60
  # @return [NotionRubyMapping::PropertyCache, Hash] obtained Page value or PropertyCache
28
61
  def [](key)
@@ -39,9 +72,92 @@ module NotionRubyMapping
39
72
  end
40
73
  end
41
74
 
75
+ # @param [Array<Block>] blocks
76
+ # @param [Boolean] dry_run
77
+ # @return [NotionRubyMapping::Block, String]
78
+ # @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#44bbf83d852c419485c5efe9fe1558fb
79
+ # @see https://www.notion.so/hkob/Block-689ad4cbff50404d8a1baf67b6d6d78d#2c47f7fedae543cf8566389ba1677132
80
+ def append_block_children(*blocks, dry_run: false)
81
+ raise StandardError, "This block can have no children." unless page? || (block? && can_have_children)
82
+
83
+ only_one = blocks.length == 1
84
+ json = {
85
+ "children" => Array(blocks).map do |block|
86
+ assert_parent_children_pair block
87
+ block.block_json
88
+ end,
89
+ }
90
+ if dry_run
91
+ path = @nc.append_block_children_page_path(id)
92
+ self.class.dry_run_script :patch, path, json
93
+ else
94
+ response = @nc.append_block_children_request @id, json
95
+ raise StandardError, response unless response["results"]
96
+
97
+ answers = response["results"].map { |sub_json| Block.new json: sub_json }
98
+ only_one ? answers.first : answers
99
+ end
100
+ end
101
+
102
+ # @param [NotionRubyMapping::Block] block
103
+ def assert_parent_children_pair(block)
104
+ raise StandardError, "the argument is not a block." unless block.block?
105
+
106
+ raise StandardError, "#{type} cannot have children." if block? && !@can_have_children
107
+
108
+ return if block.can_append
109
+
110
+ bt = block.type
111
+ raise StandardError, "Internal file block can not append." if bt == "file"
112
+
113
+ raise StandardError, "Column block can only append column_list block" unless bt == "column" &&
114
+ block? && type == "columu_list"
115
+ end
116
+
117
+ # @param [NotionRubyMapping::Property] klass
118
+ # @param [String] title
119
+ # @return [NotionRubyMapping::Property] generated property
120
+ def assign_property(klass, title)
121
+ @property_cache ||= PropertyCache.new({}, base_type: database? ? :database : :page)
122
+ property = if database?
123
+ klass.new(title, will_update: new_record?, base_type: :database)
124
+ else
125
+ klass.new(title, will_update: true, base_type: :page)
126
+ end
127
+ @property_cache.add_property property
128
+ property
129
+ end
130
+
131
+ # @return [TrueClass, FalseClass] true if Block object
132
+ def block?
133
+ is_a? Block
134
+ end
135
+
136
+ # @param [NotionRubyMapping::Query] query
137
+ # @param [Boolean] dry_run
138
+ # @return [NotionRubyMapping::List, String]
139
+ def children(query = Query.new, dry_run: false)
140
+ if dry_run
141
+ path = @nc.block_children_page_path(id) + query.query_string
142
+ self.class.dry_run_script :get, path
143
+ elsif @children
144
+ @children
145
+ else
146
+ response = @nc.block_children_request @id, query.query_string
147
+ @children = List.new json: response, parent: self, query: query
148
+ end
149
+ end
150
+
151
+ # @return [NotionRubyMapping::Block]
152
+ def create_child_breadcrumb
153
+ raise StandardError unless page? || (block? && can_have_children)
154
+
155
+ Block.new(parent: self).breadcrumb
156
+ end
157
+
42
158
  # @return [NotionRubyMapping::CreatedTimeProperty]
43
159
  def created_time
44
- @created_time ||= CreatedTimeProperty.new("__timestamp__")
160
+ @created_time ||= CreatedTimeProperty.new("__timestamp__", json: self["created_time"])
45
161
  end
46
162
 
47
163
  # @return [TrueClass, FalseClass] true if Database object
@@ -50,16 +166,28 @@ module NotionRubyMapping
50
166
  end
51
167
 
52
168
  # @return [Hash, nil] obtained Hash
169
+ # @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#e13d526bd709451e9b06fd32e8d07fcd
53
170
  def icon
54
171
  self["icon"]
55
172
  end
56
173
 
174
+ # @return [String (frozen)]
175
+ def inspect
176
+ "#{self.class.name}-#{@id}"
177
+ end
178
+
179
+ # @return [Hash] json properties
180
+ def json_properties
181
+ @json && @json["properties"]
182
+ end
183
+
57
184
  # @return [NotionRubyMapping::LastEditedTimeProperty]
58
185
  def last_edited_time
59
- @last_edited_time ||= LastEditedTimeProperty.new("__timestamp__")
186
+ @last_edited_time ||= LastEditedTimeProperty.new("__timestamp__", json: self["last_edited_time"])
60
187
  end
61
188
 
62
189
  # @return [Boolean] true if new record
190
+ # @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#307af6e40d3840c59f8a82513a572d51
63
191
  def new_record?
64
192
  @new_record
65
193
  end
@@ -70,6 +198,7 @@ module NotionRubyMapping
70
198
  end
71
199
 
72
200
  # @return [NotionRubyMapping::PropertyCache] get or created PropertyCache object
201
+ # @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#8f0b28e09dd74e2a9ff06126c48d64d4
73
202
  def properties
74
203
  unless @property_cache
75
204
  unless @json
@@ -82,70 +211,6 @@ module NotionRubyMapping
82
211
  @property_cache
83
212
  end
84
213
 
85
- # @return [NotionRubyMapping::Base, String]
86
- def save(dry_run: false)
87
- if dry_run
88
- @new_record ? create(dry_run: true) : update(dry_run: true)
89
- else
90
- @new_record ? create : update
91
- @property_cache.clear_will_update
92
- @payload.clear
93
- self
94
- end
95
- end
96
-
97
- # @param [String] emoji
98
- # @param [String] url
99
- # @return [NotionRubyMapping::Base]
100
- def set_icon(emoji: nil, url: nil)
101
- @payload.set_icon(emoji: emoji, url: url) if page? || database?
102
- self
103
- end
104
-
105
- # @return [String] title
106
- def title
107
- properties.select { |p| p.is_a? TitleProperty }.map(&:full_text).join ""
108
- end
109
-
110
- ### Not public announced methods
111
-
112
- # @param [Hash, Notion::Messages] json
113
- # @return [NotionRubyMapping::Base]
114
- def self.create_from_json(json)
115
- case json["object"]
116
- when "page"
117
- Page.new json: json
118
- when "database"
119
- Database.new json: json
120
- when "list"
121
- List.new json: json
122
- when "block"
123
- Block.new json: json
124
- else
125
- raise StandardError, json.inspect
126
- end
127
- end
128
-
129
- # @param [NotionRubyMapping::Property] klass
130
- # @param [String] title
131
- # @return [NotionRubyMapping::Property] generated property
132
- def assign_property(klass, title)
133
- @property_cache ||= PropertyCache.new({}, base_type: database? ? :database : :page)
134
-
135
- property = if database?
136
- klass.new(title, will_update: new_record?, base_type: :database)
137
- else
138
- klass.new(title, will_update: true, base_type: :page)
139
- end
140
- @property_cache.add_property property
141
- property
142
- end
143
-
144
- # @return [NotionRubyMapping::List]
145
- def children
146
- @children ||= @nc.block_children(id)
147
- end
148
-
149
214
  # @return [Hash] created json for update page
150
215
  def property_values_json
151
216
  @payload.property_values_json @property_cache
@@ -170,10 +235,39 @@ module NotionRubyMapping
170
235
  self
171
236
  end
172
237
 
238
+ # @param [Boolean] dry_run
239
+ # @return [NotionRubyMapping::Base, String]
240
+ # @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#277085c8439841c798a4b94eae9a7326
241
+ def save(dry_run: false)
242
+ if dry_run
243
+ @new_record ? create(dry_run: true) : update(dry_run: true)
244
+ else
245
+ @new_record ? create : update
246
+ @property_cache.clear_will_update
247
+ @payload.clear
248
+ self
249
+ end
250
+ end
251
+
252
+ # @param [String] emoji
253
+ # @param [String] url
254
+ # @return [NotionRubyMapping::Base]
255
+ # @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#62eea67af7824496820c6bb903503540
256
+ # @see https://www.notion.so/hkob/Page-d359650e3ca94424af8359a24147b9a0#e13d526bd709451e9b06fd32e8d07fcd
257
+ def set_icon(emoji: nil, url: nil)
258
+ @payload.set_icon(emoji: emoji, url: url) if page? || database?
259
+ self
260
+ end
261
+
262
+ # @return [FalseClass] return false except block
263
+ def synced_block_original?
264
+ false
265
+ end
266
+
173
267
  # @param [Hash] json
174
268
  # @return [NotionRubyMapping::Base]
175
269
  def update_json(json)
176
- raise StandardError, json.inspect unless json["object"] != "error" && @json.nil? || @json["type"] == json["type"]
270
+ raise StandardError, json.inspect unless json["object"] != "error" && (@json.nil? || @json["type"] == json["type"])
177
271
 
178
272
  @json = json
179
273
  @id = @nc.hex_id(@json["id"])
@@ -181,25 +275,7 @@ module NotionRubyMapping
181
275
  self
182
276
  end
183
277
 
184
- # protected
185
- # @return [Hash] json properties
186
- def json_properties
187
- @json && @json["properties"]
188
- end
189
-
190
- # @param [Object] method
191
- # @param [Object] path
192
- # @param [nil] json
193
- def self.dry_run_script(method, path, json = nil)
194
- shell = [
195
- "#!/bin/sh\ncurl #{method == :get ? "" : "-X #{method.to_s.upcase}"} 'https://api.notion.com/#{path}'",
196
- " -H 'Notion-Version: 2022-02-22'",
197
- " -H 'Authorization: Bearer '\"$NOTION_API_KEY\"''",
198
- ]
199
- shell << " -H 'Content-Type: application/json'" unless path == :get
200
- shell << " --data '#{JSON.generate json}'" if json
201
- shell.join(" \\\n")
202
- end
278
+ ### Not public announced methods
203
279
 
204
280
  protected
205
281