apollo_commons_ruby 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|