apollo_commons_ruby_cli 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.gitignore +9 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +6 -0
  6. data/Gemfile.lock +19 -0
  7. data/README.md +40 -0
  8. data/Rakefile +2 -0
  9. data/apollo_commons_ruby.gemspec +26 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/lib/apollo_commons_ruby/AtroposSubscription.rb +88 -0
  13. data/lib/apollo_commons_ruby/BackfillSampleData.rb +41 -0
  14. data/lib/apollo_commons_ruby/DomainEvent.rb +181 -0
  15. data/lib/apollo_commons_ruby/ExecuteCommand.rb +20 -0
  16. data/lib/apollo_commons_ruby/FileUtils.rb +136 -0
  17. data/lib/apollo_commons_ruby/MarioConfigsStability.rb +181 -0
  18. data/lib/apollo_commons_ruby/MarioEvent.rb +45 -0
  19. data/lib/apollo_commons_ruby/NetworkUtils.rb +188 -0
  20. data/lib/apollo_commons_ruby/Operation.rb +5 -0
  21. data/lib/apollo_commons_ruby/Permission.rb +51 -0
  22. data/lib/apollo_commons_ruby/RequestDataUtils.rb +28 -0
  23. data/lib/apollo_commons_ruby/ResolveTemplate.rb +40 -0
  24. data/lib/apollo_commons_ruby/SecretConfig.rb +65 -0
  25. data/lib/apollo_commons_ruby/ShopHook.rb +79 -0
  26. data/lib/apollo_commons_ruby/TemplateDebug.rb +207 -0
  27. data/lib/apollo_commons_ruby/TemplatePusher.rb +159 -0
  28. data/lib/apollo_commons_ruby/TemplatesHelper.rb +808 -0
  29. data/lib/apollo_commons_ruby/TemplatesRakefile.rb +864 -0
  30. data/lib/apollo_commons_ruby/TenantInfo.rb +26 -0
  31. data/lib/apollo_commons_ruby/TenantTokenCreator.rb +16 -0
  32. data/lib/apollo_commons_ruby/VerifyMarioConfig.rb +220 -0
  33. data/lib/apollo_commons_ruby/ViewGroup.rb +64 -0
  34. data/lib/apollo_commons_ruby/ViewGroupComponent.rb +73 -0
  35. data/lib/apollo_commons_ruby/ViewGroupDefinition.rb +68 -0
  36. data/lib/apollo_commons_ruby/WebhookReporting.rb +13 -0
  37. data/lib/apollo_commons_ruby/Zebugger.rb +125 -0
  38. data/lib/apollo_commons_ruby.rb +60 -0
  39. data/lib/jar/v1_atroposDevTools.jar +0 -0
  40. data/lib/tasks/add_translations.rake +9 -0
  41. data/lib/tasks/backfill_sample_data.rake +7 -0
  42. data/lib/tasks/checkValidJson.rake +17 -0
  43. data/lib/tasks/delete_domain_event.rake +7 -0
  44. data/lib/tasks/delete_view_group.rake +7 -0
  45. data/lib/tasks/delete_view_group_component.rake +21 -0
  46. data/lib/tasks/delete_view_group_definition.rake +26 -0
  47. data/lib/tasks/deploy_all_templates.rake +7 -0
  48. data/lib/tasks/deploy_permissions.rake +6 -0
  49. data/lib/tasks/deploy_shophooks.rake +6 -0
  50. data/lib/tasks/display_on_zebugger.rake +19 -0
  51. data/lib/tasks/get_tenant_token.rake +6 -0
  52. data/lib/tasks/runTests.rake +27 -0
  53. data/lib/tasks/template_debug.rake +32 -0
  54. data/lib/tasks/update_all.rake +36 -0
  55. data/lib/tasks/update_all_domain_events.rake +24 -0
  56. data/lib/tasks/update_all_view_group_components.rake +18 -0
  57. data/lib/tasks/update_domain_event.rake +12 -0
  58. data/lib/tasks/update_one_template.rake +42 -0
  59. data/lib/tasks/update_translations.rake +24 -0
  60. data/lib/tasks/update_view_group_component.rake +9 -0
  61. data/lib/tasks/update_view_group_definition.rake +7 -0
  62. data/lib/tasks/update_view_group_for_user_0.rake +36 -0
  63. data/lib/tasks/validate_mario_configs.rake +10 -0
  64. data/lib/tasks/verify_mario_config.rake +15 -0
  65. data/lib/version.rb +3 -0
  66. metadata +109 -0
@@ -0,0 +1,808 @@
1
+ require 'json'
2
+ require 'net/http'
3
+ require 'uri'
4
+ require 'openssl'
5
+ require 'base64'
6
+ require_relative './NetworkUtils'
7
+ require_relative 'SecretConfig'
8
+
9
+ module HTTP
10
+ GET = 1
11
+ POST = 2
12
+ DELETE = 3
13
+ PUT = 4
14
+ end
15
+
16
+ class String
17
+ def black; "\e[30m#{self}\e[0m" end
18
+ def red; "\e[31m#{self}\e[0m" end
19
+ def green; "\e[32m#{self}\e[0m" end
20
+ def brown; "\e[33m#{self}\e[0m" end
21
+ def blue; "\e[34m#{self}\e[0m" end
22
+ def magenta; "\e[35m#{self}\e[0m" end
23
+ def cyan; "\e[36m#{self}\e[0m" end
24
+ def gray; "\e[37m#{self}\e[0m" end
25
+
26
+ def bg_black; "\e[40m#{self}\e[0m" end
27
+ def bg_red; "\e[41m#{self}\e[0m" end
28
+ def bg_green; "\e[42m#{self}\e[0m" end
29
+ def bg_brown; "\e[43m#{self}\e[0m" end
30
+ def bg_blue; "\e[44m#{self}\e[0m" end
31
+ def bg_magenta; "\e[45m#{self}\e[0m" end
32
+ def bg_cyan; "\e[46m#{self}\e[0m" end
33
+ def bg_gray; "\e[47m#{self}\e[0m" end
34
+
35
+ def bold; "\e[1m#{self}\e[22m" end
36
+ def italic; "\e[3m#{self}\e[23m" end
37
+ def underline; "\e[4m#{self}\e[24m" end
38
+ def blink; "\e[5m#{self}\e[25m" end
39
+ def reverse_color; "\e[7m#{self}\e[27m" end
40
+ end
41
+
42
+ class LineReplacementProperties
43
+
44
+ attr_reader :file_path
45
+ attr_reader :redundant_line_prefix
46
+ attr_reader :updated_line
47
+
48
+ def initialize(file_path, redundant_line_prefix, updated_line)
49
+ @file_path = file_path
50
+ @redundant_line_prefix = redundant_line_prefix
51
+ @updated_line = updated_line
52
+ end
53
+ end
54
+
55
+
56
+ class CreateTemplatePayload
57
+ def initialize(template_group, language, view, templates, version)
58
+ @template_group = template_group
59
+ @language = language
60
+ @view = view
61
+ @templates = templates
62
+ @version = version
63
+ end
64
+
65
+ def to_json
66
+ body = {
67
+ "templateGroup"=> @template_group,
68
+ "language"=> @language,
69
+ "viewType"=> @view,
70
+ "templates"=> @templates,
71
+ "version" => @version
72
+ }
73
+ body.to_json
74
+ end
75
+
76
+ end
77
+
78
+ class TemplateMapping
79
+
80
+ def initialize(template_name, template_path, template_mapping)
81
+ @template_name = template_name
82
+ @template_path = template_path
83
+ @template_mapping = template_mapping
84
+ end
85
+
86
+ def create_hash
87
+ {
88
+ "template_name"=> @template_name,
89
+ "template_path"=> @template_path,
90
+ "template_mapping"=> @template_mapping
91
+ }
92
+ end
93
+
94
+ def create_mapping
95
+ {
96
+ @template_mapping => @template_name
97
+ }
98
+ end
99
+ end
100
+
101
+ class Template
102
+
103
+ attr_reader :data_template
104
+
105
+ def initialize(template_name, default_content, data_template, presentation, attrs)
106
+ @default_content = default_content
107
+ @data_template = data_template
108
+ @presentation = presentation
109
+ @template_name = template_name
110
+ @attrs = attrs
111
+ end
112
+
113
+ def create_hash
114
+ {
115
+ @template_name => {
116
+ "defaultContent"=> @default_content,
117
+ "dataTemplateBase64"=> @data_template,
118
+ "presentationBase64"=> @presentation,
119
+ "attrs"=> @attrs
120
+ }
121
+ }
122
+ end
123
+
124
+ end
125
+
126
+ class CreateTemplatePayload
127
+ def initialize(template_group, language, view, templates, version)
128
+ @template_group = template_group
129
+ @language = language
130
+ @view = view
131
+ @templates = templates
132
+ @version = version
133
+ end
134
+
135
+ def to_json
136
+ body = {
137
+ "templateGroup"=> @template_group,
138
+ "language"=> @language,
139
+ "viewType"=> @view,
140
+ "templates"=> @templates,
141
+ "version" => @version
142
+ }
143
+ body.to_json
144
+ end
145
+
146
+ end
147
+
148
+ class ConvertPresentationPayload
149
+ def initialize(presentation, sourcePresentationType, targetPresentationType)
150
+ @presentation = presentation
151
+ @sourcePresentationType = sourcePresentationType
152
+ @targetPresentationType = targetPresentationType
153
+ end
154
+
155
+ def to_json
156
+ body = {
157
+ "presentation"=> @presentation,
158
+ "sourcePresentationType"=> @sourcePresentationType,
159
+ "targetPresentationType"=> @targetPresentationType
160
+ }
161
+ body.to_json
162
+ end
163
+
164
+ end
165
+
166
+ module JSON
167
+ def self.is_valid_json?(json)
168
+ begin
169
+ JSON.parse(json)
170
+ return true
171
+ rescue JSON::ParserError => e
172
+ return false
173
+ end
174
+ end
175
+ end
176
+
177
+ class TemplateConfig
178
+ BaseAppID = "1005"
179
+ SupportedLanguages = "supportedLanguages"
180
+ BaseLanguageResource = "VI"
181
+
182
+ def self.language_resource_path(language)
183
+ return "Resources/#{language}.json"
184
+ end
185
+
186
+ def self.base_language_resource_path()
187
+ return language_resource_path("#{TemplateConfig::BaseLanguageResource}")
188
+ end
189
+
190
+ def self.template_group_contents_path_for_base_app(template_group)
191
+ return template_group_contents_path_for_appID(template_group, BaseAppID)
192
+ end
193
+
194
+ def self.template_group_contents_path_for_appID(template_group, appID)
195
+ parent_dir_path = template_group_parent_directory_path_for_appID(template_group, appID)
196
+ return "#{parent_dir_path}/#{appID}"
197
+ end
198
+
199
+ def self.template_group_parent_directory_path_for_appID(template_group, appID)
200
+ template_group_parent_path = template_group_parent_directory_path(template_group)
201
+ return "#{template_group_parent_path}/common/UIVIEW/appID_#{appID}"
202
+ end
203
+
204
+ def self.template_group_parent_directory_path(template_group)
205
+ return "Templates/#{template_group}"
206
+ end
207
+
208
+ def self.template_group_details_path_for_template_group(template_group)
209
+ template_group_parent_path = template_group_parent_directory_path(template_group)
210
+ return "#{template_group_parent_path}/templateGroupDetails.json"
211
+ end
212
+
213
+ def self.template_group_details_for_template_group(template_group)
214
+ file_path = template_group_details_path_for_template_group(template_group)
215
+ return read_raw_json_data_from_file_path(file_path)
216
+ end
217
+
218
+ def self.supported_languages_for_template_group(template_group)
219
+ return template_group_details_for_template_group(template_group)["#{TemplateConfig::SupportedLanguages}"]
220
+ end
221
+
222
+ def self.update_template_group_details_for_template_group(template_group, key, value)
223
+ template_group_details = template_group_details_for_template_group(template_group)
224
+ template_group_details[key] = value
225
+ template_group_details_file_path = template_group_details_path_for_template_group(template_group)
226
+ puts "updated template group details: #{JSON.pretty_generate template_group_details}"
227
+ write_data_to_file(template_group_details_file_path, template_group_details)
228
+ end
229
+
230
+ def self.add_language_to_supported_languages_for_template_group(template_group, language)
231
+ if language == nil
232
+ log_error("Cannot add nil lanugage to supportedLanguages")
233
+ return
234
+ end
235
+ supported_languages = supported_languages_for_template_group(template_group)
236
+ if supported_languages.include?(language)
237
+ log_info("Language #{language} already exists in supported languages. Skipping adding language")
238
+ else
239
+ puts "Adding language #{language} to supported languages"
240
+ supported_languages.push(language)
241
+ update_template_group_details_for_template_group(template_group, "#{TemplateConfig::SupportedLanguages}", supported_languages)
242
+ end
243
+ end
244
+ end
245
+
246
+ class String
247
+ def newline
248
+ self.gsub(/\n/,"")
249
+ end
250
+ def tabs
251
+ self.gsub(/\t/," ")
252
+ end
253
+ def esc
254
+ self.gsub(/\"/,"\\\"")
255
+ end
256
+ def escnewline
257
+ self.gsub(/\n/,"\\n")
258
+ end
259
+ def unesc
260
+ self.gsub(/\\\"/,"\"")
261
+ end
262
+ end
263
+
264
+ class CreateCollectionItem
265
+ def initialize(item_id, data)
266
+ @itemID = item_id
267
+ @data = data
268
+ end
269
+
270
+ def to_json
271
+ body = {
272
+ "itemID"=> @itemID,
273
+ "data"=> @data,
274
+ "isBase64Encoded"=> "true"
275
+ }
276
+ body.to_json
277
+ end
278
+ end
279
+
280
+ class Configuration
281
+
282
+ attr_reader :environment
283
+ attr_reader :base_folder_path
284
+ attr_reader :templated_data_file_path
285
+ attr_reader :env_data_file_path
286
+ attr_reader :resources_file_path
287
+ attr_reader :apollo_config_base_url
288
+ attr_reader :post_insert_templates_url
289
+ attr_reader :post_update_templates_url
290
+ attr_reader :get_templates_for_view_url
291
+ attr_reader :post_upsert_template_mappings_url
292
+ attr_reader :get_template_group_details_url
293
+ attr_reader :post_update_template_group_url
294
+ attr_reader :post_insert_template_group_url
295
+
296
+ def setup(environment, tenantId, projectId)
297
+ if file_exists?("./.apollo/#{environment}.json")
298
+ environmentFile = File.read("./.apollo/#{environment}.json")
299
+ envFile = "./environments/#{environment}.json"
300
+ else
301
+ if (environment == 'PreProd')
302
+ environment = 'Preprod'
303
+ end
304
+ if (tenantId != nil && projectId != nil)
305
+ envFile = "./environments/" + environment + "/env_" + tenantId + "_" + projectId + ".json"
306
+ if(file_exists?(envFile))
307
+ environmentFile = File.read(envFile)
308
+ end
309
+ else
310
+ envFile = "./environments/" + environment + "/env.json"
311
+ if(file_exists?(envFile))
312
+ environmentFile = File.read(envFile)
313
+ end
314
+ end
315
+ end
316
+
317
+ conf = JSON.parse environmentFile
318
+ if (conf["apolloConfigBaseUrl"] == nil)
319
+ puts "Required configurations are missing"
320
+ raise "Required configurations are missing"
321
+ return nil
322
+ end
323
+
324
+ @base_folder_path = "./Templates"
325
+ @templated_data_file_path = "./scripts/commonData/generatedTemplatedData.json"
326
+ @environment = environment
327
+ @resources_file_path = "./Resources"
328
+ @env_data_file_path = envFile
329
+ @apollo_config_base_url = conf["apolloConfigBaseUrl"]
330
+ end
331
+
332
+ def initialize(environment, base_path)
333
+ if file_exists?("./.apollo/#{environment}.json")
334
+ conf_file = File.read(File.expand_path("./.apollo/#{environment}.json"))
335
+ conf = JSON.parse conf_file
336
+
337
+ if (conf["apolloConfigBaseUrl"] == nil)
338
+ puts "Required configurations are missing"
339
+ raise "Required configurations are missing"
340
+ return nil
341
+ end
342
+
343
+ @environment = environment
344
+ @base_folder_path = "./Templates"
345
+ @templated_data_file_path = "./scripts/commonData/generatedTemplatedData.json"
346
+ @env_data_file_path = "./environments/#{environment}.json"
347
+ @apollo_config_base_url = conf["apolloConfigBaseUrl"]
348
+ @resources_file_path = "./Resources"
349
+
350
+ else
351
+ puts base_path
352
+
353
+ if base_path == nil
354
+ conf_file = File.read(File.expand_path("/var/jenkins_home/template_config/config.json"));
355
+ else
356
+ conf_file = File.read(File.expand_path(base_path));
357
+ end
358
+
359
+ conf = JSON.parse conf_file
360
+ if (base_path == nil)
361
+ conf = conf[environment.downcase]
362
+ end
363
+
364
+ if (conf["apolloConfigBaseUrl"] == nil)
365
+ puts "Required configurations are missing"
366
+ raise "Required configurations are missing"
367
+ return nil
368
+ end
369
+
370
+ @environment = environment
371
+ @base_folder_path = "./Templates"
372
+ @templated_data_file_path = "./scripts/commonData/generatedTemplatedData.json"
373
+ @env_data_file_path = conf["env_data_file_path"]
374
+ @apollo_config_base_url = conf["apolloConfigBaseUrl"]
375
+ @resources_file_path = "./Resources"
376
+ @post_insert_templates_url = conf["omsBaseUrl"] + conf["postInsertTemplatesUrl"]
377
+ @post_update_templates_url = conf["omsBaseUrl"] + conf["postUpdateTemplatesUrl"]
378
+ @get_templates_for_view_url = conf["omsBaseUrl"] + conf["getTemplatesForViewUrl"]
379
+ @post_upsert_template_mappings_url = conf["omsBaseUrl"] + conf["postUpsertTemplateMappingsUrl"]
380
+ @get_template_group_details_url = conf["omsBaseUrl"] + conf["getTemplateGroupDetailsUrl"]
381
+ @post_update_template_group_url = conf["omsBaseUrl"] + conf["postUpdateTemplateGroupUrl"]
382
+ @post_insert_template_group_url = conf["omsBaseUrl"] + conf["postInsertTemplateGroupUrl"]
383
+
384
+ end
385
+ end
386
+
387
+ def get_stringified_value(str)
388
+ if str == nil
389
+ return ""
390
+ end
391
+ return str
392
+ end
393
+ def data_template_file_path_for_template(template_group, lang, view_type, template_name)
394
+ "#{@base_folder_path}/#{template_group}/#{lang}/#{view_type}/#{template_name}/dataTemplate.json"
395
+ end
396
+
397
+ def presentation_file_path_for_template(template_group, lang, view_type, template_name)
398
+ "#{@base_folder_path}/#{template_group}/#{lang}/#{view_type}/#{template_name}/presentation.json"
399
+ end
400
+
401
+ def default_content_file_path_for_template(template_group, lang, view_type, template_name)
402
+ "#{@base_folder_path}/#{template_group}/#{lang}/#{view_type}/#{template_name}/defaultContent.json"
403
+ end
404
+
405
+ def template_name_dir_path_for_template(template_group, language, view_type, template_name)
406
+ "#{@base_folder_path}/#{template_group}/#{language}/#{view_type}/#{template_name}"
407
+ end
408
+
409
+ def view_type_dir_path_for_template(template_group, language, view_type)
410
+ "#{@base_folder_path}/#{template_group}/#{language}/#{view_type}"
411
+ end
412
+
413
+ def view_type_dir_path_for_template_with_version(template_group, language, view_type, version)
414
+ "#{@base_folder_path}/#{template_group}/#{language}/#{view_type}/#{version}"
415
+ end
416
+
417
+ def language_dir_path_for_template(template_group, language)
418
+ "#{@base_folder_path}/#{template_group}/#{language}"
419
+ end
420
+
421
+ def transfomer_file_path_for_template(template_group)
422
+ "#{@base_folder_path}/#{template_group}/transformer.js"
423
+ end
424
+
425
+ def client_transfomer_file_path_for_template(template_group)
426
+ "#{@base_folder_path}/#{template_group}/clientTransformer.js"
427
+ end
428
+
429
+ def template_group_details_file_path_for_template(template_group)
430
+ "#{@base_folder_path}/#{template_group}/templateGroupDetails.json"
431
+ end
432
+
433
+ def template_group_dir_path_for_template(template_group)
434
+ "#{@base_folder_path}/#{template_group}"
435
+ end
436
+
437
+ def language_file_path_for_template(language)
438
+ "#{@resources_file_path}/#{language}.json"
439
+ end
440
+
441
+ def env_file_path(tenant_id, project_id)
442
+ if file_exists?("./environments/#{@environment}.json")
443
+ "./environments/#{@environment}.json"
444
+ elsif file_exists?("./environments/#{@environment}/env_#{tenant_id}_#{project_id}.json")
445
+ "./environments/#{@environment}/env_#{tenant_id}_#{project_id}.json"
446
+ else
447
+ "#{@env_data_file_path}"
448
+ end
449
+ end
450
+
451
+ end
452
+
453
+ def directory_exists?(directory)
454
+ File.directory?(directory)
455
+ end
456
+
457
+ def file_exists?(file_name)
458
+ File.file?(file_name)
459
+ end
460
+
461
+ def invoke_API(environment, url, type, query_params = nil, body = nil, authToken = nil)
462
+ secretConfig = SecretConfig.new(environment);
463
+ query_params = query_params == nil ? {} : query_params
464
+ if type == HTTP::GET
465
+ code, response = make_GET_request(url, authToken == nil ? secretConfig.authToken : authToken, query_params, true)
466
+ elsif type == HTTP::POST
467
+ response = make_POST_request(url, body, authToken == nil ? secretConfig.authToken : authToken, query_params, true)
468
+ elsif type == HTTP::DELETE
469
+ response = make_DELETE_request(url, body, authToken == nil ? secretConfig.authToken : authToken, query_params, true)
470
+ end
471
+ if response
472
+ JSON.parse response
473
+ end
474
+ end
475
+
476
+ def make_collection_POST_request (url, body, authToken, query_params = nil)
477
+ uri = URI.parse(url)
478
+ uri.query = URI.encode_www_form(query_params) if query_params != nil
479
+
480
+ http = Net::HTTP.new(uri.host, uri.port)
481
+ http.use_ssl = true
482
+ request = Net::HTTP::Post.new(uri.request_uri,
483
+ initheader = {'Content-Type' =>'application/json', 'X-Zeta-AuthToken' => authToken})
484
+ request.body = body
485
+
486
+ puts "#{uri}\n\n"
487
+ puts "#{request.body}\n\n"
488
+ http.request(request).body
489
+ end
490
+
491
+ def make_collection_GET_request (url, query_params = nil)
492
+ uri = URI(url)
493
+ uri.query = URI.encode_www_form(query_params) if query_params != nil
494
+
495
+ response = Net::HTTP.get_response(uri)
496
+ if response.is_a?(Net::HTTPSuccess)
497
+ utf8_encoded = response.body.force_encoding("UTF-8")
498
+ JSON.parse utf8_encoded
499
+ else
500
+ puts "Error occured while loading #{url}\nquery_params: #{query_params}
501
+ Error: #{response.inspect}, #{response.body}"
502
+ end
503
+ end
504
+
505
+ def write_data_to_file(file_path, data)
506
+ out_file = File.new(file_path, "w")
507
+ out_file.truncate(0)
508
+ out_file.puts JSON.pretty_generate data
509
+ out_file.close
510
+ end
511
+
512
+ def write_templated_data_to_file(configuration, collection_data)
513
+ out_file = File.new(configuration.templated_data_file_path, "w")
514
+ out_file.puts JSON.pretty_generate collection_data
515
+ out_file.close
516
+ end
517
+
518
+ def file_of_name_in_dir_path(dir_path, file_name)
519
+ file_path = ""
520
+ begin
521
+ file_path = Dir.entries(dir_path).select {
522
+ |entry| entry.include? file_name
523
+ }.first
524
+ if !(file_path == nil)
525
+ file_path = File.join(dir_path,file_path)
526
+ end
527
+ rescue Exception => e
528
+ puts "ERROR: file_of_name_in_dir_path #{dir_path} #{file_name} #{e}"
529
+ end
530
+ return file_path
531
+ end
532
+
533
+ def read_data_from_file_of_name_in_dir_path(dir_path, file_name)
534
+ file_data = {}
535
+ begin
536
+ file_path = Dir.entries(dir_path).select {
537
+ |entry| entry.include? file_name
538
+ }.first
539
+ file_path = File.join(dir_path,file_path)
540
+ file_data = File.read(file_path)
541
+ rescue Exception => e
542
+ puts "Reading from #{file_path} failed with error: #{e}"
543
+ end
544
+ return file_data
545
+ end
546
+
547
+ def read_data_from_file_path(file_path)
548
+ file_data = {}
549
+ begin
550
+ if (file_exists?(file_path))
551
+ in_file = File.read(file_path)
552
+ return if in_file == nil
553
+ file_data = in_file
554
+ else
555
+ file_data = {}
556
+ end
557
+ rescue Exception => e
558
+ puts "Reading from #{file_path} failed with error: #{e}"
559
+ file_data = {}
560
+ end
561
+ return file_data
562
+ end
563
+
564
+ def read_plain_text_data_from_file_path(file_path)
565
+ file_data = ""
566
+ begin
567
+ if (file_exists?(file_path))
568
+ in_file = File.read(file_path)
569
+ return if in_file == nil
570
+ file_data = in_file
571
+ end
572
+ rescue Exception => e
573
+ puts "Reading from #{file_path} failed with error: #{e}"
574
+ end
575
+ return file_data
576
+ end
577
+
578
+ def read_res_data_from_file_path(file_path)
579
+ file_data = {}
580
+ if (!file_exists?(file_path))
581
+ file_path = "./Resources/EN.json"
582
+ end
583
+ file_data = read_data_from_file_path(file_path)
584
+ return file_data
585
+ end
586
+
587
+ def setup_appID_uiview_template_group_directory(template_group, appID)
588
+ base_path = TemplateConfig.template_group_parent_directory_path_for_appID(template_group, appID)
589
+ contents_path = TemplateConfig.template_group_contents_path_for_appID(template_group, appID)
590
+ if (directory_exists?(base_path))
591
+ puts "Template parent directory for appID: #{appID} already exists at path: #{base_path}"
592
+ else
593
+ Dir.mkdir base_path
594
+ end
595
+
596
+ if (directory_exists?(contents_path))
597
+ puts "Template contents directory for appID: #{appID} already exists at path: #{contents_path}"
598
+ else
599
+ Dir.mkdir contents_path
600
+ end
601
+ end
602
+
603
+ def print_separator()
604
+ puts "------------------------------------------------------------------------------------------------".green
605
+ end
606
+
607
+ def print_header(message)
608
+ print_separator()
609
+ puts message.bold.magenta
610
+ print_separator()
611
+ end
612
+
613
+ def log_error(message)
614
+ puts "ERROR: #{message}".bold.red
615
+ end
616
+
617
+ def log_info(message)
618
+ puts "INFO: #{message}".bold
619
+ end
620
+
621
+ def read_new_app_template_groups_from_config()
622
+ new_app_template_groups = Array.new
623
+ file_path = "new_app_template_groups.json"
624
+
625
+ begin
626
+ new_app_templates_config = read_raw_json_data_from_file_path(file_path)
627
+ if new_app_templates_config["templateGroups"].is_a?(Array)
628
+ new_app_template_groups = new_app_templates_config["templateGroups"]
629
+ else
630
+ throw "templateGroups inside config is not an array"
631
+ end
632
+ rescue Exception => e
633
+ log_error("Failed to read new_app_template_groups_config with error: #{e}")
634
+ end
635
+ return new_app_template_groups
636
+ end
637
+
638
+ def read_raw_json_data_from_file_path(file_path)
639
+ data = Hash.new
640
+ begin
641
+ if(file_exists?(file_path))
642
+ in_file = File.read(file_path)
643
+ if in_file != nil
644
+ data = JSON.parse(in_file)
645
+ else
646
+ throw "Contents are nil"
647
+ end
648
+ end
649
+ rescue Exception => e
650
+ log_error("Failed to read contents of file at path [#{file_path}]with error: #{e}")
651
+ end
652
+ return data
653
+ end
654
+
655
+ def read_json_data_from_file_path(file_path)
656
+ file_data = {}
657
+ begin
658
+ if (file_exists?(file_path))
659
+ in_file = File.read(file_path)
660
+ return if in_file == nil
661
+ data = JSON.parse(in_file)
662
+ data = data.to_json
663
+ file_data = data
664
+ else
665
+ file_data = {}
666
+ end
667
+ rescue Exception => e
668
+ puts "Reading from #{file_path} failed with error: #{e}"
669
+ file_data = {}
670
+ end
671
+ return file_data
672
+ end
673
+
674
+ def print_separator_line()
675
+ puts "--------------------------------------------------------------------------------------------------------------------------------------"
676
+ end
677
+
678
+ def does_templated_data_has_payment_instrument_as_states(templated_data, activePaymentInstrumentID, os)
679
+ if os == "android"
680
+ outer_states = templated_data["states"]
681
+ if outer_states
682
+ if !outer_states.empty?
683
+ inner_states = outer_states["states"]
684
+ if !inner_states.empty?
685
+ keys = inner_states.keys
686
+ return keys.include? activePaymentInstrumentID
687
+ end
688
+ end
689
+ end
690
+ end
691
+ if os == "ios"
692
+ outer_states = templated_data["states"]
693
+ keys = outer_states.keys
694
+ return keys.include? activePaymentInstrumentID
695
+ end
696
+ end
697
+
698
+ def directory_list(dir_path)
699
+ dirNames = []
700
+ Dir.entries(dir_path).select {
701
+ |entry| File.directory? File.join(dir_path,entry) and !(entry =='.' || entry == '..')
702
+ }.each do |item|
703
+ dirNames.push(item)
704
+ end
705
+ return dirNames
706
+ end
707
+
708
+ def all_directory_and_sub_directory_with_character_not_in_dir_path(dir_path, character)
709
+ dirNames = Hash.new
710
+ Dir.entries(dir_path).select {
711
+ |entry| File.directory? File.join(dir_path,entry) and !(entry =='.' || entry == '..')
712
+ }.each do |item|
713
+ indexOfCharacter = item.index(character)
714
+ indexOfTemplater = item.index("{{")
715
+ if indexOfCharacter and indexOfCharacter >= 0 and (!indexOfTemplater || indexOfCharacter < indexOfTemplater)
716
+ dirNames = dirNames.merge(all_directory_and_sub_directory_with_character_not_in_dir_path(File.join(dir_path,item), character))
717
+ else
718
+ dirNames[item] = File.join(dir_path,item)
719
+ end
720
+ end
721
+ return dirNames
722
+ end
723
+
724
+ def all_directory_and_sub_directory_in_dir_path(dir_path)
725
+ dirNames = Hash.new
726
+ Dir.entries(dir_path).select {
727
+ |entry| File.directory? File.join(dir_path,entry) and !(entry =='.' || entry == '..')
728
+ }.each do |item|
729
+ dir_path_of_item = File.join(dir_path,item)
730
+ dir_names_of_item = directory_list(dir_path_of_item)
731
+ if dir_names_of_item.count > 0
732
+ dirNames[item] = File.join(dir_path,item)
733
+ dirNames = dirNames.merge(all_directory_and_sub_directory_in_dir_path(dir_path_of_item))
734
+ else
735
+ dirNames[item] = File.join(dir_path,item)
736
+ end
737
+ end
738
+ return dirNames
739
+ end
740
+
741
+ def template_mapping_in_dir_path_file_path_with_character(dir_path, file_path, character)
742
+ dir_path += "/"
743
+ file_path.slice! dir_path
744
+ mapping_components = file_path.split('/')
745
+ template_mapping = "";
746
+ mapping_components.each do |item|
747
+ if item == "default"
748
+ template_mapping = "*"
749
+ else
750
+ length = item.length
751
+ indexOfCharacter = item.index(character)
752
+ indexOfTemplater = item.index("{{")
753
+ if indexOfCharacter and indexOfCharacter >= 0 and (!indexOfTemplater || indexOfCharacter < indexOfTemplater)
754
+ item_component = item.slice!(indexOfCharacter+1..length-1)
755
+ if template_mapping.empty?
756
+ mapping = item_component
757
+ else
758
+ mapping = "_" + item_component
759
+ end
760
+ template_mapping += mapping
761
+ end
762
+ end
763
+ end
764
+ return template_mapping
765
+ end
766
+
767
+ def get_presentation_after_conversion_if_neeeded(apolloConfigBaseUrl, environment, template_path)
768
+ begin
769
+ #Parsing Presentation
770
+ presentation_file_path = file_of_name_in_dir_path(template_path,"presentation")
771
+ puts "presentation_file_path #{presentation_file_path}"
772
+ presentation = read_data_from_file_path(presentation_file_path)
773
+
774
+ #template should fail if presentation file is not present at all
775
+ if presentation_file_path == nil
776
+ raise "ERROR: Presentation file not found at path: #{presentation_file_path}"
777
+ end
778
+
779
+ if presentation_file_path.end_with? ".json"
780
+ #if presentation file is json, then enforce proper json
781
+ if !JSON.is_valid_json?(presentation)
782
+ raise "ERROR: Presentation is not a valid JSON"
783
+ end
784
+ presentation = JSON.parse(presentation, :quirks_mode => true).to_json
785
+ return presentation
786
+ elsif presentation_file_path.end_with? ".xml"
787
+ presentation = presentation.newline
788
+ puts "converting presentation xml #{presentation}"
789
+ json_presentation_string = convert_xml_presentation_to_json(environment, apolloConfigBaseUrl, presentation)
790
+ puts "converted presentation to json #{json_presentation_string}"
791
+ return json_presentation_string
792
+ end
793
+ rescue Exception => e
794
+ puts "ERROR: Template loading from #{template_path} failed with error: #{e}"
795
+ end
796
+ end
797
+
798
+ def convert_xml_presentation_to_json(environment, apolloConfigBaseUrl, presentation)
799
+ request_payload = ConvertPresentationPayload.new(presentation, "XML", "JSON")
800
+ endpoint = "#{apolloConfigBaseUrl}/1.0/presentation/convert"
801
+ converted_presentation = invoke_API(environment, endpoint, HTTP::POST, nil, request_payload.to_json)
802
+ return converted_presentation["presentation"].unesc
803
+ end
804
+
805
+ module ApolloCommonsRuby
806
+ class Error < StandardError; end
807
+ # Your code goes here...
808
+ end