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