Module: Notion::Compat

Defined in:
lib/notion/compat.rb

Class Method Summary collapse

Class Method Details

.downgrade(value, version) ⇒ Object



22
23
24
25
26
27
28
# File 'lib/notion/compat.rb', line 22

def downgrade(value, version)
  case value
  when Array then value.map { |item| downgrade(item, version) }
  when Hash then value.to_h { |key, item| downgrade_pair(key, item, version) }
  else value
  end
end

.downgrade_key(key, version) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/notion/compat.rb', line 54

def downgrade_key(key, version)
  key = key.to_s
  return "archived" if key == "in_trash"
  return "transcription" if version == "2025-09-03" && key == "meeting_notes"
  return "database_id" if version == "2022-06-28" && key == "data_source_id"

  key
end

.downgrade_pair(key, item, version) ⇒ Object



30
31
32
33
34
35
36
37
38
39
# File 'lib/notion/compat.rb', line 30

def downgrade_pair(key, item, version)
  reject_meeting_notes!(key, item, version)
  if key.to_s == "position" && item.is_a?(Hash) && item["type"] == "after_block"
    return ["after", item.dig("after_block", "id")]
  end

  new_key = downgrade_key(key, version)
  new_item = downgrade_value(key, item, version)
  [new_key, new_item]
end

.downgrade_value(key, item, version) ⇒ Object



48
49
50
51
52
# File 'lib/notion/compat.rb', line 48

def downgrade_value(key, item, version)
  return "transcription" if key.to_s == "type" && item == "meeting_notes"

  downgrade(item, version)
end

.normalize(value, version) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
# File 'lib/notion/compat.rb', line 63

def normalize(value, version)
  value.each_with_object({}) do |(key, item), result|
    new_key = { "archived" => "in_trash", "transcription" => "meeting_notes" }.fetch(key, key)
    new_key = "data_source_id" if version == "2022-06-28" && new_key == "database_id"
    result[new_key] = if key == "type" && item == "transcription"
                        "meeting_notes"
                      else
                        normalize_value(item, version)
                      end
  end
end

.normalize_value(item, version) ⇒ Object



75
76
77
78
79
80
81
# File 'lib/notion/compat.rb', line 75

def normalize_value(item, version)
  case item
  when Hash then normalize(item, version)
  when Array then item.map { |entry| normalize_value(entry, version) }
  else item
  end
end

.reject_meeting_notes!(key, item, version) ⇒ Object



41
42
43
44
45
46
# File 'lib/notion/compat.rb', line 41

def reject_meeting_notes!(key, item, version)
  meeting_notes = key.to_s == "meeting_notes" || (key.to_s == "type" && item == "meeting_notes")
  return unless version == "2022-06-28" && meeting_notes

  raise UnsupportedInVersionError, "meeting_notes is unavailable in Notion API #{version}"
end

.reject_unsupported!(version, path) ⇒ Object



83
84
85
86
87
88
89
90
91
92
# File 'lib/notion/compat.rb', line 83

def reject_unsupported!(version, path)
  return if version == "2026-03-11"

  unsupported = path.match?(%r{\A/v1/(views|agents|sessions)(?=/|\z)}) || path.end_with?("/markdown")
  unsupported ||= path.match?(%r{\A/v1/blocks/meeting_notes(?=/|\z)})
  unsupported ||= version == "2022-06-28" && path.match?(%r{\A/v1/data_sources/[^/]+/templates})
  return unless unsupported

  raise UnsupportedInVersionError, "#{path} is unavailable in Notion API #{version}"
end

.request(version, request) ⇒ Object



7
8
9
10
11
12
13
14
# File 'lib/notion/compat.rb', line 7

def request(version, request)
  reject_unsupported!(version, request.path)
  return request if version == "2026-03-11"

  path = request.path
  path = path.sub(%r{\A/v1/data_sources(?=/|\z)}, "/v1/databases") if version == "2022-06-28"
  request.with(path: path, body: downgrade(request.body, version))
end

.response(version, response) ⇒ Object



16
17
18
19
20
# File 'lib/notion/compat.rb', line 16

def response(version, response)
  return response if version == "2026-03-11" || !response.body.is_a?(Hash)

  response.with(body: normalize(response.body, version))
end