libis-services 0.0.2

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 (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +36 -0
  6. data/Rakefile +6 -0
  7. data/lib/libis-services.rb +1 -0
  8. data/lib/libis/services.rb +21 -0
  9. data/lib/libis/services/aleph/search.rb +157 -0
  10. data/lib/libis/services/collective_access.rb +1 -0
  11. data/lib/libis/services/collective_access/cataloguing.rb +48 -0
  12. data/lib/libis/services/collective_access/connector.rb +151 -0
  13. data/lib/libis/services/collective_access/item_info.rb +36 -0
  14. data/lib/libis/services/collective_access/search.rb +26 -0
  15. data/lib/libis/services/collective_access/service.rb +80 -0
  16. data/lib/libis/services/digitool/digital_entity_manager.rb +223 -0
  17. data/lib/libis/services/digitool/digitool_connector.rb +46 -0
  18. data/lib/libis/services/digitool/meta_data_manager.rb +193 -0
  19. data/lib/libis/services/extend/http_fetch.rb +63 -0
  20. data/lib/libis/services/generic_search.rb +38 -0
  21. data/lib/libis/services/http_error.rb +21 -0
  22. data/lib/libis/services/oracle_client.rb +47 -0
  23. data/lib/libis/services/primo.rb +2 -0
  24. data/lib/libis/services/primo/limo.rb +33 -0
  25. data/lib/libis/services/primo/search.rb +46 -0
  26. data/lib/libis/services/rest_client.rb +66 -0
  27. data/lib/libis/services/rosetta.rb +1 -0
  28. data/lib/libis/services/rosetta/client.rb +107 -0
  29. data/lib/libis/services/rosetta/collection_handler.rb +45 -0
  30. data/lib/libis/services/rosetta/collection_info.rb +35 -0
  31. data/lib/libis/services/rosetta/deposit_activity.rb +48 -0
  32. data/lib/libis/services/rosetta/deposit_handler.rb +187 -0
  33. data/lib/libis/services/rosetta/ie.rb +19 -0
  34. data/lib/libis/services/rosetta/ie_handler.rb +29 -0
  35. data/lib/libis/services/rosetta/pds_handler.rb +60 -0
  36. data/lib/libis/services/rosetta/producer.rb +71 -0
  37. data/lib/libis/services/rosetta/producer_handler.rb +125 -0
  38. data/lib/libis/services/rosetta/service.rb +399 -0
  39. data/lib/libis/services/rosetta/sip.rb +26 -0
  40. data/lib/libis/services/rosetta/sip_handler.rb +30 -0
  41. data/lib/libis/services/rosetta/user.rb +70 -0
  42. data/lib/libis/services/rosetta/user_manager.rb +28 -0
  43. data/lib/libis/services/scope/search.rb +46 -0
  44. data/lib/libis/services/search_factory.rb +40 -0
  45. data/lib/libis/services/sharepoint/connector.rb +236 -0
  46. data/lib/libis/services/sharepoint/search.rb +19 -0
  47. data/lib/libis/services/soap_client.rb +57 -0
  48. data/lib/libis/services/soap_error.rb +22 -0
  49. data/lib/libis/services/version.rb +5 -0
  50. data/libis-services.gemspec +38 -0
  51. data/spec/primo_limo_spec.rb +394 -0
  52. data/spec/primo_search_spec.rb +39 -0
  53. data/spec/rosetta_collection_spec.rb +206 -0
  54. data/spec/rosetta_deposit_spec.rb +82 -0
  55. data/spec/rosetta_ie_spec.rb +345 -0
  56. data/spec/rosetta_pds_spec.rb +79 -0
  57. data/spec/rosetta_producer_spec.rb +270 -0
  58. data/spec/rosetta_sip_spec.rb +39 -0
  59. data/spec/spec_helper.rb +12 -0
  60. metadata +307 -0
@@ -0,0 +1,125 @@
1
+ # encoding: utf-8
2
+ require 'libis/tools/extend/hash'
3
+ require 'libis/tools/xml_document'
4
+ require_relative 'producer'
5
+ require_relative 'user'
6
+
7
+ require_relative 'client'
8
+ module Libis
9
+ module Services
10
+ module Rosetta
11
+
12
+ class ProducerHandler < Libis::Services::Rosetta::Client
13
+
14
+
15
+ def initialize(base_url = 'http://depot.lias.be', options = {})
16
+ super 'backoffice', 'ProducerWebServices', {url: base_url}.merge(options)
17
+ end
18
+
19
+ def user_id(external_id)
20
+ call :get_internal_user_id_by_external_id, arg0: external_id
21
+ end
22
+
23
+ def is_user?(user_id)
24
+ call :is_user_exists, arg0: @pds_handle, arg1: user_id
25
+ end
26
+
27
+ def producer(producer_id, producer_info = nil)
28
+ if producer_info
29
+ info = producer(producer_id)
30
+ return nil if info.nil?
31
+ (producer_info.is_a?(Rosetta::Producer) ? producer_info.attributes : producer_info).each do |name, value|
32
+ info[name] = value
33
+ end
34
+ call :update_producer, arg0: @pds_handle, arg1: producer_id, arg2: info.to_xml
35
+ else
36
+ request_object :get_producer_details, Rosetta::Producer, arg0: @pds_handle, arg1: producer_id
37
+ end
38
+ end
39
+
40
+ def new_producer(producer_info)
41
+ producer_info = Rosetta::Producer.new(producer_info) unless producer_info.is_a?(Rosetta::Producer)
42
+ call :create_producer, arg0: @pds_handle, arg1: producer_info.to_xml
43
+ end
44
+
45
+ def delete_producer(producer_id)
46
+ call :remove_producer, arg0: @pds_handle, arg1: producer_id
47
+ end
48
+
49
+ def agent(agent_id, agent_info = nil)
50
+ if agent_info
51
+ info = agent(agent_id)
52
+ return nil if info.nil?
53
+ (agent_info.is_a?(Rosetta::User) ? agent_info.attributes : agent_info).each do |name, value|
54
+ info[name] = value
55
+ end
56
+ call :update_producer_agent, arg0: @pds_handle, arg1: agent_id, arg2: info.to_xml
57
+ else
58
+ request_object :get_producer_agent, Rosetta::User, arg0: @pds_handle, arg1: agent_id
59
+ end
60
+ end
61
+
62
+ def new_agent(agent_info)
63
+ agent_info = Rosetta::User.new(agent_info) unless agent_info.is_a?(Rosetta::User)
64
+ call :create_producer_agent, arg0: @pds_handle, arg1: agent_info.to_xml
65
+ end
66
+
67
+ def delete_agent(agent_id)
68
+ call :remove_producer_agent, arg0: @pds_handle, arg1: agent_id
69
+ end
70
+
71
+ def link_agent(agent_id, producer_id)
72
+ call :link_producer_agent_to_producer, arg0: @pds_handle, arg1: producer_id, arg2: agent_id
73
+ end
74
+
75
+ def unlink_agent(agent_id, producer_id)
76
+ call :unlink_producer_agent_from_producer, arg0: @pds_handle, arg1: producer_id, arg2: agent_id
77
+ end
78
+
79
+ def agent_producers(agent_id, institution = nil)
80
+ if institution
81
+ request_array :get_producers_of_producer_agent_with_ins, arg0: agent_id, arg1: institution
82
+ else
83
+ request_array :get_producers_of_producer_agent, arg0: agent_id
84
+ end
85
+ end
86
+
87
+ def contact(contact_id, contact_info = nil)
88
+ if contact_info
89
+ info = contact(contact_id)
90
+ return nil if info.nil?
91
+ (contact_info.is_a?(Rosetta::User) ? contact_info.attributes : contact_info).each do |name, value|
92
+ info[name] = value
93
+ end
94
+ call :update_contact, arg0: @pds_handle, arg1: contact_id, arg2: info.to_xml
95
+ else
96
+ request_object :get_contact, Rosetta::User, arg0: @pds_handle, arg1: contact_id
97
+ end
98
+ end
99
+
100
+ def new_contact(contact_info)
101
+ contact_info = Rosetta::User.new(contact_info) unless contact_info.is_a?(Rosetta::User)
102
+ call :create_contact, arg0: @pds_handle, arg1: contact_info.to_xml
103
+ end
104
+
105
+ def delete_contact(contact_id)
106
+ call :remove_contact, arg0: @pds_handle, arg1: contact_id
107
+ end
108
+
109
+ def link_contact(contact_id, producer_id, primary = true)
110
+ call :link_contact_to_producer, arg0: @pds_handle, arg1: producer_id, arg2: contact_id, arg3: (!!primary).to_s.upcase
111
+ end
112
+
113
+ def unlink_contact(contact_id, producer_id)
114
+ call :unlink_contact_from_producer, arg0: @pds_handle, arg1: producer_id, arg2: contact_id
115
+ end
116
+
117
+ def material_flows(producer_id)
118
+ request_array :get_material_flows_of_producer, arg0: producer_id
119
+ end
120
+
121
+ end
122
+
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,399 @@
1
+ require_relative 'pds_handler'
2
+ require_relative 'producer_handler'
3
+ require_relative 'deposit_handler'
4
+ require_relative 'sip_handler'
5
+ require_relative 'ie_handler'
6
+ require_relative 'collection_handler'
7
+
8
+ require 'libis/tools/mets_file'
9
+
10
+ require 'csv'
11
+ require 'write_xlsx'
12
+ require 'backports'
13
+ require 'awesome_print'
14
+
15
+ module Libis
16
+ module Services
17
+ module Rosetta
18
+
19
+ class Service
20
+
21
+ attr_reader :pds_service, :producer_service, :deposit_service, :sip_service, :ie_service, :collection_service
22
+
23
+ # @param [String] base_url
24
+ def initialize(base_url = 'http://depot.lias.be', pds_url = 'https://pds.libis.be')
25
+ @pds_service = Libis::Services::Rosetta::PdsHandler.new pds_url
26
+ @producer_service = Libis::Services::Rosetta::ProducerHandler.new base_url
27
+ @deposit_service = Libis::Services::Rosetta::DepositHandler.new base_url
28
+ @sip_service = Libis::Services::Rosetta::SipHandler.new base_url
29
+ @ie_service = Libis::Services::Rosetta::IeHandler.new base_url
30
+ @collection_service = Libis::Services::Rosetta::CollectionHandler.new base_url
31
+ end
32
+
33
+ # @param [String] name
34
+ # @param [String] passwd
35
+ # @param [String] institute
36
+ # @return [String] PDS handle
37
+ def login(name, passwd, institute)
38
+ handle = @pds_service.login(name, passwd, institute)
39
+ @producer_service.pds_handle = handle
40
+ @deposit_service.pds_handle = handle
41
+ @sip_service.pds_handle = handle
42
+ @ie_service.pds_handle = handle
43
+ handle
44
+ end
45
+
46
+ # Searches for all deposits in the date range and for the given flow id. The method returns a list of all
47
+ # deposits, including information about the sip, the related IEs and a breakdown of the IE's METS file.
48
+ #
49
+ # @param [String] from_date
50
+ # @param [String] to_date
51
+ # @param [String] flow_id
52
+ # @param [String] options
53
+ # @return [Hash] detailed deposit information
54
+ def get_deposits(from_date, to_date, flow_id, options = {})
55
+ deposits = @deposit_service.get_by_submit_flow(from_date, to_date, flow_id, {status: 'Approved'}.merge(options))
56
+ deposits.each do |deposit|
57
+ ies = @sip_service.get_ies(deposit[:sip])
58
+ ies_info = ies.map do |ie|
59
+ title = nil
60
+ id = nil
61
+ begin
62
+ md = @ie_service.get_metadata(ie).to_hash['mets:mets']
63
+ dc = md['mets:dmdSec']['mets:mdWrap']['mets:xmlData']['dc:record']
64
+ title = dc['dc:title']
65
+ id = dc['dc:identifier']
66
+ rescue
67
+ # ignore
68
+ end
69
+ # retrieve ie mets file
70
+ ie_info = @ie_service.get_mets(ie)
71
+ {
72
+ ie: ie,
73
+ title: title,
74
+ id: id,
75
+ content: ie_info
76
+ }.cleanup
77
+ end
78
+ deposit[:ies] = ies_info
79
+ end
80
+ deposits.sort! { |x, y| x[:ies][0][:id] <=> y[:ies][0][:id] }
81
+ # deposits.each { |dep| dep[:ies].each { |ie| puts "DEP ##{dep[:deposit]} - SIP ##{dep[:sip]} - IE ##{ie[:ie]} - #{ie[:id]} - #{ie[:title]}" } }
82
+ deposits
83
+ end
84
+
85
+ # @param [String] report_file
86
+ # @param [Array] deposits
87
+ def get_deposit_report(report_file, deposits)
88
+ # create and open Workbook
89
+ workbook = WriteXLSX.new(report_file)
90
+
91
+ # set up some formatting
92
+ ie_data_header_format = workbook.add_format(bold: 1)
93
+ rep_name_format = workbook.add_format(bold: 1)
94
+ file_header_format = workbook.add_format(bold: 1)
95
+
96
+ # First Sheet is an overview of all dossiers
97
+ overview = workbook.add_worksheet('IE overview')
98
+ ie_data_keys = Set.new %w[id dossier link disposition]
99
+ ie_list = [] # ie info will be collected in this array to be printed later
100
+
101
+ # iterate over all deposits
102
+ deposits.each do |deposit|
103
+ # iterate over all IEs
104
+ deposit[:ies].sort { |x, y| x[:id] <=> y[:id] }.each do |ie|
105
+ @ie = ie
106
+ id = (ie[:id] || ie[:ie])
107
+ # noinspection RubyStringKeysInHashInspection
108
+ ie_data = {
109
+ 'id' => "#{id}",
110
+ 'dossier' => ie[:title],
111
+ 'disposition' => (ie[:content][:dmd]['date'] rescue nil),
112
+ 'link' => "http://depot.lias.be/delivery/DeliveryManagerServlet?dps_pid=#{ie[:ie]}",
113
+ }.cleanup
114
+ [
115
+ # (ie[:content][:dmd] rescue nil),
116
+ (ie[:content][:amd][:tech]['generalIECharacteristics'] rescue nil),
117
+ (ie[:content][:amd][:rights]['accessRightsPolicy'] rescue nil)
118
+ ].each do |data|
119
+ ie_data.merge! data if data
120
+ end
121
+ dossier_sheet = workbook.add_worksheet(id.gsub(/[\\\/*?]+/, '.'))
122
+ dossier_row = 0
123
+
124
+ ie[:content].each do |rep_name, rep|
125
+ next unless rep_name.is_a?(String)
126
+ @rep = rep
127
+ file_data_keys = Set.new %w(folder naam link mimetype puid formaat versie)
128
+ file_list = []
129
+
130
+ dossier_sheet.write_row(dossier_row, 0, [rep_name], rep_name_format)
131
+ %w(preservationType usageType).each do |key|
132
+ dossier_row += 1
133
+ dossier_sheet.write_row(
134
+ dossier_row, 0,
135
+ [
136
+ key.underscore.gsub('_', ' '),
137
+ rep[:amd][:tech]['generalRepCharacteristics'][key]
138
+ ]
139
+ )
140
+ end
141
+ dossier_row += 2
142
+
143
+ file_proc = lambda do |file|
144
+ @file = file
145
+ if file[:id]
146
+ tech = file[:amd][:tech]
147
+ # noinspection RubyStringKeysInHashInspection
148
+ file_data = {
149
+ 'folder' => (tech['generalFileCharacteristics']['fileOriginalPath'] rescue '').split('/')[1..-1].join('\\'),
150
+ 'naam' => (tech['generalFileCharacteristics']['fileOriginalName'] rescue nil),
151
+ 'link' => ("http://depot.lias.be/delivery/DeliveryManagerServlet?dps_pid=#{file[:id]}" rescue nil),
152
+ 'mimetype' => (tech['fileFormat']['mimeType'] rescue nil),
153
+ 'puid' => (tech['fileFormat']['formatRegistryId'] rescue nil),
154
+ 'formaat' => (tech['fileFormat']['formatDescription'] rescue nil),
155
+ 'versie' => (tech['fileFormat']['formatVersion'] rescue nil),
156
+ 'viruscheck' => (tech['fileVirusCheck']['status'] rescue nil),
157
+ 'file_type' => (tech['generalFileCharacteristics']['FileEntityType']),
158
+ 'groep' => file[:group],
159
+ }
160
+ data = tech['fileValidation']
161
+ if data
162
+ valid = (data['isValid'] == 'true') rescue nil
163
+ well_formed = (data['isWellFormed'] == 'true') rescue nil
164
+ file_data['validatie'] = if valid && well_formed
165
+ 'OK'
166
+ else
167
+ 'niet OK'
168
+ end
169
+ end
170
+ data = tech['significantProperties']
171
+ if data
172
+ file_data[data['significantPropertiesType']] = data['significantPropertiesValue']
173
+ end
174
+ data = file[:dmd]
175
+ if data
176
+ data.each { |key, value| file_data[key] = value }
177
+ end
178
+ file_list << file_data
179
+ file_data_keys.merge file_data.keys
180
+ else
181
+ file.each do |_, value|
182
+ next unless value.is_a? Hash
183
+ # noinspection RubyScope
184
+ file_proc.call(value)
185
+ end
186
+ end
187
+ end
188
+
189
+ rep.keys.each do |key|
190
+ file_proc.call(rep[key]) if key.is_a?(String)
191
+ end
192
+
193
+ table_start = dossier_row
194
+ dossier_sheet.write_row(dossier_row, 0, file_data_keys.to_a, file_header_format)
195
+ file_list.each do |file_info|
196
+ dossier_row += 1
197
+ file_data = []
198
+ file_data_keys.each { |key| file_data << file_info[key] }
199
+ dossier_sheet.write_row(dossier_row, 0, file_data)
200
+ end
201
+ table_end = dossier_row
202
+
203
+ dossier_sheet.add_table(
204
+ table_start, 0, table_end, file_data_keys.size - 1,
205
+ style: 'Table Style Medium 16', name: rep[:id],
206
+ columns: file_data_keys.map { |key| {header: key} }
207
+ )
208
+
209
+ dossier_row += 2
210
+ end
211
+ ie_data_keys.merge ie_data.keys
212
+ ie_list << ie_data
213
+ end
214
+ end
215
+
216
+ # write ie data to overview worksheet
217
+ overview.write_row(0, 0, ie_data_keys.to_a, ie_data_header_format)
218
+ overview_row = 1
219
+ ie_list.each do |ie_info|
220
+ ie_data = []
221
+ ie_data_keys.each { |key| ie_data << ie_info[key] }
222
+ overview.write_row(overview_row, 0, ie_data)
223
+ overview_row += 1
224
+ end
225
+
226
+ rescue Exception => e
227
+ puts e.message
228
+ puts e.backtrace
229
+ # close and save workbook
230
+ ensure
231
+ workbook.close
232
+ end
233
+
234
+ # @param [String] report_file
235
+ # @param [Array] deposits
236
+ def get_dav_deposit_report(report_file, deposits)
237
+ # create and open Workbook
238
+ workbook = WriteXLSX.new(report_file)
239
+
240
+ # set up some formatting
241
+ ie_data_header_format = workbook.add_format(bold: 1)
242
+ rep_name_format = workbook.add_format(bold: 1)
243
+ file_header_format = workbook.add_format(bold: 1)
244
+
245
+ # First Sheet is an overview of all dossiers
246
+ overview = workbook.add_worksheet('dossier overzicht')
247
+ ie_data_keys = Set.new %w[id dossier link disposition]
248
+ ie_list = [] # ie info will be collected in this array to be printed later
249
+
250
+ # iterate over all deposits
251
+ deposits.each do |deposit|
252
+ # iterate over all IEs
253
+ deposit[:ies].sort { |x, y| x[:id] <=> y[:id] }.each do |ie|
254
+ @ie = ie
255
+ id = (ie[:id] || ie[:ie])
256
+ # noinspection RubyStringKeysInHashInspection
257
+ ie_data = {
258
+ 'id' => "#{id}",
259
+ 'dossier' => ie[:title],
260
+ 'disposition' => (ie[:content][:dmd]['date'] rescue nil),
261
+ 'link' => "http://depot.lias.be/delivery/DeliveryManagerServlet?dps_pid=#{ie[:ie]}",
262
+ }.cleanup
263
+ [
264
+ # (ie[:content][:dmd] rescue nil),
265
+ (ie[:content][:amd][:tech]['generalIECharacteristics'] rescue nil),
266
+ (ie[:content][:amd][:rights]['accessRightsPolicy'] rescue nil)
267
+ ].each do |data|
268
+ ie_data.merge! data if data
269
+ end
270
+ dossier_sheet = workbook.add_worksheet(id.gsub(/[\\\/*?]+/, '.'))
271
+ dossier_row = 0
272
+
273
+ ie[:content].each do |rep_name, rep|
274
+ next unless rep_name.is_a?(String)
275
+ @rep = rep
276
+ file_data_keys = Set.new %w(folder naam link mimetype puid formaat versie)
277
+ file_list = []
278
+
279
+ dossier_sheet.write_row(dossier_row, 0, [rep_name], rep_name_format)
280
+ %w(preservationType usageType).each do |key|
281
+ dossier_row += 1
282
+ dossier_sheet.write_row(
283
+ dossier_row, 0,
284
+ [
285
+ key.underscore.gsub('_', ' '),
286
+ rep[:amd][:tech]['generalRepCharacteristics'][key]
287
+ ]
288
+ )
289
+ end
290
+ dossier_row += 2
291
+
292
+ file_proc = lambda do |file|
293
+ @file = file
294
+ if file[:id]
295
+ tech = file[:amd][:tech]
296
+ # noinspection RubyStringKeysInHashInspection
297
+ file_data = {
298
+ 'folder' => (tech['generalFileCharacteristics']['fileOriginalPath'] rescue '').split('/')[1..-1].join('\\'),
299
+ 'naam' => (tech['generalFileCharacteristics']['fileOriginalName'] rescue nil),
300
+ 'link' => ("http://depot.lias.be/delivery/DeliveryManagerServlet?dps_pid=#{file[:id]}" rescue nil),
301
+ 'mimetype' => (tech['fileFormat']['mimeType'] rescue nil),
302
+ 'puid' => (tech['fileFormat']['formatRegistryId'] rescue nil),
303
+ 'formaat' => (tech['fileFormat']['formatDescription'] rescue nil),
304
+ 'versie' => (tech['fileFormat']['formatVersion'] rescue nil),
305
+ 'viruscheck' => (tech['fileVirusCheck']['status'] rescue nil),
306
+ 'file_type' => (tech['generalFileCharacteristics']['FileEntityType']),
307
+ 'groep' => file[:group],
308
+ }
309
+ data = tech['fileValidation']
310
+ if data
311
+ valid = (data['isValid'] == 'true') rescue nil
312
+ well_formed = (data['isWellFormed'] == 'true') rescue nil
313
+ file_data['validatie'] = if valid && well_formed
314
+ 'OK'
315
+ else
316
+ 'niet OK'
317
+ end
318
+ end
319
+ data = tech['significantProperties']
320
+ if data
321
+ file_data[data['significantPropertiesType']] = data['significantPropertiesValue']
322
+ end
323
+ data = file[:dmd]
324
+ if data
325
+ data.each { |key, value| file_data[key] = value }
326
+ end
327
+ file_list << file_data
328
+ file_data_keys.merge file_data.keys
329
+ else
330
+ file.each do |_, value|
331
+ next unless value.is_a? Hash
332
+ # noinspection RubyScope
333
+ file_proc.call(value)
334
+ end
335
+ end
336
+ end
337
+
338
+ rep.keys.each do |key|
339
+ file_proc.call(rep[key]) if key.is_a?(String)
340
+ end
341
+
342
+ table_start = dossier_row
343
+ dossier_sheet.write_row(dossier_row, 0, file_data_keys.to_a, file_header_format)
344
+ file_list.each do |file_info|
345
+ dossier_row += 1
346
+ file_data = []
347
+ file_data_keys.each { |key| file_data << file_info[key] }
348
+ dossier_sheet.write_row(dossier_row, 0, file_data)
349
+ end
350
+ table_end = dossier_row
351
+
352
+ dossier_sheet.add_table(
353
+ table_start, 0, table_end, file_data_keys.size - 1,
354
+ style: 'Table Style Medium 16', name: rep[:id],
355
+ columns: file_data_keys.map { |key| {header: key} }
356
+ )
357
+
358
+ dossier_row += 2
359
+ end
360
+ ie_data_keys.merge ie_data.keys
361
+ ie_list << ie_data
362
+ end
363
+ end
364
+
365
+ # write ie data to overview worksheet
366
+ overview.write_row(0, 0, ie_data_keys.to_a, ie_data_header_format)
367
+ overview_row = 1
368
+ ie_list.each do |ie_info|
369
+ ie_data = []
370
+ ie_data_keys.each { |key| ie_data << ie_info[key] }
371
+ overview.write_row(overview_row, 0, ie_data)
372
+ overview_row += 1
373
+ end
374
+
375
+ rescue Exception => e
376
+ puts e.message
377
+ puts e.backtrace
378
+ # close and save workbook
379
+ ensure
380
+ workbook.close
381
+ end
382
+
383
+ def file
384
+ @file
385
+ end
386
+
387
+ def ie
388
+ @ie
389
+ end
390
+
391
+ def rep
392
+ @rep
393
+ end
394
+
395
+ end
396
+
397
+ end
398
+ end
399
+ end