Class: NotionRubyMapping::Base

Inherits:
Object
  • Object
show all
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.

Direct Known Subclasses

Block, DataSource, Database, List, Page

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(json: nil, id: nil, assign: [], parent: nil, template_page: nil) ⇒ Base

Returns a new instance of Base.

Parameters:

  • json (Hash, nil) (defaults to: nil)
  • id (String, nil) (defaults to: nil)
  • assign (Array<Property, Class, String>) (defaults to: [])

Raises:

  • (StandardError)


10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 10

def initialize(json: nil, id: nil, assign: [], parent: nil, template_page: 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_json = {}
  payload_json["parent"] = parent if !is_a?(Block) && parent
  if template_page == "default"
    payload_json["template"] = {"type" => "default"}
  elsif template_page
    payload_json["template"] = {"type" => "template_id", "template_id" => template_page.id}
  end
  @payload = Payload.new(payload_json)
  @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

#archivedObject (readonly)

Returns the value of attribute archived.



35
36
37
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 35

def archived
  @archived
end

#has_childrenObject (readonly)

Returns the value of attribute has_children.



35
36
37
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 35

def has_children
  @has_children
end

#idObject (readonly)

Returns the value of attribute id.



35
36
37
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 35

def id
  @id
end

#jsonObject (readonly)

Returns the value of attribute json.



35
36
37
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 35

def json
  @json
end

Class Method Details

.block_id(str) ⇒ Object



56
57
58
59
60
61
62
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 56

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

Parameters:

  • json (Hash, Notion::Messages)

Returns:



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 39

def self.create_from_json(json)
  case json["object"]
  when "page"
    Page.new json: json
  when "data_source"
    DataSource.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

.data_source_id(str) ⇒ String

Returns data_source_id.

Parameters:

  • str (String)

    id or URL

Returns:

  • (String)

    data_source_id



66
67
68
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 66

def self.data_source_id(str)
  NotionCache.instance.hex_id str
end

.database_id(str) ⇒ String

Returns database_id.

Parameters:

  • str (String)

    id or URL

Returns:

  • (String)

    database_id



72
73
74
75
76
77
78
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 72

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

Parameters:

  • method (Symbol)
  • path (Object)
  • json (nil) (defaults to: nil)


83
84
85
86
87
88
89
90
91
92
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 83

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: #{NotionRubyMapping::NOTION_VERSION}'",
    "  -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



94
95
96
97
98
99
100
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 94

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

Parameters:

  • blocks (Array<Block>)
  • after (String, nil) (defaults to: nil)

    block id of previous block

  • dry_run (Boolean) (defaults to: false)

    true if dry_run

Returns:

Raises:

  • (StandardError)

See Also:



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 143

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

Parameters:

Raises:

  • (StandardError)


167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 167

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.

Parameters:

Returns:



184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 184

def assign_property(klass, title)
  @property_cache ||= PropertyCache.new({},
                                        base_type: if database?
                                                     "database"
                                                   else
                                                     data_source? ? "data_source" : "page"
                                                   end,
                                        page_id: page? ? @id : nil)
  property = if database?
               klass.new(title, will_update: new_record?, base_type: "database")
             elsif data_source?
               klass.new(title, will_update: new_record?, base_type: "data_source")
             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.

Returns:

  • (TrueClass, FalseClass)

    true if Block object



204
205
206
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 204

def block?
  is_a? Block
end

#children(query = Query.new, dry_run: false) ⇒ NotionRubyMapping::List, String

Parameters:

Returns:



211
212
213
214
215
216
217
218
219
220
221
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 211

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

Parameters:

  • dry_run (Boolean) (defaults to: false)

    true if dry_run



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 103

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

#coverHash?

Returns obtained Hash.

Returns:

  • (Hash, nil)

    obtained Hash



224
225
226
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 224

def cover
  self["cover"]
end

#created_timeNotionRubyMapping::CreatedTimeProperty



229
230
231
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 229

def created_time
  @created_time ||= CreatedTimeProperty.new("__timestamp__", json: self["created_time"])
end

#data_source?TrueClass, FalseClass

Returns true if Database object.

Returns:

  • (TrueClass, FalseClass)

    true if Database object



239
240
241
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 239

def data_source?
  is_a? DataSource
end

#database?TrueClass, FalseClass

Returns true if Database object.

Returns:

  • (TrueClass, FalseClass)

    true if Database object



234
235
236
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 234

def database?
  is_a? Database
end

#get(key) ⇒ NotionRubyMapping::PropertyCache, Hash

Returns obtained Page value or PropertyCache.

Parameters:

  • key (String)

Returns:



123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 123

def get(key)
  unless @json
    raise StandardError, "Unknown id" if @id.nil?

    reload
  end
  case key
  when "properties"
    properties
  else
    @json[key]
  end
end

#iconHash?

Returns obtained Hash.



245
246
247
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 245

def icon
  self["icon"]
end

#inspectString (frozen)

Returns:

  • (String (frozen))


250
251
252
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 250

def inspect
  "#{self.class.name}-#{@id}"
end

#json_propertiesHash

Returns json properties.

Returns:

  • (Hash)

    json properties



255
256
257
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 255

def json_properties
  @json && @json["properties"]
end

#last_edited_timeNotionRubyMapping::LastEditedTimeProperty



260
261
262
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 260

def last_edited_time
  @last_edited_time ||= LastEditedTimeProperty.new("__timestamp__", json: self["last_edited_time"])
end

#new_record?Boolean

Returns true if new record.



266
267
268
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 266

def new_record?
  @new_record
end

#page?TrueClass, FalseClass

Returns true if Page object.

Returns:

  • (TrueClass, FalseClass)

    true if Page object



271
272
273
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 271

def page?
  is_a? Page
end

#parent(dry_run: false) ⇒ Object

Parameters:

  • dry_run (Boolean) (defaults to: false)

    true if dry_run

Raises:

  • (StandardError)


276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 276

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_idObject

Raises:

  • (StandardError)


294
295
296
297
298
299
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 294

def parent_id
  parent_json = @json && @json["parent"]
  raise StandardError, "Unknown parent" if parent_json.nil?

  parent_json[parent_json["type"]]
end

#propertiesNotionRubyMapping::PropertyCache

Returns get or created PropertyCache object.



303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 303

def properties
  unless @property_cache
    unless @json
      raise StandardError, "Unknown id" if @id.nil?

      reload
    end
    @property_cache = PropertyCache.new json_properties,
                                        base_type: if database?
                                                     "database"
                                                   else
                                                     data_source? ? "data_source" : "page"
                                                   end,
                                        page_id: page? ? @id : nil
  end
  @property_cache
end

#property_values_jsonHash

Returns created json for update page.

Returns:

  • (Hash)

    created json for update page



322
323
324
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 322

def property_values_json
  @payload.property_values_json @property_cache
end

#reloadNotionRubyMapping::Base

Returns reloaded self.

Returns:



327
328
329
330
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 327

def reload
  update_json reload_json
  self
end

#restore_from_jsonNotionRubyMapping::Base



333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 333

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, ...

Parameters:

  • dry_run (Boolean) (defaults to: false)

    true if dry_run

Returns:

See Also:



352
353
354
355
356
357
358
359
360
361
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 352

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

Parameters:

  • url (String, nil) (defaults to: nil)
  • file_upload_object (String, nil) (defaults to: nil)

Returns:



366
367
368
369
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 366

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

Parameters:

  • emoji (String, nil) (defaults to: nil)
  • url (String, nil) (defaults to: nil)
  • file_upload_object (FileUploadObject, nil) (defaults to: nil)

Returns:

See Also:



377
378
379
380
381
382
383
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 377

def set_icon(emoji: nil, url: nil, file_upload_object: nil)
  if page? || database? || data_source?
    @payload.set_icon(emoji: emoji, url: url,
                      file_upload_object: file_upload_object)
  end
  self
end

#synced_block_original?FalseClass

Return false except block

Returns:

  • (FalseClass)

    return false except block



386
387
388
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 386

def synced_block_original?
  false
end

#update_json(json) ⇒ NotionRubyMapping::Base

Parameters:

  • json (Hash)

Returns:



392
393
394
395
396
397
398
399
400
401
402
# File 'lib/notion_ruby_mapping/blocks/base.rb', line 392

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