notion 1.1.2 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3114ccf59f80a17322c559fce61050e7e7f1908a279e8786c4a8fe87e6fa79d8
4
- data.tar.gz: a7c6fea5eb18a4d962117a4a5120bc357e0bf038640ba39db821d5bc3de230e6
3
+ metadata.gz: a6dfa3bb58bd4850c061ed6cf0efbb11ad3548f9dbcfb773b04fdb36d99cf356
4
+ data.tar.gz: 1be5e4c8dc4975fc2de62bc802b296b283cff406a943d3f5fa88980ecfa07b65
5
5
  SHA512:
6
- metadata.gz: '06202342711853b35c0d694b4de7c89aec269f226d5ceda2c6b4e086f61f6e8f3e7381ca1d0389d85c2b3814d849dd980d9d6b3492a9d2a3d9c8bf9fbad71939'
7
- data.tar.gz: 7561a58fff0a26b4190a79c713a4f89c3f85c1c5cca4bca21e2c9013ea3fa981f32e8779e9b771b243fe41a65c5b717f9a09e675e9c9590c3a09cf1f344ca02b
6
+ metadata.gz: 6291929f81e39755067265260f3ff94d4e691f420713af7cb7a1b7505a9ab097bdd78720bcc2d344df555cc20b106203aae0bd09eea52a041e8c4a8057b9b4a8
7
+ data.tar.gz: de33fa730ee063bb6e54877ce959e1ca7f8bde1345ae90db9c1a368e8c08ad37dec54f473d99c38c6bc26f3e97e17741bba92e3b09cd1d6cb64b5fdce629723b
data/README.md CHANGED
@@ -317,5 +317,5 @@ Then, it can be retrieved with the following code:
317
317
  >>> @client = NotionAPI::Client.new(
318
318
  "<insert_v2_token_here>"
319
319
  )
320
- >>> @client.get_page(https://www.notion.so/danmurphy/[page-id]?v=[view-id])
320
+ >>> @client.get_page("https://www.notion.so/danmurphy/[page-id]?v=[view-id]")
321
321
  ```
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'utils'
4
- require 'httparty'
3
+ require_relative "utils"
4
+ require "httparty"
5
5
 
6
6
  module NotionAPI
7
7
  # the initial methods available to an instantiated Cloent object are defined
8
8
  class Core
9
9
  include Utils
10
- @options = { 'cookies' => { :token_v2 => nil, 'x-active-user-header' => nil }, 'headers' => { 'Content-Type' => 'application/json' } }
11
- @type_whitelist = 'divider'
10
+ @options = { "cookies" => { :token_v2 => nil, "x-active-user-header" => nil }, "headers" => { "Content-Type" => "application/json" } }
11
+ @type_whitelist = "divider"
12
12
 
13
13
  class << self
14
14
  attr_reader :options, :type_whitelist, :token_v2, :active_user_header
@@ -30,39 +30,16 @@ module NotionAPI
30
30
  pageId: clean_id,
31
31
  chunkNumber: 0,
32
32
  limit: 100,
33
- verticalColumns: false
33
+ verticalColumns: false,
34
34
  }
35
- jsonified_record_response = get_all_block_info(clean_id, request_body)
36
- i = 0
37
- while jsonified_record_response.empty? || jsonified_record_response['block'].empty?
38
- return {} if i >= 10
35
+ jsonified_record_response = get_all_block_info(request_body)
39
36
 
40
- jsonified_record_response = get_all_block_info(clean_id, request_body)
41
- i += 1
42
- end
43
-
44
- block_id = clean_id
45
37
  block_type = extract_type(clean_id, jsonified_record_response)
46
38
  block_parent_id = extract_parent_id(clean_id, jsonified_record_response)
47
39
 
48
- raise 'the URL or ID passed to the get_page method must be that of a Page Block.' if !['collection_view_page', 'page'].include?(block_type)
49
-
50
- if block_type == "page"
51
- block_title = extract_title(clean_id, jsonified_record_response)
52
- PageBlock.new(block_id, block_title, block_parent_id)
53
- elsif block_type == "collection_view_page"
54
- collection_id = extract_collection_id(block_id, jsonified_record_response)
55
- block_title = extract_collection_title(clean_id, collection_id, jsonified_record_response)
56
- view_id = extract_view_ids(block_id, jsonified_record_response)[0]
57
- schema = extract_collection_schema(collection_id, view_id, jsonified_record_response)
58
- column_mappings = schema.keys
59
- column_names = column_mappings.map { |mapping| schema[mapping]['name']}
60
-
61
- collection_view_page = CollectionViewPage.new(block_id, block_title, block_parent_id, collection_id, view_id)
62
- collection_view_page.instance_variable_set(:@column_names, column_names)
63
- CollectionView.class_eval{attr_reader :column_names}
64
- collection_view_page
65
- end
40
+ raise ArgumentError, "the URL or ID passed to the get_page method must be that of a Page Block." if !["collection_view_page", "page"].include?(block_type)
41
+
42
+ get_instantiated_instance_for(block_type, clean_id, block_parent_id, jsonified_record_response)
66
43
  end
67
44
 
68
45
  def children(url_or_id = @id)
@@ -87,18 +64,12 @@ module NotionAPI
87
64
  pageId: clean_id,
88
65
  chunkNumber: 0,
89
66
  limit: 100,
90
- verticalColumns: false
67
+ verticalColumns: false,
91
68
  }
92
- jsonified_record_response = get_all_block_info(clean_id, request_body)
93
- i = 0
94
- while jsonified_record_response.empty?
95
- return {} if i >= 10
69
+ jsonified_record_response = get_all_block_info(request_body)
96
70
 
97
- jsonified_record_response = get_all_block_info(clean_id, request_body)
98
- i += 1
99
- end
100
-
101
- jsonified_record_response['block'][clean_id]['value']['content'] || []
71
+ # if no content, returns empty list
72
+ jsonified_record_response["block"][clean_id]["value"]["content"] || []
102
73
  end
103
74
 
104
75
  private
@@ -106,19 +77,19 @@ module NotionAPI
106
77
  def get_notion_id(body)
107
78
  # ! retrieves a users ID from the headers of a Notion response object.
108
79
  # ! body -> the body to send in the request : ``Hash``
109
- Core.options['cookies'][:token_v2] = @@token_v2
110
- Core.options['headers']['x-notion-active-user-header'] = @@active_user_header
111
- cookies = Core.options['cookies']
112
- headers = Core.options['headers']
80
+ Core.options["cookies"][:token_v2] = @@token_v2
81
+ Core.options["headers"]["x-notion-active-user-header"] = @@active_user_header
82
+ cookies = Core.options["cookies"]
83
+ headers = Core.options["headers"]
113
84
  request_url = URLS[:GET_BLOCK]
114
85
 
115
86
  response = HTTParty.post(
116
87
  request_url,
117
88
  body: body.to_json,
118
89
  cookies: cookies,
119
- headers: headers
90
+ headers: headers,
120
91
  )
121
- response.headers['x-notion-user-id']
92
+ response.headers["x-notion-user-id"]
122
93
  end
123
94
 
124
95
  def get_last_page_block_id(url_or_id)
@@ -132,48 +103,53 @@ module NotionAPI
132
103
  pageId: clean_id,
133
104
  chunkNumber: 0,
134
105
  limit: 100,
135
- verticalColumns: false
106
+ verticalColumns: false,
136
107
  }
137
- jsonified_record_response = get_all_block_info(clean_id, request_body)
138
- i = 0
139
- while jsonified_record_response.empty?
140
- return {:properties => {title: [[block_title]]}, :format => {}} if i >= 10
108
+ jsonified_record_response = get_all_block_info(request_body)
141
109
 
142
- jsonified_record_response = get_all_block_info(clean_id, request_body)
143
- i += 1
144
- end
145
- properties = jsonified_record_response['block'][clean_id]['value']['properties']
146
- formats = jsonified_record_response['block'][clean_id]['value']['format']
110
+ properties = jsonified_record_response["block"][clean_id]["value"]["properties"]
111
+ formats = jsonified_record_response["block"][clean_id]["value"]["format"]
147
112
  return {
148
- :properties => properties,
149
- :format => formats
150
- }
113
+ :properties => properties,
114
+ :format => formats,
115
+ }
151
116
  end
152
117
 
153
- def get_all_block_info(_clean_id, body)
118
+ def get_all_block_info(body, i = 0)
154
119
  # ! retrieves all info pertaining to a block Id.
155
120
  # ! clean_id -> the block ID or URL cleaned : ``str``
156
- Core.options['cookies'][:token_v2] = @@token_v2
157
- Core.options['headers']['x-notion-active-user-header'] = @@active_user_header
158
- cookies = Core.options['cookies']
159
- headers = Core.options['headers']
160
-
121
+ Core.options["cookies"][:token_v2] = @@token_v2
122
+ Core.options["headers"]["x-notion-active-user-header"] = @@active_user_header
123
+ cookies = Core.options["cookies"]
124
+ headers = Core.options["headers"]
161
125
  request_url = URLS[:GET_BLOCK]
162
126
 
163
127
  response = HTTParty.post(
164
128
  request_url,
165
129
  body: body.to_json,
166
130
  cookies: cookies,
167
- headers: headers
131
+ headers: headers,
168
132
  )
169
133
 
170
- JSON.parse(response.body)['recordMap']
134
+ jsonified_record_response = JSON.parse(response.body)["recordMap"]
135
+ response_invalid = (!jsonified_record_response || jsonified_record_response.empty? || jsonified_record_response["block"].empty?)
136
+
137
+ if i < 10 && response_invalid
138
+ i = i + 1
139
+ return get_all_block_info(body, i)
140
+ else
141
+ if i == 10 && response_invalid
142
+ raise InvalidClientInstantiationError, "Attempted to retrieve block 10 times and received an empty response each time. Please make sure you have a valid token_v2 value set. If you do, then try setting the 'active_user_header' variable as well."
143
+ else
144
+ return jsonified_record_response
145
+ end
146
+ end
171
147
  end
172
148
 
173
149
  def filter_nil_blocks(jsonified_record_response)
174
150
  # ! removes any blocks that are empty [i.e. have no title / content]
175
151
  # ! jsonified_record_responses -> parsed JSON representation of a notion response object : ``Json``
176
- jsonified_record_response.empty? || jsonified_record_response['block'].empty? ? nil : jsonified_record_response['block']
152
+ jsonified_record_response.empty? || jsonified_record_response["block"].empty? ? nil : jsonified_record_response["block"]
177
153
  end
178
154
 
179
155
  def extract_title(clean_id, jsonified_record_response)
@@ -181,14 +157,13 @@ module NotionAPI
181
157
  # ! clean_id -> the cleaned block ID: ``str``
182
158
  # ! jsonified_record_response -> parsed JSON representation of a notion response object : ``Json``
183
159
  filter_nil_blocks = filter_nil_blocks(jsonified_record_response)
184
- if filter_nil_blocks.nil? || filter_nil_blocks[clean_id].nil? || filter_nil_blocks[clean_id]['value']['properties'].nil?
160
+ if filter_nil_blocks.nil? || filter_nil_blocks[clean_id].nil? || filter_nil_blocks[clean_id]["value"]["properties"].nil?
185
161
  nil
186
162
  else
187
163
  # titles for images are called source, while titles for text-based blocks are called title, so lets dynamically grab it
188
164
  # https://stackoverflow.com/questions/23765996/get-all-keys-from-ruby-hash/23766007
189
- title_value = filter_nil_blocks[clean_id]['value']['properties'].keys[0]
190
- Core.type_whitelist.include?(filter_nil_blocks[clean_id]['value']['type']) ? nil : jsonified_record_response['block'][clean_id]['value']['properties'][title_value].flatten[0]
191
-
165
+ title_value = filter_nil_blocks[clean_id]["value"]["properties"].keys[0]
166
+ Core.type_whitelist.include?(filter_nil_blocks[clean_id]["value"]["type"]) ? nil : jsonified_record_response["block"][clean_id]["value"]["properties"][title_value].flatten[0]
192
167
  end
193
168
  end
194
169
 
@@ -197,7 +172,7 @@ module NotionAPI
197
172
  # ! clean_id -> the cleaned block ID: ``str``
198
173
  # ! collection_id -> the collection ID: ``str``
199
174
  # ! jsonified_record_response -> parsed JSON representation of a notion response object : ``Json``
200
- jsonified_record_response['collection'][collection_id]['value']['name'].flatten.join if jsonified_record_response['collection'] and jsonified_record_response['collection'][collection_id]['value']['name']
175
+ jsonified_record_response["collection"][collection_id]["value"]["name"].flatten.join if jsonified_record_response["collection"] and jsonified_record_response["collection"][collection_id]["value"]["name"]
201
176
  end
202
177
 
203
178
  def extract_type(clean_id, jsonified_record_response)
@@ -208,8 +183,7 @@ module NotionAPI
208
183
  if filter_nil_blocks.nil?
209
184
  nil
210
185
  else
211
- filter_nil_blocks[clean_id]['value']['type']
212
-
186
+ filter_nil_blocks[clean_id]["value"]["type"]
213
187
  end
214
188
  end
215
189
 
@@ -217,46 +191,46 @@ module NotionAPI
217
191
  # ! extract parent ID from core JSON response object.
218
192
  # ! clean_id -> the block ID or URL cleaned : ``str``
219
193
  # ! jsonified_record_response -> parsed JSON representation of a notion response object : ``Json``
220
- jsonified_record_response.empty? || jsonified_record_response['block'].empty? ? {} : jsonified_record_response['block'][clean_id]['value']['parent_id']
194
+ jsonified_record_response.empty? || jsonified_record_response["block"].empty? ? {} : jsonified_record_response["block"][clean_id]["value"]["parent_id"]
221
195
  end
222
196
 
223
197
  def extract_collection_id(clean_id, jsonified_record_response)
224
198
  # ! extract the collection ID
225
199
  # ! clean_id -> the block ID or URL cleaned : ``str``
226
200
  # ! jsonified_record_response -> parsed JSON representation of a notion response object : ``Json``
227
- jsonified_record_response['block'][clean_id]['value']['collection_id']
201
+ jsonified_record_response["block"][clean_id]["value"]["collection_id"]
228
202
  end
229
203
 
230
204
  def extract_view_ids(clean_id, jsonified_record_response)
231
- jsonified_record_response['block'][clean_id]['value']['view_ids'] || []
205
+ jsonified_record_response["block"][clean_id]["value"]["view_ids"] || []
232
206
  end
233
-
207
+
234
208
  def extract_id(url_or_id)
235
209
  # ! parse and clean the URL or ID object provided.
236
210
  # ! url_or_id -> the block ID or URL : ``str``
237
211
  http_or_https = url_or_id.match(/^(http|https)/) # true if http or https in url_or_id...
238
212
  collection_view_match = url_or_id.match(/(\?v=)/)
239
213
 
240
- if (url_or_id.length == 36) && ((url_or_id.split('-').length == 5) && !http_or_https)
214
+ if (url_or_id.length == 36) && ((url_or_id.split("-").length == 5) && !http_or_https)
241
215
  # passes if url_or_id is perfectly formatted already...
242
216
  url_or_id
243
- elsif (http_or_https && (url_or_id.split('-').last.length == 32)) || (!http_or_https && (url_or_id.length == 32)) || (collection_view_match)
217
+ elsif (http_or_https && (url_or_id.split("-").last.length == 32)) || (!http_or_https && (url_or_id.length == 32)) || (collection_view_match)
244
218
  # passes if either:
245
219
  # 1. a URL is passed as url_or_id and the ID at the end is 32 characters long or
246
220
  # 2. a URL is not passed and the ID length is 32 [aka unformatted]
247
221
  pattern = [8, 13, 18, 23]
248
222
  if collection_view_match
249
- id_without_view = url_or_id.split('?')[0]
250
- clean_id = id_without_view.split('/').last
251
- pattern.each { |index| clean_id.insert(index, '-') }
223
+ id_without_view = url_or_id.split("?")[0]
224
+ clean_id = id_without_view.split("/").last
225
+ pattern.each { |index| clean_id.insert(index, "-") }
252
226
  clean_id
253
227
  else
254
- id = url_or_id.split('-').last
255
- pattern.each { |index| id.insert(index, '-') }
228
+ id = url_or_id.split("-").last
229
+ pattern.each { |index| id.insert(index, "-") }
256
230
  id
257
231
  end
258
232
  else
259
- raise ArgumentError, 'Expected a Notion page URL or a page ID. Please consult the documentation for further information.'
233
+ raise ArgumentError, "Expected a Notion page URL or a page ID. Please consult the documentation for further information."
260
234
  end
261
235
  end
262
236
 
@@ -264,42 +238,88 @@ module NotionAPI
264
238
  # ! retrieve the collection scehma. Useful for 'building' the backbone for a table.
265
239
  # ! collection_id -> the collection ID : ``str``
266
240
  # ! view_id -> the view ID : ``str``
267
- cookies = Core.options['cookies']
268
- headers = Core.options['headers']
241
+ cookies = Core.options["cookies"]
242
+ headers = Core.options["headers"]
269
243
 
270
244
  if response.empty?
271
- query_collection_hash = Utils::CollectionViewComponents.query_collection(collection_id, view_id, '')
245
+ query_collection_hash = Utils::CollectionViewComponents.query_collection(collection_id, view_id, "")
272
246
 
273
247
  request_url = URLS[:GET_COLLECTION]
274
248
  response = HTTParty.post(
275
249
  request_url,
276
250
  body: query_collection_hash.to_json,
277
251
  cookies: cookies,
278
- headers: headers
252
+ headers: headers,
279
253
  )
280
- response['recordMap']['collection'][collection_id]['value']['schema']
254
+ response["recordMap"]["collection"][collection_id]["value"]["schema"]
281
255
  else
282
- response['collection'][collection_id]['value']['schema']
256
+ response["collection"][collection_id]["value"]["schema"]
283
257
  end
284
258
  end
285
-
259
+
286
260
  def extract_collection_data(collection_id, view_id)
287
261
  # ! retrieve the collection scehma. Useful for 'building' the backbone for a table.
288
262
  # ! collection_id -> the collection ID : ``str``
289
263
  # ! view_id -> the view ID : ``str``
290
- cookies = Core.options['cookies']
291
- headers = Core.options['headers']
264
+ cookies = Core.options["cookies"]
265
+ headers = Core.options["headers"]
292
266
 
293
- query_collection_hash = Utils::CollectionViewComponents.query_collection(collection_id, view_id, '')
267
+ query_collection_hash = Utils::CollectionViewComponents.query_collection(collection_id, view_id, "")
294
268
 
295
269
  request_url = URLS[:GET_COLLECTION]
296
270
  response = HTTParty.post(
297
271
  request_url,
298
272
  body: query_collection_hash.to_json,
299
273
  cookies: cookies,
300
- headers: headers
274
+ headers: headers,
301
275
  )
302
- response['recordMap']
276
+ response["recordMap"]
277
+ end
278
+
279
+ def extract_page_information(page_meta = {})
280
+ # ! helper method for extracting information about a page block
281
+ # ! page_meta -> hash containing data points useful for the extraction of a page blocks information.
282
+ # ! This should include clean_id, jsonified_record_response, and parent_id
283
+ clean_id = page_meta.fetch(:clean_id)
284
+ jsonified_record_response = page_meta.fetch(:jsonified_record_response)
285
+ block_parent_id = page_meta.fetch(:parent_id)
286
+
287
+ block_title = extract_title(clean_id, jsonified_record_response)
288
+ PageBlock.new(clean_id, block_title, block_parent_id)
289
+ end
290
+
291
+ def extract_collection_view_page_information(page_meta = {})
292
+ # ! helper method for extracting information about a Collection View page block
293
+ # ! page_meta -> hash containing data points useful for the extraction of a page blocks information.
294
+ # ! This should include clean_id, jsonified_record_response, and parent_id
295
+ clean_id = page_meta.fetch(:clean_id)
296
+ jsonified_record_response = page_meta.fetch(:jsonified_record_response)
297
+ block_parent_id = page_meta.fetch(:parent_id)
298
+
299
+ collection_id = extract_collection_id(clean_id, jsonified_record_response)
300
+ block_title = extract_collection_title(clean_id, collection_id, jsonified_record_response)
301
+ view_id = extract_view_ids(clean_id, jsonified_record_response)[0]
302
+ schema = extract_collection_schema(collection_id, view_id, jsonified_record_response)
303
+ column_names = NotionAPI::CollectionView.extract_collection_view_column_names(schema)
304
+
305
+ collection_view_page = CollectionViewPage.new(clean_id, block_title, block_parent_id, collection_id, view_id)
306
+ collection_view_page.instance_variable_set(:@column_names, column_names)
307
+ CollectionView.class_eval { attr_reader :column_names }
308
+ collection_view_page
309
+ end
310
+
311
+ def get_instantiated_instance_for(block_type, clean_id, parent_id, jsonified_record_response)
312
+ case block_type
313
+ when "page" then extract_page_information(clean_id: clean_id, parent_id: parent_id, jsonified_record_response: jsonified_record_response)
314
+ when "collection_view_page" then extract_collection_view_page_information(clean_id: clean_id, parent_id: parent_id, jsonified_record_response: jsonified_record_response)
315
+ end
316
+ end
317
+
318
+ class InvalidClientInstantiationError < StandardError
319
+ def initialize(msg = "Custom exception that is raised when an invalid property type is passed as a mapping.", exception_type = "instantiation_type")
320
+ @exception_type = exception_type
321
+ super(msg)
322
+ end
303
323
  end
304
324
  end
305
325
  end
@@ -1,16 +1,16 @@
1
1
  module NotionAPI
2
2
 
3
- # Code block: used to store code, should be assigned a coding language.
4
- class CodeBlock < BlockTemplate
5
- @notion_type = 'code'
6
- @type = 'code'
7
-
8
- def type
9
- NotionAPI::CodeBlock.notion_type
10
- end
11
-
12
- class << self
13
- attr_reader :notion_type, :type
14
- end
3
+ # Code block: used to store code, should be assigned a coding language.
4
+ class CodeBlock < BlockTemplate
5
+ @notion_type = "code"
6
+ @type = "code"
7
+
8
+ def type
9
+ NotionAPI::CodeBlock.notion_type
10
+ end
11
+
12
+ class << self
13
+ attr_reader :notion_type, :type
15
14
  end
16
- end
15
+ end
16
+ end
@@ -158,20 +158,11 @@ module NotionAPI
158
158
  limit: 100,
159
159
  verticalColumns: false,
160
160
  }
161
- jsonified_record_response = get_all_block_info(clean_id, request_body)
162
-
163
- i = 0
164
- while jsonified_record_response.empty? || jsonified_record_response["block"].empty?
165
- return {} if i >= 10
166
-
167
- jsonified_record_response = get_all_block_info(clean_id, request_body)
168
- i += 1
169
- end
161
+ jsonified_record_response = get_all_block_info(request_body)
170
162
 
171
163
  collection_data = extract_collection_data(@collection_id, @view_id)
172
164
  schema = collection_data["collection"][collection_id]["value"]["schema"]
173
- column_mappings = schema.keys
174
- column_names = column_mappings.map { |mapping| schema[mapping]["name"] }
165
+ column_names = NotionAPI::CollectionView.extract_collection_view_column_names(schema)
175
166
 
176
167
  collection_row = CollectionViewRow.new(row_id, @parent_id, @collection_id, @view_id)
177
168
  collection_row.instance_variable_set(:@column_names, column_names)
@@ -194,29 +185,20 @@ module NotionAPI
194
185
  verticalColumns: false,
195
186
  }
196
187
 
197
- jsonified_record_response = get_all_block_info(clean_id, request_body)
198
- i = 0
199
- while jsonified_record_response.empty? || jsonified_record_response["block"].empty?
200
- return {} if i >= 10
201
-
202
- jsonified_record_response = get_all_block_info(clean_id, request_body)
203
- i += 1
204
- end
188
+ jsonified_record_response = get_all_block_info(request_body)
205
189
 
206
190
  jsonified_record_response["collection_view"][@view_id]["value"]["page_sort"]
207
191
  end
208
192
 
209
193
  def rows
210
194
  # ! returns all rows as instantiated class instances.
211
- row_id_array = row_ids
195
+ row_id_array = row_ids()
212
196
  parent_id = @parent_id
213
197
  collection_id = @collection_id
214
198
  view_id = @view_id
215
199
  collection_data = extract_collection_data(@collection_id, @view_id)
216
200
  schema = collection_data["collection"][collection_id]["value"]["schema"]
217
- column_mappings = schema.keys
218
- column_names = column_mappings.map { |mapping| schema[mapping]["name"] }
219
-
201
+ column_names = NotionAPI::CollectionView.extract_collection_view_column_names(schema)
220
202
  row_instances = row_id_array.map { |row_id| NotionAPI::CollectionViewRow.new(row_id, parent_id, collection_id, view_id) }
221
203
  clean_row_instances = row_instances.filter { |row| collection_data["block"][row.id] }
222
204
  clean_row_instances.each { |row| row.instance_variable_set(:@column_names, column_names) }
@@ -244,7 +226,6 @@ module NotionAPI
244
226
  # set instance variables for each column, allowing the dev to 'read' the column value
245
227
  cleaned_column = clean_property_names(column_hash, column)
246
228
 
247
- # p row_data["value"]["properties"][column_mappings[i]], !(row_data["value"]["properties"][column] or row_data["value"]["properties"][column_mappings[i]])
248
229
  if row_data["value"]["properties"].nil? or row_data["value"]["properties"][column].nil?
249
230
  value = ""
250
231
  else
@@ -273,7 +254,7 @@ module NotionAPI
273
254
  space_id: space_id,
274
255
  }
275
256
 
276
- update_property_value_hash = Utils::CollectionViewComponents.update_property_value(@id, column_hash.key(parsed_method), new_value)
257
+ update_property_value_hash = Utils::CollectionViewComponents.update_property_value(@id, column_hash.key(parsed_method), new_value, schema[column_hash.key(parsed_method)]["type"])
277
258
 
278
259
  operations = [
279
260
  update_property_value_hash,
@@ -316,6 +297,14 @@ module NotionAPI
316
297
 
317
298
  prop_hash[prop_notion_name].split(" ").map { |word| word.gsub(/[^a-z0-9]/i, "").downcase }.join("_").to_sym
318
299
  end
300
+
301
+ def self.extract_collection_view_column_names(schema)
302
+ # ! extract the column names of a Collection View
303
+ # ! schema: the schema of the collection view
304
+ column_mappings = column_mappings = schema.keys
305
+ column_names = column_mappings.map { |mapping| schema[mapping]["name"] }
306
+ column_names
307
+ end
319
308
  end
320
309
 
321
310
  # class that represents each row in a CollectionView