Class: NotionRubyMapping::Base
- Inherits:
-
Object
- Object
- NotionRubyMapping::Base
- Defined in:
- lib/notion_ruby_mapping/blocks/base.rb
Overview
Notion Base object (Parent of Page / Database / List) The Public API method has a link to the API references.
Instance Attribute Summary collapse
-
#archived ⇒ Object
readonly
Returns the value of attribute archived.
-
#has_children ⇒ Object
readonly
Returns the value of attribute has_children.
-
#id ⇒ Object
readonly
Returns the value of attribute id.
-
#json ⇒ Object
readonly
Returns the value of attribute json.
Class Method Summary collapse
- .block_id(str) ⇒ Object
- .create_from_json(json) ⇒ NotionRubyMapping::Base
- .database_id(str) ⇒ Object
- .dry_run_script(method, path, json = nil) ⇒ Object
- .page_id(str) ⇒ Object
Instance Method Summary collapse
- #append_block_children(*blocks, after: nil, dry_run: false) ⇒ NotionRubyMapping::Block, String
- #assert_parent_children_pair(block) ⇒ Object
-
#assign_property(klass, title) ⇒ NotionRubyMapping::Property
Generated property.
-
#block? ⇒ TrueClass, FalseClass
True if Block object.
- #children(query = Query.new, dry_run: false) ⇒ NotionRubyMapping::List, String
- #comments(query = nil, dry_run: false) ⇒ Object
-
#cover ⇒ Hash?
Obtained Hash.
- #created_time ⇒ NotionRubyMapping::CreatedTimeProperty
-
#database? ⇒ TrueClass, FalseClass
True if Database object.
-
#get(key) ⇒ NotionRubyMapping::PropertyCache, Hash
Obtained Page value or PropertyCache.
-
#icon ⇒ Hash?
Obtained Hash.
-
#initialize(json: nil, id: nil, assign: [], parent: nil) ⇒ Base
constructor
A new instance of Base.
- #inspect ⇒ String (frozen)
-
#json_properties ⇒ Hash
Json properties.
- #last_edited_time ⇒ NotionRubyMapping::LastEditedTimeProperty
-
#new_record? ⇒ Boolean
True if new record.
-
#page? ⇒ TrueClass, FalseClass
True if Page object.
- #parent(dry_run: false) ⇒ Object
- #parent_id ⇒ Object
-
#properties ⇒ NotionRubyMapping::PropertyCache
Get or created PropertyCache object.
-
#property_values_json ⇒ Hash
Created json for update page.
-
#reload ⇒ NotionRubyMapping::Base
Reloaded self.
- #restore_from_json ⇒ NotionRubyMapping::Base
- #save(dry_run: false) ⇒ NotionRubyMapping::Base, ...
- #set_cover(url: nil, file_upload_object: nil) ⇒ NotionRubyMapping::Base
- #set_icon(emoji: nil, url: nil, file_upload_object: nil) ⇒ NotionRubyMapping::Base
-
#synced_block_original? ⇒ FalseClass
Return false except block.
- #update_json(json) ⇒ NotionRubyMapping::Base
Constructor Details
#initialize(json: nil, id: nil, assign: [], parent: nil) ⇒ Base
Returns a new instance of Base.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 10 def initialize(json: nil, id: nil, assign: [], parent: nil) @nc = NotionCache.instance @json = json @id = @nc.hex_id(id || @json && @json["id"]) @archived = @json && @json["archived"] @has_children = @json && @json["has_children"] @new_record = true unless parent.nil? raise StandardError, "Unknown id" if !is_a?(List) && !is_a?(Block) && @id.nil? && parent.nil? @payload = Payload.new(!is_a?(Block) && parent && {"parent" => parent}) @property_cache = nil @created_time = nil @last_edited_time = nil return if assign.empty? assign.each_slice(2) { |(klass, key)| assign_property(klass, key) } @json ||= {} end |
Instance Attribute Details
#archived ⇒ Object (readonly)
Returns the value of attribute archived.
28 29 30 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 28 def archived @archived end |
#has_children ⇒ Object (readonly)
Returns the value of attribute has_children.
28 29 30 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 28 def has_children @has_children end |
#id ⇒ Object (readonly)
Returns the value of attribute id.
28 29 30 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 28 def id @id end |
#json ⇒ Object (readonly)
Returns the value of attribute json.
28 29 30 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 28 def json @json end |
Class Method Details
.block_id(str) ⇒ Object
47 48 49 50 51 52 53 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 47 def self.block_id(str) if /^http/.match str /#([\da-f]{32})/.match(str)[1] else NotionCache.instance.hex_id str end end |
.create_from_json(json) ⇒ NotionRubyMapping::Base
32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 32 def self.create_from_json(json) case json["object"] when "page" Page.new json: json when "database" Database.new json: json when "list" List.new json: json when "block" Block.decode_block json else raise StandardError, json.inspect end end |
.database_id(str) ⇒ Object
55 56 57 58 59 60 61 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 55 def self.database_id(str) if /^http/.match str /([\da-f]{32})\?/.match(str)[1] else NotionCache.instance.hex_id str end end |
.dry_run_script(method, path, json = nil) ⇒ Object
66 67 68 69 70 71 72 73 74 75 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 66 def self.dry_run_script(method, path, json = nil) shell = [ "#!/bin/sh\ncurl #{method == :get ? "" : "-X #{method.to_s.upcase}"} 'https://api.notion.com/#{path}'", " -H 'Notion-Version: 2022-06-28'", " -H 'Authorization: Bearer '\"$NOTION_API_KEY\"''", ] shell << " -H 'Content-Type: application/json'" if %i[post patch].include?(method) shell << " --data '#{JSON.generate json}'" if json shell.join(" \\\n") end |
.page_id(str) ⇒ Object
77 78 79 80 81 82 83 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 77 def self.page_id(str) if /^http/.match str /([\da-f]{32})(|\?.*)$/.match(str)[1] else NotionCache.instance.hex_id str end end |
Instance Method Details
#append_block_children(*blocks, after: nil, dry_run: false) ⇒ NotionRubyMapping::Block, String
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 126 def append_block_children(*blocks, after: nil, dry_run: false) raise StandardError, "This block can have no children." unless page? || (block? && can_have_children) only_one = blocks.length == 1 json = { children: Array(blocks).map do |block| assert_parent_children_pair block block.block_json end, } json["after"] = after if after if dry_run path = @nc.append_block_children_page_path(id) self.class.dry_run_script :patch, path, json else response = @nc.append_block_children_request @id, json raise StandardError, response unless response["results"] answers = response["results"].map { |sub_json| Block.create_from_json sub_json } only_one ? answers.first : answers end end |
#assert_parent_children_pair(block) ⇒ Object
150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 150 def assert_parent_children_pair(block) raise StandardError, "the argument is not a block." unless block.block? raise StandardError, "#{type} cannot have children." if block? && !@can_have_children return if block.can_append bt = block.type raise StandardError, "Internal file block can not append." if bt == :file raise StandardError, "Column block can only append column_list block" unless bt == :column && block? && type == :column_list end |
#assign_property(klass, title) ⇒ NotionRubyMapping::Property
Returns generated property.
167 168 169 170 171 172 173 174 175 176 177 178 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 167 def assign_property(klass, title) @property_cache ||= PropertyCache.new({}, base_type: database? ? "database" : "page", page_id: page? ? @id : nil) property = if database? klass.new(title, will_update: new_record?, base_type: "database") else klass.new(title, will_update: true, base_type: "page", property_cache: @property_cache) end @property_cache.add_property property property end |
#block? ⇒ TrueClass, FalseClass
Returns true if Block object.
181 182 183 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 181 def block? is_a? Block end |
#children(query = Query.new, dry_run: false) ⇒ NotionRubyMapping::List, String
188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 188 def children(query = Query.new, dry_run: false) if dry_run path = @nc.block_children_page_path(id) + query.query_string self.class.dry_run_script :get, path elsif @children @children else response = @nc.block_children_request @id, query.query_string @children = List.new json: response, type: "parent", value: self, query: query end end |
#comments(query = nil, dry_run: false) ⇒ Object
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 86 def comments(query = nil, dry_run: false) return unless page? || block? if dry_run self.class.dry_run_script :get, @nc.retrieve_comments_path(@id) else ans = {} List.new(type: "comment_parent", value: self, json: @nc.retrieve_comments_request(@id, query), query: query).each do |comment| dt_id = comment.discussion_id dt = ans[dt_id] ||= DiscussionThread.new(dt_id) dt.comments << comment end ans end end |
#cover ⇒ Hash?
Returns obtained Hash.
201 202 203 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 201 def cover self["cover"] end |
#created_time ⇒ NotionRubyMapping::CreatedTimeProperty
206 207 208 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 206 def created_time @created_time ||= CreatedTimeProperty.new("__timestamp__", json: self["created_time"]) end |
#database? ⇒ TrueClass, FalseClass
Returns true if Database object.
211 212 213 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 211 def database? is_a? Database end |
#get(key) ⇒ NotionRubyMapping::PropertyCache, Hash
Returns obtained Page value or PropertyCache.
106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 106 def get(key) unless @json raise StandardError, "Unknown id" if @id.nil? reload end case key when "properties" properties else @json[key] end end |
#icon ⇒ Hash?
Returns obtained Hash.
217 218 219 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 217 def icon self["icon"] end |
#inspect ⇒ String (frozen)
222 223 224 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 222 def inspect "#{self.class.name}-#{@id}" end |
#json_properties ⇒ Hash
Returns json properties.
227 228 229 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 227 def json_properties @json && @json["properties"] end |
#last_edited_time ⇒ NotionRubyMapping::LastEditedTimeProperty
232 233 234 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 232 def last_edited_time @last_edited_time ||= LastEditedTimeProperty.new("__timestamp__", json: self["last_edited_time"]) end |
#new_record? ⇒ Boolean
Returns true if new record.
238 239 240 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 238 def new_record? @new_record end |
#page? ⇒ TrueClass, FalseClass
Returns true if Page object.
243 244 245 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 243 def page? is_a? Page end |
#parent(dry_run: false) ⇒ Object
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 248 def parent(dry_run: false) parent_json = @json && @json["parent"] raise StandardError, "Unknown parent" if parent_json.nil? type = parent_json["type"] klass = case type when "database_id" Database when "page_id" Page when "block_id" Block else raise StandardError, "List does not have any parent" end klass.find parent_json[type], dry_run: dry_run end |
#parent_id ⇒ Object
266 267 268 269 270 271 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 266 def parent_id parent_json = @json && @json["parent"] raise StandardError, "Unknown parent" if parent_json.nil? parent_json[parent_json["type"]] end |
#properties ⇒ NotionRubyMapping::PropertyCache
Returns get or created PropertyCache object.
275 276 277 278 279 280 281 282 283 284 285 286 287 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 275 def properties unless @property_cache unless @json raise StandardError, "Unknown id" if @id.nil? reload end @property_cache = PropertyCache.new json_properties, base_type: database? ? "database" : "page", page_id: page? ? @id : nil end @property_cache end |
#property_values_json ⇒ Hash
Returns created json for update page.
290 291 292 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 290 def property_values_json @payload.property_values_json @property_cache end |
#reload ⇒ NotionRubyMapping::Base
Returns reloaded self.
295 296 297 298 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 295 def reload update_json reload_json self end |
#restore_from_json ⇒ NotionRubyMapping::Base
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 301 def restore_from_json return if (ps = @json["properties"]).nil? properties.json = json_properties return unless is_a?(Page) || is_a?(Database) ps.each do |key, json| if json["type"] properties[key].update_from_json json else properties[key]&.clear_will_update end end self end |
#save(dry_run: false) ⇒ NotionRubyMapping::Base, ...
320 321 322 323 324 325 326 327 328 329 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 320 def save(dry_run: false) if dry_run @new_record ? create(dry_run: true) : update(dry_run: true) else @new_record ? create : update @property_cache.clear_will_update if page? @payload.clear self end end |
#set_cover(url: nil, file_upload_object: nil) ⇒ NotionRubyMapping::Base
334 335 336 337 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 334 def set_cover(url: nil, file_upload_object: nil) @payload.set_cover(url: url, file_upload_object: file_upload_object) if page? || database? self end |
#set_icon(emoji: nil, url: nil, file_upload_object: nil) ⇒ NotionRubyMapping::Base
345 346 347 348 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 345 def set_icon(emoji: nil, url: nil, file_upload_object: nil) @payload.set_icon(emoji: emoji, url: url, file_upload_object: file_upload_object) if page? || database? self end |
#synced_block_original? ⇒ FalseClass
Return false except block
351 352 353 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 351 def synced_block_original? false end |
#update_json(json) ⇒ NotionRubyMapping::Base
357 358 359 360 361 362 363 364 365 366 367 |
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 357 def update_json(json) unless json["object"] != "error" && (@json.nil? || @json["type"] == json["type"]) raise StandardError, json.inspect end @json = json @id = @nc.hex_id(@json["id"]) restore_from_json self end |