apollo_commons_ruby 0.7.0
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.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +19 -0
- data/README.md +40 -0
- data/Rakefile +2 -0
- data/apollo_commons_ruby-0.2.0.gem +0 -0
- data/apollo_commons_ruby-0.3.0.gem +0 -0
- data/apollo_commons_ruby-0.4.0.gem +0 -0
- data/apollo_commons_ruby-0.5.0.gem +0 -0
- data/apollo_commons_ruby-0.6.0.gem +0 -0
- data/apollo_commons_ruby.gemspec +26 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/apollo_commons_ruby.rb +34 -0
- data/lib/apollo_commons_ruby/DomainEvent.rb +122 -0
- data/lib/apollo_commons_ruby/FileUtils.rb +41 -0
- data/lib/apollo_commons_ruby/MarioEvent.rb +45 -0
- data/lib/apollo_commons_ruby/NetworkUtils.rb +67 -0
- data/lib/apollo_commons_ruby/Operation.rb +4 -0
- data/lib/apollo_commons_ruby/ResolveTemplate.rb +53 -0
- data/lib/apollo_commons_ruby/SecretConfig.rb +15 -0
- data/lib/apollo_commons_ruby/TemplateBuilder.rb +26 -0
- data/lib/apollo_commons_ruby/TemplatesHelper.rb +814 -0
- data/lib/apollo_commons_ruby/TemplatesRakefile.rb +816 -0
- data/lib/apollo_commons_ruby/ViewGroup.rb +62 -0
- data/lib/apollo_commons_ruby/ViewGroupComponent.rb +66 -0
- data/lib/apollo_commons_ruby/ViewGroupDefinition.rb +61 -0
- data/lib/tasks/add_translations.rake +9 -0
- data/lib/tasks/checkValidJson.rake +17 -0
- data/lib/tasks/delete_domain_event.rake +7 -0
- data/lib/tasks/delete_view_group.rake +7 -0
- data/lib/tasks/delete_view_group_component.rake +7 -0
- data/lib/tasks/delete_view_group_definition.rake +7 -0
- data/lib/tasks/deploy_all_templates.rake +7 -0
- data/lib/tasks/runTests.rake +27 -0
- data/lib/tasks/update_all.rake +36 -0
- data/lib/tasks/update_all_domain_events.rake +24 -0
- data/lib/tasks/update_all_view_group_components.rake +18 -0
- data/lib/tasks/update_domain_event.rake +11 -0
- data/lib/tasks/update_one_template.rake +42 -0
- data/lib/tasks/update_translations.rake +24 -0
- data/lib/tasks/update_view_group_component.rake +9 -0
- data/lib/tasks/update_view_group_definition.rake +7 -0
- data/lib/tasks/update_view_group_for_user_0.rake +36 -0
- data/lib/version.rb +3 -0
- metadata +91 -0
@@ -0,0 +1,816 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'git'
|
3
|
+
require 'rubygems'
|
4
|
+
require_relative 'ResolveTemplate'
|
5
|
+
require_relative 'TemplatesHelper'
|
6
|
+
# require "google/cloud/translate"
|
7
|
+
|
8
|
+
def create_template_from_file (configuration, template_group, language, view, template_name, template_path, is_apollo_config, tenant_id, project_id)
|
9
|
+
begin
|
10
|
+
|
11
|
+
puts "template_name #{template_name}"
|
12
|
+
#Parsing Presentation
|
13
|
+
presentation_file_path = file_of_name_in_dir_path(template_path,"presentation")
|
14
|
+
puts "presentation_file_path #{presentation_file_path}"
|
15
|
+
presentation = read_data_from_file_path(presentation_file_path)
|
16
|
+
|
17
|
+
#template should fail if presentation file is not present at all
|
18
|
+
if presentation_file_path == nil
|
19
|
+
raise "ERROR: Presentation file not found at path: #{presentation_file_path}"
|
20
|
+
end
|
21
|
+
|
22
|
+
if presentation_file_path.end_with? ".json"
|
23
|
+
#if presentation file is json, then enforce proper json
|
24
|
+
if !JSON.is_valid_json?(presentation)
|
25
|
+
raise "ERROR: Presentation is not a valid JSON"
|
26
|
+
end
|
27
|
+
presentation = JSON.parse(presentation).to_json
|
28
|
+
presentation = ResolveTemplate.new.resolveLang(presentation.to_json, configuration,language)
|
29
|
+
presentation = JSON.parse(presentation, :quirks_mode => true)
|
30
|
+
end
|
31
|
+
if presentation_file_path.end_with? ".html"
|
32
|
+
presentation = ResolveTemplate.new.resolveLang(presentation, configuration, language)
|
33
|
+
presentation = Base64.encode64(presentation).newline
|
34
|
+
else
|
35
|
+
presentation = ResolveTemplate.new.resolveLang(presentation, configuration, language)
|
36
|
+
presentation = Base64.encode64(presentation.newline).newline
|
37
|
+
end
|
38
|
+
|
39
|
+
#Parsing Default Content
|
40
|
+
default_content_file_path = file_of_name_in_dir_path(template_path,"defaultContent")
|
41
|
+
#many templates will not support defaultContent, hence initializing a default value
|
42
|
+
default_content = {}
|
43
|
+
if !(default_content_file_path == nil)
|
44
|
+
#Default Content file is present
|
45
|
+
begin
|
46
|
+
default_content = read_data_from_file_path(default_content_file_path)
|
47
|
+
rescue Exception => e
|
48
|
+
#Mostly this should not happen, but a sanity check
|
49
|
+
puts "ERROR: default content file not found #{e}"
|
50
|
+
end
|
51
|
+
#If default content is read from file, it should be definitely be of JSON format because i.e. what the API expects
|
52
|
+
if !JSON.is_valid_json?(default_content)
|
53
|
+
#If not, throw exception
|
54
|
+
raise "ERROR: default content is not a valid JSON"
|
55
|
+
else
|
56
|
+
#Convert json file read to hash so that it is passed to API in json form
|
57
|
+
default_content = JSON.parse(default_content)
|
58
|
+
default_content = ResolveTemplate.new.resolveEnv(default_content.to_json, configuration, tenant_id, project_id)
|
59
|
+
default_content = JSON.parse(default_content)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
default_content_string = default_content.to_json
|
63
|
+
|
64
|
+
transformer_file_path = file_of_name_in_dir_path(configuration.template_group_dir_path_for_template(template_group), "clientTransformer")
|
65
|
+
|
66
|
+
isClientTransformerFound = false
|
67
|
+
if !(transformer_file_path == nil)
|
68
|
+
|
69
|
+
isClientTransformerFound = true
|
70
|
+
|
71
|
+
begin
|
72
|
+
client_transformer = get_client_transformer_without_require(transformer_file_path)
|
73
|
+
rescue Exception => e
|
74
|
+
#Mostly this should not happen, but a sanity check
|
75
|
+
puts "ERROR: client transformer file not found #{e}"
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
if client_transformer == nil
|
80
|
+
client_transformer = "";
|
81
|
+
end
|
82
|
+
|
83
|
+
client_transformer = client_transformer.newline.tabs
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
#Parsing data template
|
88
|
+
data_template_file_path = file_of_name_in_dir_path(template_path,"dataTemplate")
|
89
|
+
puts "data_template_file_path #{data_template_file_path}"
|
90
|
+
#many templates will not support dataTemplate, hence initializing a default value
|
91
|
+
data_template = "{}"
|
92
|
+
if !(data_template_file_path == nil)
|
93
|
+
#data template file is present
|
94
|
+
begin
|
95
|
+
data_template = read_data_from_file_path(data_template_file_path)
|
96
|
+
rescue Exception => e
|
97
|
+
#Mostly this should not happen, but a sanity check
|
98
|
+
puts "ERROR: data template file not found #{e}"
|
99
|
+
end
|
100
|
+
if data_template_file_path.end_with? ".json" and !data_template.newline.empty?
|
101
|
+
#if data template file is json, then enforce proper json
|
102
|
+
if !JSON.is_valid_json?(data_template)
|
103
|
+
raise "ERROR: data template is not a valid JSON"
|
104
|
+
end
|
105
|
+
data_template = "#{data_template}"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
#Parsing client transformer specific to individual template
|
110
|
+
specific_client_transformer_file_path = file_of_name_in_dir_path(template_path,"clientTransformer")
|
111
|
+
puts "specific_client_transformer_file_path #{specific_client_transformer_file_path}"
|
112
|
+
specific_client_transformer = "{}";
|
113
|
+
if !(specific_client_transformer_file_path == nil)
|
114
|
+
begin
|
115
|
+
specific_client_transformer = get_client_transformer_without_require(specific_client_transformer_file_path)
|
116
|
+
rescue Exception => e
|
117
|
+
puts "ERROR: specific client transformer file not found #{e}"
|
118
|
+
end
|
119
|
+
if isClientTransformerFound
|
120
|
+
client_transformer = client_transformer + "\n" + specific_client_transformer
|
121
|
+
elsif specific_client_transformer
|
122
|
+
client_transformer = specific_client_transformer
|
123
|
+
isClientTransformerFound = true
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
#Parsing attrs json
|
128
|
+
attrs_json_file_path = file_of_name_in_dir_path(template_path, "attrs")
|
129
|
+
puts "attrs_json_file_path #{attrs_json_file_path}"
|
130
|
+
#many templates will not have attrs json, hence initializing a default value
|
131
|
+
attrs_json = "{}"
|
132
|
+
if !(attrs_json_file_path == nil)
|
133
|
+
#attrs file is present
|
134
|
+
begin
|
135
|
+
attrs_json = read_data_from_file_path(attrs_json_file_path)
|
136
|
+
rescue Exception => e
|
137
|
+
#Mostly this should not happen, but a sanity check
|
138
|
+
puts "ERROR: attrs file not found #{e}"
|
139
|
+
end
|
140
|
+
if attrs_json_file_path.end_with? ".json" and !attrs_json.newline.empty?
|
141
|
+
#if attrs file is json, then enforce proper json
|
142
|
+
if !JSON.is_valid_json?(attrs_json)
|
143
|
+
raise "ERROR: attrs is not a valid JSON"
|
144
|
+
end
|
145
|
+
attrs_json = "#{attrs_json}"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
if isClientTransformerFound
|
150
|
+
client_transformer = client_transformer.newline.tabs
|
151
|
+
if client_transformer.scan(/^\s*<%.*%>\s*$/).length == 0
|
152
|
+
client_transformer = "<% #{client_transformer} %>"
|
153
|
+
end
|
154
|
+
if JSON.is_valid_json?(data_template)
|
155
|
+
data_template_hash_new = Hash.new
|
156
|
+
data_template_hash_new["__transformer"] = client_transformer
|
157
|
+
data_template_hash = JSON.parse(data_template)
|
158
|
+
data_template_hash_new.merge!(data_template_hash)
|
159
|
+
data_template = data_template_hash_new.to_json
|
160
|
+
else
|
161
|
+
data_template = "#{client_transformer}#{data_template}"
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
data_template = ResolveTemplate.new.resolveEnv(data_template, configuration, tenant_id, project_id)
|
166
|
+
data_template = ResolveTemplate.new.resolveLang(data_template, configuration, language)
|
167
|
+
data_template = Base64.encode64(data_template.newline).newline
|
168
|
+
|
169
|
+
if is_apollo_config
|
170
|
+
Template.new(template_name, default_content_string, data_template, presentation, attrs_json)
|
171
|
+
else
|
172
|
+
Template.new(template_name, default_content, data_template, presentation, attrs_json)
|
173
|
+
end
|
174
|
+
rescue Exception => e
|
175
|
+
puts "ERROR: Template loading from #{template_group} failed with error: #{e}"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def create_template_mapping_payload(template_group, language, view_type, templateMappings, version)
|
180
|
+
body = {
|
181
|
+
"templateGroup" => template_group,
|
182
|
+
"language" => language,
|
183
|
+
"viewType" => view_type,
|
184
|
+
"templateMappings" => templateMappings,
|
185
|
+
"version" => version
|
186
|
+
}
|
187
|
+
end
|
188
|
+
|
189
|
+
def get_parsed_template_group_details(configuration,template_group)
|
190
|
+
template_group_details_file_path = configuration.template_group_details_file_path_for_template(template_group)
|
191
|
+
template_group_details = read_json_data_from_file_path(template_group_details_file_path)
|
192
|
+
return JSON.parse(template_group_details)
|
193
|
+
end
|
194
|
+
|
195
|
+
def verify_and_get_template_version(version)
|
196
|
+
allowed_versions = {"v2" => "iOS_v2", "v3" => "iOS_v3"}
|
197
|
+
if version == nil
|
198
|
+
return nil
|
199
|
+
end
|
200
|
+
|
201
|
+
if allowed_versions.has_value?(version)
|
202
|
+
return version
|
203
|
+
end
|
204
|
+
|
205
|
+
if allowed_versions.key?(version)
|
206
|
+
return allowed_versions[version]
|
207
|
+
end
|
208
|
+
|
209
|
+
raise "Unsupported template version: #{version}"
|
210
|
+
end
|
211
|
+
|
212
|
+
def perform_git_checks
|
213
|
+
current_branch = `git rev-parse --abbrev-ref HEAD`
|
214
|
+
if current_branch.eql?("master")
|
215
|
+
raise "Rake update in Prod can be performed only from master branch."
|
216
|
+
end
|
217
|
+
|
218
|
+
system("git fetch origin master > /dev/null 2>&1") or raise "Unable to fetch origin/master from git remote"
|
219
|
+
master = `git rev-parse master`
|
220
|
+
origin_master = `git rev-parse origin/master`
|
221
|
+
|
222
|
+
if !master.eql?(origin_master)
|
223
|
+
raise "Master is not in sync with Origin. Pull changes from remote and retry."
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def get_client_transformer_without_require(file)
|
228
|
+
input_file_path = file.to_s
|
229
|
+
final_transformer_output = ""
|
230
|
+
line_number_of_require_in_input_file = 0
|
231
|
+
line_numbers_to_delete = []
|
232
|
+
terminate_processing_of_require_line = false
|
233
|
+
#Filter require lines and compute the path to transformer from the line
|
234
|
+
File.readlines(input_file_path).each do |require_line|
|
235
|
+
line_number_of_require_in_input_file += 1
|
236
|
+
is_requires = require_line.index("require ") == 0
|
237
|
+
#Iterate through the require lines, until the match is not found.
|
238
|
+
#Ignore rest of the lines that match 'require'.
|
239
|
+
if is_requires and !terminate_processing_of_require_line then
|
240
|
+
#Mark the lines that contain 'require' in the top part of the file
|
241
|
+
line_numbers_to_delete << line_number_of_require_in_input_file
|
242
|
+
require_line.slice! "require "
|
243
|
+
require_line = require_line.strip
|
244
|
+
require_line = require_line.gsub('"', '')
|
245
|
+
if !file_exists?(require_line)
|
246
|
+
raise "ERROR: Transformer file #{require_line} not found"
|
247
|
+
end
|
248
|
+
transformer_output = read_plain_text_data_from_file_path(require_line)
|
249
|
+
if (transformer_output == "")
|
250
|
+
raise "ERROR: Transformer file #{require_line} empty"
|
251
|
+
end
|
252
|
+
#Append transformers in the order of the require statements
|
253
|
+
final_transformer_output = final_transformer_output + transformer_output + "\n"
|
254
|
+
else
|
255
|
+
terminate_processing_of_require_line = true
|
256
|
+
end
|
257
|
+
end
|
258
|
+
current_file_output = read_plain_text_data_from_file_path(input_file_path)
|
259
|
+
if final_transformer_output == "" then
|
260
|
+
current_file_output
|
261
|
+
else
|
262
|
+
current_line_number = 0
|
263
|
+
#Strip off 'require' commands from the current file's data(does not modify the file) present in the form of a variable
|
264
|
+
client_transformer_with_no_require_lines = ""
|
265
|
+
current_file_output.each_line do |line|
|
266
|
+
current_line_number += 1
|
267
|
+
should_remove_line = line_numbers_to_delete.include? current_line_number
|
268
|
+
#Remove the line if we had marked it for removal earlier
|
269
|
+
client_transformer_with_no_require_lines << line unless should_remove_line
|
270
|
+
end
|
271
|
+
#Prepend all the transformers to the script to be updated to the script that does not have 'require' command
|
272
|
+
client_transformer_with_no_require_lines = final_transformer_output + "\n" + client_transformer_with_no_require_lines
|
273
|
+
client_transformer_with_no_require_lines
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def update_existing_translations(source_path, language_resource_path)
|
278
|
+
if (!file_exists?(language_resource_path))
|
279
|
+
log_error("Update Failed! No translation resource found at path [ #{language_resource_path} ]")
|
280
|
+
abort()
|
281
|
+
end
|
282
|
+
|
283
|
+
if (!file_exists?(source_path))
|
284
|
+
log_error("No source file found at path [ #{source_path} ]")
|
285
|
+
abort()
|
286
|
+
end
|
287
|
+
|
288
|
+
source_file_plain_text_data = read_plain_text_data_from_file_path(source_path)
|
289
|
+
|
290
|
+
new_translations = Hash.new
|
291
|
+
source_file_plain_text_data.split("\r\n").each { |value|
|
292
|
+
key_value_array = value.split(',')
|
293
|
+
# puts "Value: #{value} key_value_array: #{key_value_array}"
|
294
|
+
# abort()
|
295
|
+
if key_value_array.length >= 2
|
296
|
+
key = key_value_array[0]
|
297
|
+
key_value_array.delete_at(0)
|
298
|
+
value = key_value_array.join
|
299
|
+
|
300
|
+
new_translations[key] = value
|
301
|
+
else
|
302
|
+
log_error("Terminating! Found incorrect translation key,pair [ #{key_value_array}]")
|
303
|
+
abort()
|
304
|
+
end
|
305
|
+
}
|
306
|
+
|
307
|
+
old_translations = read_raw_json_data_from_file_path(language_resource_path);
|
308
|
+
|
309
|
+
new_translations.each { |key, value|
|
310
|
+
if old_translations.has_key?(key)
|
311
|
+
old_translations[key] = value
|
312
|
+
log_info("Updated translation for key [ #{key} ] with value: [ #{value} ]")
|
313
|
+
else
|
314
|
+
log_error("Key #{key} does not exist in existing translations. Ignoring it")
|
315
|
+
end
|
316
|
+
}
|
317
|
+
|
318
|
+
if new_translations.length > 0
|
319
|
+
log_info("Writing updated translations to file at path [ #{language_resource_path}]")
|
320
|
+
write_data_to_file(language_resource_path, old_translations)
|
321
|
+
else
|
322
|
+
log_info("Translations not updated due to no new updates")
|
323
|
+
end
|
324
|
+
|
325
|
+
end
|
326
|
+
|
327
|
+
desc "Available options"
|
328
|
+
task :default do
|
329
|
+
puts "'rake update_one_template environment=Staging template_group=MCCS-grant-VOUCHER version=v2 scope_id=1001' to build the template for a template group. Version is optional. scope_id is required for templates. It will build for all languages and view_type present in the template group. If you want to build specifically for a view type or language or template_name, specify language or view_type or template_name as query param"
|
330
|
+
end
|
331
|
+
|
332
|
+
|
333
|
+
# $LINE_REPLACEMENT_DETAILS_LIST = Array.new
|
334
|
+
# $TRANSLATOR = Google::Cloud::Translate.new(
|
335
|
+
# project_id: "zeta-pay",
|
336
|
+
# credentials: "./keyfile.json"
|
337
|
+
# )
|
338
|
+
|
339
|
+
def get_translated_line(text, target_language)
|
340
|
+
return $TRANSLATOR.translate text, to: target_language
|
341
|
+
end
|
342
|
+
|
343
|
+
def is_alpha_char(char)
|
344
|
+
return char == "s" || char == "f" || char == "d"
|
345
|
+
end
|
346
|
+
|
347
|
+
def is_numeric_char(char)
|
348
|
+
return char == "1" || char == "2" || char == "3" || char == "4" || char == "5" || char == "6" || char == "7" || char == "8" || char == "9"
|
349
|
+
end
|
350
|
+
|
351
|
+
def format_translated_line(text)
|
352
|
+
text = text.to_s.gsub("'", " ")
|
353
|
+
text = text.to_s.gsub(""", "\"")
|
354
|
+
text = text.to_s.gsub("<", "<")
|
355
|
+
text = text.to_s.gsub(">", ">")
|
356
|
+
index = 0
|
357
|
+
output = ""
|
358
|
+
length = text.length
|
359
|
+
while index < length
|
360
|
+
char = text[index]
|
361
|
+
if (char == "%" && index + 1 < length && text[index + 1] == " " && index + 2 < length && is_alpha_char(text[index + 2]))
|
362
|
+
output = output + " " + "%" + text[index + 2]
|
363
|
+
index = index + 2
|
364
|
+
elsif (char == "%" && index + 1 < length && text[index + 1] == " " && index + 2 < length && is_numeric_char(text[index + 2]) &&
|
365
|
+
index + 3 < length && text[index + 3] == " " && index + 4 < length && text[index + 4] == "$" &&
|
366
|
+
index + 5 < length && text[index + 5] == " " && index + 6 < length && is_alpha_char(text[index + 6]))
|
367
|
+
output = output + " " + "%" + text[index + 2] + "$" + text[index + 6]
|
368
|
+
index = index + 6
|
369
|
+
elsif (char == "\\" && index + 1 < length && text[index + 1] == " " && index + 2 < length && text[index + 2] == "n")
|
370
|
+
output = output + "\n"
|
371
|
+
index = index + 2
|
372
|
+
elsif (char == " " && index + 1 < length && text[index + 1] == "%" && index + 2 < length && text[index + 2] == " " &&
|
373
|
+
index + 3 < length && text[index + 3] == "%")
|
374
|
+
output = output + "%% "
|
375
|
+
index = index + 3
|
376
|
+
elsif (char == "<" && index + 1 < length && text[index + 1] == "%" && index + 2 < length && text[index + 2] == " " &&
|
377
|
+
index + 3 < length && text[index + 3] == "=")
|
378
|
+
output = output + "<%= "
|
379
|
+
index = index + 3
|
380
|
+
else
|
381
|
+
output = output + text[index]
|
382
|
+
end
|
383
|
+
index = index + 1
|
384
|
+
end
|
385
|
+
return output
|
386
|
+
end
|
387
|
+
|
388
|
+
def modify_file_line(line_replacement_details)
|
389
|
+
file_path = line_replacement_details.file_path
|
390
|
+
modified_file = IO.readlines(file_path).map do |line|
|
391
|
+
get_appropriate_line(line, line_replacement_details)
|
392
|
+
end
|
393
|
+
File.open(file_path, 'w') do |file|
|
394
|
+
file.puts modified_file
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
def get_appropriate_line(line, line_replacement_details)
|
399
|
+
if (line.strip.start_with?(line_replacement_details.redundant_line_prefix.strip))
|
400
|
+
return line_replacement_details.updated_line
|
401
|
+
end
|
402
|
+
return line
|
403
|
+
end
|
404
|
+
|
405
|
+
def change_line_in_file(line_replacement_list)
|
406
|
+
line_replacement_list.each do |line_replacement_details|
|
407
|
+
modify_file_line(line_replacement_details)
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
def get_modified_replacement_property(line_replacement_details)
|
412
|
+
file_path = line_replacement_details.file_path
|
413
|
+
redundant_line_prefix = line_replacement_details.redundant_line_prefix
|
414
|
+
updated_line = line_replacement_details.updated_line.to_s[0...-2]
|
415
|
+
return LineReplacementProperties.new(file_path, redundant_line_prefix, updated_line)
|
416
|
+
end
|
417
|
+
|
418
|
+
|
419
|
+
def add_translations_for_language(module_name, languages)
|
420
|
+
languages.split(",").each do |language|
|
421
|
+
if ("en-EN" == language)
|
422
|
+
puts "Default language is English. No need for translations"
|
423
|
+
next
|
424
|
+
end
|
425
|
+
target_language = language.split("-")[0]
|
426
|
+
target_file = language.split("-")[1] + ".json"
|
427
|
+
base_path = "./Resources/"
|
428
|
+
File.delete(base_path + target_file) if File.exist?(base_path + target_file)
|
429
|
+
puts "Removing file #{target_file}" if File.exist?(base_path + target_file)
|
430
|
+
file_name = "EN.json"
|
431
|
+
target_file_path = base_path + target_file
|
432
|
+
FileUtils.cp(base_path + file_name, target_file_path)
|
433
|
+
IO.readlines(target_file_path).map do |line|
|
434
|
+
trimmed_line = line.strip
|
435
|
+
if trimmed_line.length != 0
|
436
|
+
begin
|
437
|
+
value = trimmed_line.split(":")[1]
|
438
|
+
translated_line = format_translated_line(get_translated_line(value, target_language))
|
439
|
+
if (!translated_line.to_s.end_with? ",")
|
440
|
+
translated_line = translated_line + ","
|
441
|
+
end
|
442
|
+
formatted_line = trimmed_line.split(":")[0] + ": " + translated_line.to_s.strip
|
443
|
+
puts "Translated Line #{formatted_line}"
|
444
|
+
$LINE_REPLACEMENT_DETAILS_LIST.push(LineReplacementProperties.new(target_file_path, line, line.gsub(trimmed_line, formatted_line)))
|
445
|
+
rescue
|
446
|
+
puts "Translation failed. Using the default line in place"
|
447
|
+
$LINE_REPLACEMENT_DETAILS_LIST.push(LineReplacementProperties.new(target_file_path, line, line))
|
448
|
+
end
|
449
|
+
end
|
450
|
+
end
|
451
|
+
#Remove ending }
|
452
|
+
$LINE_REPLACEMENT_DETAILS_LIST.pop()
|
453
|
+
#Modify the last element which has , appended to it
|
454
|
+
$LINE_REPLACEMENT_DETAILS_LIST.push(get_modified_replacement_property($LINE_REPLACEMENT_DETAILS_LIST.pop()))
|
455
|
+
change_line_in_file($LINE_REPLACEMENT_DETAILS_LIST)
|
456
|
+
end
|
457
|
+
end
|
458
|
+
|
459
|
+
def deploy_all_templates()
|
460
|
+
# current_dir = Dir.pwd
|
461
|
+
# if !current_dir.include? "/Users/ios-ci/.jenkins/jobs/"
|
462
|
+
# puts "This rake command is no more supported. Please use jenkins build http://iosci.corp.zeta.in:8080/job/"
|
463
|
+
# return nil
|
464
|
+
# end
|
465
|
+
|
466
|
+
environment = ENV['environment']
|
467
|
+
if environment == nil
|
468
|
+
puts "`environment` has to be passed. Environment = `Prod`/'PreProd'/`Staging`"
|
469
|
+
return
|
470
|
+
end
|
471
|
+
|
472
|
+
if environment.eql?("Prod")
|
473
|
+
#perform_git_checks
|
474
|
+
end
|
475
|
+
|
476
|
+
require 'ostruct'
|
477
|
+
require 'parallel'
|
478
|
+
configuration = Configuration.new(environment)
|
479
|
+
template_groups = directory_list(configuration.base_folder_path)
|
480
|
+
total_tasks_size = 0
|
481
|
+
if template_groups
|
482
|
+
total_tasks_size = template_groups.size
|
483
|
+
end
|
484
|
+
puts "Total number of tasks to execute: #{total_tasks_size}"
|
485
|
+
puts "\n\n"
|
486
|
+
iter = 0
|
487
|
+
tasks = []
|
488
|
+
template_groups.each do |template_group|
|
489
|
+
#template_group = "MCCS-grant-VOUCHER"
|
490
|
+
shouldIgnore = false;
|
491
|
+
iter+=1
|
492
|
+
if shouldIgnore
|
493
|
+
puts "Task #{iter}/#{total_tasks_size}: Ignoring for templateGroup #{template_group} because already done in previous build"
|
494
|
+
next
|
495
|
+
else
|
496
|
+
puts "Task #{iter}/#{total_tasks_size}: Scheduling deployment for template_group #{template_group}"
|
497
|
+
end
|
498
|
+
ENV['environment'] = environment
|
499
|
+
ENV['template_group'] = template_group
|
500
|
+
|
501
|
+
task_to_schedule = OpenStruct.new
|
502
|
+
task_to_schedule.environment = ENV['environment']
|
503
|
+
task_to_schedule.template_group = ENV['template_group']
|
504
|
+
task_to_schedule.language = ENV['language']
|
505
|
+
task_to_schedule.view_type = ENV['view_type']
|
506
|
+
task_to_schedule.template_name = ENV['template_name']
|
507
|
+
task_to_schedule.version = ENV['version']
|
508
|
+
task_to_schedule.should_update_inbox = false
|
509
|
+
task_to_schedule.tenant_id = ENV['tenant_id']
|
510
|
+
task_to_schedule.project_id = ENV['project_id']
|
511
|
+
if ENV['scope_id'] === nil
|
512
|
+
raise "scope_id is mandatory for deploying templates."
|
513
|
+
end
|
514
|
+
task_to_schedule.scope_id = ENV['scope_id']
|
515
|
+
task_to_schedule.task_id = iter
|
516
|
+
tasks << task_to_schedule
|
517
|
+
end
|
518
|
+
puts "STARTING DEPLOYMENT NOW"
|
519
|
+
results = Parallel.map(tasks, progress: "DEPLOYING ALL TEMPLATES", :in_processes => 1) do |task|
|
520
|
+
begin
|
521
|
+
deploy_one_template(task)
|
522
|
+
rescue Exception => e
|
523
|
+
puts "Error for template " + task.template_group + " " + e.backtrace.to_s
|
524
|
+
File.open("templateScopeError.txt", "a") do |f|
|
525
|
+
f.puts(task.template_group )
|
526
|
+
end
|
527
|
+
end
|
528
|
+
end
|
529
|
+
puts "DONE!"
|
530
|
+
end
|
531
|
+
|
532
|
+
def deploy_one_template(task)
|
533
|
+
environment = task.environment
|
534
|
+
template_group = task.template_group
|
535
|
+
language = task.language
|
536
|
+
view_type = task.view_type
|
537
|
+
template_name = task.template_name
|
538
|
+
version = task.version
|
539
|
+
scope_id = task.scope_id
|
540
|
+
should_update_inbox = task.should_update_inbox
|
541
|
+
tenant_id = task.tenant_id
|
542
|
+
project_id = task.project_id
|
543
|
+
|
544
|
+
configuration = Configuration.new(environment)
|
545
|
+
return if configuration == nil
|
546
|
+
|
547
|
+
version = verify_and_get_template_version(version)
|
548
|
+
|
549
|
+
didOnce = false
|
550
|
+
template_group_details = get_parsed_template_group_details(configuration,template_group)
|
551
|
+
|
552
|
+
languages = []
|
553
|
+
if language == nil
|
554
|
+
languages = template_group_details["supportedLanguages"]
|
555
|
+
else
|
556
|
+
languages.push(language)
|
557
|
+
end
|
558
|
+
|
559
|
+
specific_language_folders = []
|
560
|
+
dir_path = configuration.template_group_dir_path_for_template(template_group)
|
561
|
+
specific_language_folders = directory_list(dir_path)
|
562
|
+
|
563
|
+
if languages.empty?
|
564
|
+
return "No language found"
|
565
|
+
end
|
566
|
+
|
567
|
+
puts "languages #{languages}"
|
568
|
+
|
569
|
+
languageMappings = template_group_details["languageMappings"]
|
570
|
+
|
571
|
+
languages.each do |language|
|
572
|
+
template_language_folder = language
|
573
|
+
if !specific_language_folders.include?(language)
|
574
|
+
template_language_folder = "common"
|
575
|
+
end
|
576
|
+
|
577
|
+
viewTypes = []
|
578
|
+
if view_type == nil
|
579
|
+
dir_path = configuration.language_dir_path_for_template(template_group, template_language_folder)
|
580
|
+
viewTypes = directory_list(dir_path)
|
581
|
+
else
|
582
|
+
viewTypes.push(view_type)
|
583
|
+
end
|
584
|
+
|
585
|
+
if viewTypes.empty?
|
586
|
+
return "No view types found"
|
587
|
+
end
|
588
|
+
|
589
|
+
puts "viewTypes #{viewTypes}"
|
590
|
+
|
591
|
+
viewTypes.each do |view_type|
|
592
|
+
|
593
|
+
allTemplateVariants = Set.new
|
594
|
+
|
595
|
+
selectedTemplateMappingsInbox = []
|
596
|
+
scopeConfigsMercury = []
|
597
|
+
dir_path = ""
|
598
|
+
if version == nil
|
599
|
+
dir_path = configuration.view_type_dir_path_for_template(template_group, template_language_folder, view_type)
|
600
|
+
else
|
601
|
+
dir_path = configuration.view_type_dir_path_for_template_with_version(template_group, template_language_folder, view_type, version)
|
602
|
+
end
|
603
|
+
allProbableTemplateNames = all_directory_and_sub_directory_with_character_not_in_dir_path(dir_path, "_")
|
604
|
+
puts "For ViewType #{view_type} allProbableTemplateNames #{allProbableTemplateNames}"
|
605
|
+
if !(template_name == nil)
|
606
|
+
selectedProbableTemplateNames = allProbableTemplateNames.select{|key,value| key == template_name }
|
607
|
+
else
|
608
|
+
selectedProbableTemplateNames = allProbableTemplateNames
|
609
|
+
end
|
610
|
+
|
611
|
+
if selectedProbableTemplateNames.empty?
|
612
|
+
puts "Error: No template names found"
|
613
|
+
next
|
614
|
+
end
|
615
|
+
|
616
|
+
if !languageMappings.nil?
|
617
|
+
languageMappingForLanguage = languageMappings[language];
|
618
|
+
else
|
619
|
+
languageMappingForLanguage = nil;
|
620
|
+
end
|
621
|
+
puts "languageMapping For #{language} = #{languageMappingForLanguage}"
|
622
|
+
|
623
|
+
selectedProbableTemplateNames.each do |key, value|
|
624
|
+
if !language.eql?("EN") && !key.eql?("default") && !languageMappingForLanguage.nil? && !languageMappingForLanguage.include?(key)
|
625
|
+
puts "#{key} not included in languageMappings for #{language}"
|
626
|
+
next
|
627
|
+
end
|
628
|
+
template_mapping = template_mapping_in_dir_path_file_path_with_character(dir_path, value.clone, "_")
|
629
|
+
key = ResolveTemplate.new.resolveEnv(key.dup, configuration, tenant_id, project_id)
|
630
|
+
template_mapping_inbox = ResolveTemplate.new.resolveEnv(template_mapping.dup, configuration, tenant_id, project_id)
|
631
|
+
selectedTemplateMappingsInbox.push(TemplateMapping.new(key, value, template_mapping_inbox))
|
632
|
+
end
|
633
|
+
|
634
|
+
if !didOnce
|
635
|
+
puts "\n**Updating template group**\n\n"
|
636
|
+
if should_update_inbox
|
637
|
+
update_template_group_inbox(environment, configuration, template_group, scope_id, tenant_id, project_id)
|
638
|
+
end
|
639
|
+
upsert_template_group_apollo_config(environment, configuration, scope_id, template_group, view_type, version, tenant_id, project_id)
|
640
|
+
didOnce = true
|
641
|
+
end
|
642
|
+
|
643
|
+
puts "\n**Updating Templates for language #{language} view_type #{view_type}**\n"
|
644
|
+
|
645
|
+
if should_update_inbox
|
646
|
+
puts "\n*Insert default template in inbox*\n"
|
647
|
+
selectedTemplateMappingsInbox.each do |template_mapping|
|
648
|
+
template_mapping_hash = template_mapping.create_hash
|
649
|
+
if template_mapping_hash["template_name"] == "default"
|
650
|
+
if version == nil
|
651
|
+
puts "\n*For template_name #{template_mapping_hash["template_name"]}*\n"
|
652
|
+
templates = create_template_from_file(configuration, template_group, language, view_type, template_mapping_hash["template_name"], template_mapping_hash["template_path"], false, tenant_id, project_id).create_hash
|
653
|
+
else
|
654
|
+
puts "\n*For template_name #{template_mapping_hash["template_name"]}*\n"
|
655
|
+
version_path = "#{dir_path}"
|
656
|
+
templates = create_template_from_file(configuration, template_group, language, view_type, template_mapping_hash["template_name"], template_mapping_hash["template_path"], false, tenant_id, project_id).create_hash
|
657
|
+
end
|
658
|
+
end
|
659
|
+
request_payload = CreateTemplatePayload.new(template_group, language, view_type, templates, version)
|
660
|
+
puts "\n*Insert Call*\n"
|
661
|
+
invoke_API(environment, configuration.post_insert_templates_url, HTTP::POST, nil, request_payload.to_json)
|
662
|
+
end
|
663
|
+
end
|
664
|
+
|
665
|
+
#Update Templates
|
666
|
+
puts "\n*Update templates API Call*\n"
|
667
|
+
|
668
|
+
selectedTemplateMappingsInbox.each do |template_mapping|
|
669
|
+
inbox_template_name = scope_id
|
670
|
+
if version == nil
|
671
|
+
template_mapping_hash = template_mapping.create_hash
|
672
|
+
puts "\n*For template_name #{template_mapping_hash["template_name"]}*\n"
|
673
|
+
templates = create_template_from_file(configuration, template_group, language, view_type, inbox_template_name, template_mapping_hash["template_path"], false, tenant_id, project_id).create_hash
|
674
|
+
apollo_config_templates = create_template_from_file(configuration, template_group, language, view_type, template_mapping_hash["template_name"], template_mapping_hash["template_path"], true, tenant_id, project_id).create_hash
|
675
|
+
else
|
676
|
+
template_mapping_hash = template_mapping.create_hash
|
677
|
+
puts "\n*For template_name #{template_mapping_hash["template_name"]}*\n"
|
678
|
+
version_path = "#{dir_path}"
|
679
|
+
templates = create_template_from_file(configuration, template_group, language, view_type, inbox_template_name, template_mapping_hash["template_path"], false, tenant_id, project_id).create_hash
|
680
|
+
apollo_config_templates = create_template_from_file(configuration, template_group, language, view_type, template_mapping_hash["template_name"], template_mapping_hash["template_path"], true, tenant_id, project_id).create_hash
|
681
|
+
end
|
682
|
+
if should_update_inbox
|
683
|
+
request_payload = CreateTemplatePayload.new(template_group, language, view_type, templates, version)
|
684
|
+
puts "\n*Insert Call*\n"
|
685
|
+
invoke_API(environment, configuration.post_insert_templates_url, HTTP::POST, nil, request_payload.to_json)
|
686
|
+
puts "\n*Update Call*\n"
|
687
|
+
invoke_API(environment, configuration.post_update_templates_url, HTTP::POST, nil, request_payload.to_json)
|
688
|
+
end
|
689
|
+
upsert_templates_apollo_config(environment, configuration, scope_id, template_group, language, view_type, apollo_config_templates, version)
|
690
|
+
end
|
691
|
+
|
692
|
+
#Upsert Template Mappings
|
693
|
+
puts "\n*Upsert template mapping API Call*\n"
|
694
|
+
query_params = {
|
695
|
+
:templateGroup => template_group,
|
696
|
+
:language => language,
|
697
|
+
:viewType => view_type
|
698
|
+
}
|
699
|
+
if should_update_inbox
|
700
|
+
get_templates_for_view_response = invoke_API(environment, configuration.get_templates_for_view_url, HTTP::GET, query_params)
|
701
|
+
allTemplateMappingsInbox = get_templates_for_view_response["mappings"]
|
702
|
+
if allTemplateMappingsInbox == nil
|
703
|
+
allTemplateMappingsInbox = {}
|
704
|
+
end
|
705
|
+
if !allTemplateMappingsInbox.key?(scope_id)
|
706
|
+
allTemplateMappingsInbox.merge!("#{scope_id}": scope_id)
|
707
|
+
end
|
708
|
+
selectedTemplateMappingsInbox.each do |template_mapping|
|
709
|
+
template_mapping_hash = template_mapping.create_mapping
|
710
|
+
allTemplateMappingsInbox.merge!(template_mapping_hash)
|
711
|
+
end
|
712
|
+
request_payload = create_template_mapping_payload(template_group, language, view_type, allTemplateMappingsInbox, version)
|
713
|
+
invoke_API(environment, configuration.post_upsert_template_mappings_url, HTTP::POST, nil, request_payload.to_json)
|
714
|
+
end
|
715
|
+
|
716
|
+
templateMappingsPayload = {}
|
717
|
+
selectedTemplateMappingsInbox.each do |template_mapping|
|
718
|
+
template_mapping_hash = template_mapping.create_mapping
|
719
|
+
templateMappingsPayload.merge!(template_mapping_hash)
|
720
|
+
end
|
721
|
+
upsert_template_mappings_apollo_config(environment, configuration, scope_id, template_group, language, view_type, templateMappingsPayload, version)
|
722
|
+
puts "DONE FOR #{task.task_id}: #{template_group} \n"
|
723
|
+
end
|
724
|
+
|
725
|
+
end
|
726
|
+
end
|
727
|
+
|
728
|
+
def update_template_group_inbox(environment, configuration, template_group, scope_id, tenant_id, project_id)
|
729
|
+
query_params = {
|
730
|
+
:templateGroup => template_group
|
731
|
+
}
|
732
|
+
puts "\n*Fetching template group details API call*\n"
|
733
|
+
template_group_details_response = invoke_API(environment, configuration.get_template_group_details_url, HTTP::GET, query_params)
|
734
|
+
|
735
|
+
shouldMakeUpdateTemplateGroupCall = false
|
736
|
+
|
737
|
+
if template_group_details_response["templateGroup"] == template_group
|
738
|
+
shouldMakeUpdateTemplateGroupCall = true
|
739
|
+
end
|
740
|
+
|
741
|
+
template_group_details = get_parsed_template_group_details(configuration,template_group)
|
742
|
+
|
743
|
+
transformer_file_path = configuration.transfomer_file_path_for_template(template_group)
|
744
|
+
transformer_data = read_data_from_file_path(transformer_file_path)
|
745
|
+
transformer_data = ResolveTemplate.new.resolveEnv(transformer_data, configuration, tenant_id, project_id)
|
746
|
+
|
747
|
+
field_ordering = template_group_details["fieldOrdering"]
|
748
|
+
expected_data = template_group_details["expectedData"]
|
749
|
+
|
750
|
+
# TODO: Handle case where field_ordering is not empty.
|
751
|
+
field_ordering = ["appID"]
|
752
|
+
|
753
|
+
request_payload = {
|
754
|
+
:templateGroup => template_group,
|
755
|
+
:expectedData => expected_data,
|
756
|
+
:fieldOrdering => field_ordering,
|
757
|
+
:transformer => transformer_data
|
758
|
+
}
|
759
|
+
|
760
|
+
puts "\n*Update template group API call*\n"
|
761
|
+
if shouldMakeUpdateTemplateGroupCall
|
762
|
+
invoke_API(environment, configuration.post_update_template_group_url, HTTP::POST, nil, request_payload.to_json)
|
763
|
+
else
|
764
|
+
invoke_API(environment, configuration.post_insert_template_group_url, HTTP::POST, nil, request_payload.to_json)
|
765
|
+
end
|
766
|
+
end
|
767
|
+
|
768
|
+
def upsert_template_group_apollo_config(environment, configuration, scope_id, template_group, view, version, tenant_id, project_id)
|
769
|
+
|
770
|
+
template_group_details = get_parsed_template_group_details(configuration, template_group)
|
771
|
+
|
772
|
+
transformer_file_path = configuration.transfomer_file_path_for_template(template_group)
|
773
|
+
transformer_data = read_data_from_file_path(transformer_file_path)
|
774
|
+
transformer_data = ResolveTemplate.new.resolveEnv(transformer_data, configuration, tenant_id, project_id)
|
775
|
+
|
776
|
+
field_ordering = template_group_details["fieldOrdering"]
|
777
|
+
expected_data = template_group_details["expectedData"]
|
778
|
+
|
779
|
+
request_payload = {
|
780
|
+
:expectedData => expected_data,
|
781
|
+
:fieldOrdering => field_ordering,
|
782
|
+
:transformer => transformer_data,
|
783
|
+
:version => version
|
784
|
+
}
|
785
|
+
|
786
|
+
url = configuration.apollo_config_base_url + "/scopes/#{scope_id}/templateGroups/#{template_group}"
|
787
|
+
|
788
|
+
puts "\n*[Apollo-config]: Upsert template group API call*\n"
|
789
|
+
invoke_API(environment, url, HTTP::POST, nil, request_payload.to_json)
|
790
|
+
end
|
791
|
+
|
792
|
+
def upsert_template_mappings_apollo_config(environment, configuration, scope_id, template_group, language, view, mappings, version)
|
793
|
+
|
794
|
+
request_payload = {
|
795
|
+
:mappings => mappings,
|
796
|
+
:version => version
|
797
|
+
}
|
798
|
+
|
799
|
+
url = configuration.apollo_config_base_url + "/scopes/#{scope_id}/templateGroups/#{template_group}/languages/#{language}/views/#{view}/mappings/"
|
800
|
+
|
801
|
+
puts "\n*[Apollo-config]: Upsert template mappings API call*\n"
|
802
|
+
invoke_API(environment, url, HTTP::POST, nil, request_payload.to_json)
|
803
|
+
end
|
804
|
+
|
805
|
+
def upsert_templates_apollo_config(environment, configuration, scope_id, template_group, language, view, templates, version)
|
806
|
+
|
807
|
+
request_payload = {
|
808
|
+
:templates => templates,
|
809
|
+
:version => version
|
810
|
+
}
|
811
|
+
|
812
|
+
url = configuration.apollo_config_base_url + "/scopes/#{scope_id}/templateGroups/#{template_group}/languages/#{language}/views/#{view}/templates/"
|
813
|
+
|
814
|
+
puts "\n*[Apollo-config]: Upsert templates API call*\n"
|
815
|
+
invoke_API(environment, url, HTTP::POST, nil, request_payload.to_json)
|
816
|
+
end
|