apollo_commons_ruby_cli 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.gitignore +9 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +6 -0
  6. data/Gemfile.lock +19 -0
  7. data/README.md +40 -0
  8. data/Rakefile +2 -0
  9. data/apollo_commons_ruby.gemspec +26 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/lib/apollo_commons_ruby/AtroposSubscription.rb +88 -0
  13. data/lib/apollo_commons_ruby/BackfillSampleData.rb +41 -0
  14. data/lib/apollo_commons_ruby/DomainEvent.rb +181 -0
  15. data/lib/apollo_commons_ruby/ExecuteCommand.rb +20 -0
  16. data/lib/apollo_commons_ruby/FileUtils.rb +136 -0
  17. data/lib/apollo_commons_ruby/MarioConfigsStability.rb +181 -0
  18. data/lib/apollo_commons_ruby/MarioEvent.rb +45 -0
  19. data/lib/apollo_commons_ruby/NetworkUtils.rb +188 -0
  20. data/lib/apollo_commons_ruby/Operation.rb +5 -0
  21. data/lib/apollo_commons_ruby/Permission.rb +51 -0
  22. data/lib/apollo_commons_ruby/RequestDataUtils.rb +28 -0
  23. data/lib/apollo_commons_ruby/ResolveTemplate.rb +40 -0
  24. data/lib/apollo_commons_ruby/SecretConfig.rb +65 -0
  25. data/lib/apollo_commons_ruby/ShopHook.rb +79 -0
  26. data/lib/apollo_commons_ruby/TemplateDebug.rb +207 -0
  27. data/lib/apollo_commons_ruby/TemplatePusher.rb +159 -0
  28. data/lib/apollo_commons_ruby/TemplatesHelper.rb +808 -0
  29. data/lib/apollo_commons_ruby/TemplatesRakefile.rb +864 -0
  30. data/lib/apollo_commons_ruby/TenantInfo.rb +26 -0
  31. data/lib/apollo_commons_ruby/TenantTokenCreator.rb +16 -0
  32. data/lib/apollo_commons_ruby/VerifyMarioConfig.rb +220 -0
  33. data/lib/apollo_commons_ruby/ViewGroup.rb +64 -0
  34. data/lib/apollo_commons_ruby/ViewGroupComponent.rb +73 -0
  35. data/lib/apollo_commons_ruby/ViewGroupDefinition.rb +68 -0
  36. data/lib/apollo_commons_ruby/WebhookReporting.rb +13 -0
  37. data/lib/apollo_commons_ruby/Zebugger.rb +125 -0
  38. data/lib/apollo_commons_ruby.rb +60 -0
  39. data/lib/jar/v1_atroposDevTools.jar +0 -0
  40. data/lib/tasks/add_translations.rake +9 -0
  41. data/lib/tasks/backfill_sample_data.rake +7 -0
  42. data/lib/tasks/checkValidJson.rake +17 -0
  43. data/lib/tasks/delete_domain_event.rake +7 -0
  44. data/lib/tasks/delete_view_group.rake +7 -0
  45. data/lib/tasks/delete_view_group_component.rake +21 -0
  46. data/lib/tasks/delete_view_group_definition.rake +26 -0
  47. data/lib/tasks/deploy_all_templates.rake +7 -0
  48. data/lib/tasks/deploy_permissions.rake +6 -0
  49. data/lib/tasks/deploy_shophooks.rake +6 -0
  50. data/lib/tasks/display_on_zebugger.rake +19 -0
  51. data/lib/tasks/get_tenant_token.rake +6 -0
  52. data/lib/tasks/runTests.rake +27 -0
  53. data/lib/tasks/template_debug.rake +32 -0
  54. data/lib/tasks/update_all.rake +36 -0
  55. data/lib/tasks/update_all_domain_events.rake +24 -0
  56. data/lib/tasks/update_all_view_group_components.rake +18 -0
  57. data/lib/tasks/update_domain_event.rake +12 -0
  58. data/lib/tasks/update_one_template.rake +42 -0
  59. data/lib/tasks/update_translations.rake +24 -0
  60. data/lib/tasks/update_view_group_component.rake +9 -0
  61. data/lib/tasks/update_view_group_definition.rake +7 -0
  62. data/lib/tasks/update_view_group_for_user_0.rake +36 -0
  63. data/lib/tasks/validate_mario_configs.rake +10 -0
  64. data/lib/tasks/verify_mario_config.rake +15 -0
  65. data/lib/version.rb +3 -0
  66. metadata +109 -0
@@ -0,0 +1,40 @@
1
+ require 'rubygems'
2
+ require_relative 'TemplatesHelper'
3
+
4
+ class ResolveTemplate
5
+
6
+ def resolveEnv(data_template, configuration, tenant_id, project_id)
7
+ envFilePath = configuration.env_file_path(tenant_id, project_id)
8
+ if(file_exists?(envFilePath))
9
+ envData = read_data_from_file_path(envFilePath)
10
+ envData = JSON.parse(envData)
11
+ data_template = data_template.force_encoding("UTF-8")
12
+ envData.each do |key, value|
13
+ substring_key = "{{" + key + "}}"
14
+ if data_template.include? substring_key
15
+ puts "Replacing " + substring_key
16
+ data_template.gsub! substring_key, value
17
+ end
18
+ end
19
+ end
20
+ return data_template
21
+ end
22
+
23
+ def resolveLang(data_template, configuration, language)
24
+ langFilePath = configuration.language_file_path_for_template(language)
25
+ if(file_exists?(langFilePath))
26
+ langData = read_res_data_from_file_path(langFilePath)
27
+ langData = JSON.parse(langData)
28
+ data_template = data_template.force_encoding("UTF-8")
29
+ langData.each do |key, value|
30
+ substring_key = "<<" + key + ">>"
31
+ if data_template.include? substring_key
32
+ puts "Replacing " + substring_key
33
+ data_template.gsub! substring_key, value
34
+ end
35
+ end
36
+ end
37
+ return data_template
38
+ end
39
+
40
+ end
@@ -0,0 +1,65 @@
1
+ class SecretConfig
2
+
3
+ attr_reader :authToken
4
+ attr_reader :userId
5
+ attr_reader :domainId
6
+ attr_reader :heraAuthToken
7
+ attr_reader :templateDirectory
8
+
9
+ def initialize(environment)
10
+ if file_exists?("./.apollo/#{environment}.json")
11
+ conf_file = File.read(File.expand_path("./.apollo/#{environment}.json"))
12
+ conf = JSON.parse conf_file
13
+
14
+ if (conf["tenantAuthToken"] == nil)
15
+ puts "Auth configurations are missing"
16
+ return nil
17
+ end
18
+ @authToken = conf["tenantAuthToken"]
19
+
20
+ elsif (File.exist? ("/var/jenkins_home/template_config/config.json"))
21
+ conf_file = File.read(File.expand_path("/var/jenkins_home/template_config/config.json"));
22
+ conf = JSON.parse conf_file
23
+ conf = conf[environment.downcase]
24
+ if (conf["authToken"] == nil || conf["heraAuthToken"] == nil)
25
+ puts "Security configurations are missing"
26
+ return nil
27
+ end
28
+ @authToken = conf["authToken"]
29
+ @userId = conf["userId"]
30
+ @domainId = conf["domainId"]
31
+ @heraAuthToken = conf["heraAuthToken"]
32
+ @templateDirectory = conf["templateDirectory"]
33
+ end
34
+ end
35
+ end
36
+
37
+ class DebugSecretConfig
38
+
39
+ attr_reader :authToken
40
+ attr_reader :userId
41
+ attr_reader :domainId
42
+ attr_reader :templateDirectory
43
+
44
+ def initialize(environment)
45
+ if(File.exist? ("./environments/#{environment}/userInfo.json"))
46
+ conf_file = File.read("./environments/#{environment}/userInfo.json");
47
+ conf = JSON.parse conf_file
48
+ @authToken = conf["authToken"]
49
+ @userId = conf["userId"]
50
+ @domainId = conf["domainId"]
51
+ else
52
+ puts "Please Provide userInfo path in /environments=>#{environment}=>userInfo.json file".red
53
+ return nil
54
+ end
55
+
56
+ if(File.exist? ("./environments/config.json"))
57
+ templateDirectory_json = File.read("./environments/config.json")
58
+ templateDirectory_json = JSON.parse templateDirectory_json
59
+ @templateDirectory = templateDirectory_json["templateDirectory"]
60
+ else
61
+ puts "Please Provide templateDirectory path in environments => config.json file".red
62
+ return nil
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,79 @@
1
+ require 'fileutils'
2
+ require 'json'
3
+ require 'pp'
4
+ require_relative './NetworkUtils'
5
+ require_relative './FileUtils'
6
+ require_relative './SecretConfig'
7
+
8
+ $environmentProperties = nil
9
+ $secretConfig = nil
10
+
11
+ def deploy_shophooks(env)
12
+ environment = env["environment"]
13
+ tenantId = env["tenantId"]
14
+ projectId = env["projectId"]
15
+ shophookName = env["shophookName"]
16
+
17
+ raise_exception_if_string_empty(environment, "environment")
18
+ raise_exception_if_string_empty(tenantId, "tenantId")
19
+ raise_exception_if_string_empty(projectId, "projectId")
20
+
21
+ load_environment_properties(environment, tenantId, projectId)
22
+
23
+ if file_exists?("./.apollo/#{environment}.json")
24
+ apolloEnvFile = File.read("./.apollo/#{environment}.json")
25
+ apolloEnv = JSON.parse apolloEnvFile
26
+ tenantAuthToken = apolloEnv["tenantAuthToken"]
27
+
28
+ else
29
+ heraAuthToken = env["heraAuthToken"]
30
+ raise_exception_if_string_empty(heraAuthToken, "heraAuthToken")
31
+
32
+ puts "getting tenant auth token from apollo app"
33
+
34
+ apolloAppUrl = $environmentProperties["apolloAppBaseUrl"] + "/apollo-app/1.0/tenants/#{tenantId}/access-token"
35
+
36
+ code, response = make_GET_request(apolloAppUrl, heraAuthToken)
37
+
38
+ jsonResponse = JSON.parse(response)
39
+ tenantAuthToken = jsonResponse["access_token"]
40
+ end
41
+
42
+ if (tenantAuthToken == nil)
43
+ raise "Failed to get tenantAuthToken from apollo-app"
44
+ return
45
+ end
46
+
47
+ if shophookName == nil || shophookName.empty?
48
+ files = Dir["./shophooks/*.json"]
49
+ files.each do |path|
50
+ shophookName = File.basename(path, ".json")
51
+ puts "Deploying shophook " + shophookName
52
+ deploy_one_shophook(tenantId, projectId, shophookName, tenantAuthToken)
53
+ end
54
+ else
55
+ puts "Deploying shophook " + shophookName
56
+ deploy_one_shophook(tenantId, projectId, shophookName, tenantAuthToken)
57
+ end
58
+ end
59
+
60
+ def deploy_one_shophook(tenantId, projectId, shophookName, tenantAuthToken)
61
+ shophookConfig = read_data_from_file_path("./shophooks/" + shophookName + ".json")
62
+ raise_exception_if_string_empty(shophookConfig["shopHookId"], "shopHookId")
63
+
64
+ shophookConfig = shophookConfig.gsub("\n", ' ').squeeze(' ')
65
+
66
+ request_payload = {
67
+ :config => shophookConfig
68
+ }
69
+
70
+ url = $environmentProperties["apolloConfigBaseUrl"] + "/1.0/tenant/#{tenantId}/scopes/#{projectId}/shophooks/#{shophookName}"
71
+
72
+ code, response = make_GET_request(url, tenantAuthToken)
73
+
74
+ if (code == "200" || code == "201")
75
+ return
76
+ end
77
+
78
+ make_POST_request(url, request_payload.to_json, tenantAuthToken)
79
+ end
@@ -0,0 +1,207 @@
1
+ require 'fileutils'
2
+ require 'rubygems'
3
+ require_relative 'TemplatesHelper'
4
+ require_relative 'TemplatesRakefile'
5
+
6
+ class TemplateGroupDetails
7
+ attr_reader :body
8
+ attr_reader :templateGroup
9
+ attr_reader :scopeId
10
+ attr_reader :transformer
11
+ attr_reader :templates
12
+
13
+ def initialize(scopeId, templateGroup, transformer)
14
+ @templateGroup = templateGroup
15
+ @scopeId = scopeId
16
+ @transformer = transformer
17
+ @templates = []
18
+ @body = JSON.parse "{}"
19
+ @body["templateGroup"] = templateGroup
20
+ @body["scopeId"] = scopeId
21
+ @body["transformer"] = transformer
22
+ end
23
+ end
24
+
25
+ class Templates
26
+ attr_reader :templateGroup
27
+ attr_reader :scopeId
28
+ attr_reader :language
29
+ attr_reader :view
30
+ attr_reader :templateName
31
+ attr_reader :presentation
32
+ attr_reader :dataTemplate
33
+ attr_reader :attrs
34
+ attr_reader :body
35
+
36
+ def initialize(scopeId, templateGroup, language, view, templateName, presentation, dataTemplate, attrs)
37
+ @templateGroup = templateGroup
38
+ @scopeId = scopeId
39
+ @language = language
40
+ @view = view
41
+ @templateName = templateName
42
+ @presentation = presentation
43
+ @dataTemplate = dataTemplate
44
+ @attrs = attrs
45
+ @body = JSON.parse "{}"
46
+ @body["templateGroup"] = templateGroup
47
+ @body["scopeId"] = scopeId
48
+ @body["language"] = language
49
+ @body["view"] = view
50
+ @body["templateName"] = templateName
51
+ @body["presentation"] = presentation
52
+ @body["dataTemplate"] = dataTemplate
53
+ @body["attrs"] = attrs
54
+ end
55
+ end
56
+
57
+ def get_template_group_details(task)
58
+ #Get path
59
+ template_group_directory = task.template_directory + "/Templates/#{task.template_group}"
60
+
61
+ #Form the template group
62
+ template_group_transformer = read_data_from_file_path(template_group_directory + "/transformer.js")
63
+ templateGroupDetails = TemplateGroupDetails.new(task.scope_id, task.template_group, template_group_transformer.newline.tabs)
64
+
65
+ #Find all the languages
66
+ languages = directory_list(template_group_directory)
67
+ resolved_language = "common"
68
+ languages.each do |language|
69
+ if (language == task.language)
70
+ resolved_language = language
71
+ end
72
+ end
73
+ template = create_template_from_files(task.template_directory, task.template_group, task.language, task.view_type, task.template_name,
74
+ template_group_directory + "/#{resolved_language}/#{task.view_type}/#{task.template_name}", task.tenant_id, task.project_id, task.environment)
75
+ templateGroupDetails.templates.push(template.body)
76
+ templateGroupDetails.body["templates"] = templateGroupDetails.templates
77
+ return templateGroupDetails.body
78
+ end
79
+
80
+
81
+ def create_template_from_files(template_directory, template_group, language, view, template_name, template_path, tenant_id, project_id, environment)
82
+ begin
83
+ presentation = get_presentation_after_conversion_if_neeeded($environmentProperties["apolloConfigBaseUrl"], environment, template_path)
84
+ presentation = JSON.parse(presentation).to_json
85
+ presentation = resolveLang(presentation.to_json, template_directory,language)
86
+ presentation = JSON.parse(presentation, :quirks_mode => true)
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
+ client_transformer = ""
110
+ isClientTransformerFound = true
111
+
112
+ begin
113
+ #Parsing local transformer specific to individual template
114
+ specific_local_transformer_file_path = file_of_name_in_dir_path(template_path,"localTransformer")
115
+ puts "specific_local_transformer_file_path #{specific_local_transformer_file_path}"
116
+ specific_local_transformer = "{}";
117
+ if !(specific_local_transformer_file_path == nil)
118
+ begin
119
+ specific_local_transformer = get_client_transformer_without_require(specific_local_transformer_file_path)
120
+ rescue Exception => e
121
+ puts "ERROR: specific local transformer file not found #{e}"
122
+ end
123
+ puts "specific_local_transformer #{specific_local_transformer}"
124
+ client_transformer = specific_local_transformer
125
+ end
126
+ end
127
+
128
+ #Parsing attrs json
129
+ attrs_json_file_path = file_of_name_in_dir_path(template_path, "attrs")
130
+ puts "attrs_json_file_path #{attrs_json_file_path}"
131
+ #many templates will not have attrs json, hence initializing a default value
132
+ attrs_json = "{}"
133
+ if !(attrs_json_file_path == nil)
134
+ #attrs file is present
135
+ begin
136
+ attrs_json = read_data_from_file_path(attrs_json_file_path)
137
+ rescue Exception => e
138
+ #Mostly this should not happen, but a sanity check
139
+ puts "ERROR: attrs file not found #{e}"
140
+ end
141
+ if attrs_json_file_path.end_with? ".json" and !attrs_json.newline.empty?
142
+ #if attrs file is json, then enforce proper json
143
+ if !JSON.is_valid_json?(attrs_json)
144
+ raise "ERROR: attrs is not a valid JSON"
145
+ end
146
+ attrs_json = "#{attrs_json}"
147
+ end
148
+ end
149
+
150
+ if isClientTransformerFound
151
+ client_transformer = client_transformer.newline.tabs
152
+ if client_transformer.scan(/^\s*<%.*%>\s*$/).length == 0
153
+ client_transformer = "<% #{client_transformer} %>"
154
+ end
155
+ if JSON.is_valid_json?(data_template)
156
+ data_template_hash_new = Hash.new
157
+ data_template_hash_new["__transformer"] = client_transformer
158
+ data_template_hash = JSON.parse(data_template)
159
+ data_template_hash_new.merge!(data_template_hash)
160
+ data_template = data_template_hash_new.to_json
161
+ else
162
+ data_template = "#{client_transformer}#{data_template}"
163
+ end
164
+ end
165
+
166
+ data_template = resolveEnv(data_template, template_directory, environment, tenant_id, project_id)
167
+ data_template = resolveLang(data_template, template_directory, language)
168
+ data_template = modify_data_template_if_its_mario_template(data_template)
169
+ attrs_json = modify_data_template_if_its_mario_template(attrs_json)
170
+ return Templates.new(project_id, template_group, language, view, template_name, presentation, data_template, attrs_json)
171
+ rescue Exception => e
172
+ puts "ERROR: Template loading from #{template_group} failed with error: #{e}"
173
+ end
174
+ end
175
+
176
+ def resolveEnv(data_template, template_directory, environment, tenantId, project_id)
177
+ if environment == 'PreProd'
178
+ environment = 'Preprod'
179
+ end
180
+ envFilePath = template_directory + "/environments/#{environment}/env_#{tenantId}_#{project_id}.json"
181
+ envData = read_data_from_file_path(envFilePath)
182
+ envData = JSON.parse(envData)
183
+ data_template = data_template.force_encoding("UTF-8")
184
+ envData.each do |key, value|
185
+ substring_key = "{{" + key + "}}"
186
+ if data_template.include? substring_key
187
+ puts "Replacing " + substring_key
188
+ data_template.gsub! substring_key, value
189
+ end
190
+ end
191
+ return data_template
192
+ end
193
+
194
+ def resolveLang(data_template, template_directory, language)
195
+ langFilePath = template_directory + "/Resources/#{language}.json"
196
+ langData = read_res_data_from_file_path(langFilePath)
197
+ langData = JSON.parse(langData)
198
+ data_template = data_template.force_encoding("UTF-8")
199
+ langData.each do |key, value|
200
+ substring_key = "<<" + key + ">>"
201
+ if data_template.include? substring_key
202
+ puts "Replacing " + substring_key
203
+ data_template.gsub! substring_key, value
204
+ end
205
+ end
206
+ return data_template
207
+ end
@@ -0,0 +1,159 @@
1
+ require 'set'
2
+ require 'open3'
3
+ require_relative 'TemplatesHelper'
4
+
5
+ $zebugger_ios_bundle_id = "in.zeta.zebugger-ios"
6
+ $old_zebugger_ios_bundle_id = "in.zeta.apollo.zebugger-ios"
7
+
8
+ def push_templates_to_device(configuration, environment, template_group, template_path, dependent_template_ids, language, view_type, platform)
9
+ templates_set_including_root = Set.new
10
+ templates_set_including_root.add(template_group)
11
+ templates_set_including_root.merge dependent_template_ids
12
+ print_separator_line()
13
+ puts "Found " + templates_set_including_root.size().to_s + " file(s) in total to be pushed to device"
14
+ print_separator_line()
15
+
16
+ is_real_device_connected, is_simulator_connected = check_for_device_connection(platform)
17
+
18
+ adb_push_presentation(configuration, environment, template_group, template_path, true, language, view_type, platform, is_real_device_connected, is_simulator_connected)
19
+
20
+ dependent_template_ids.each do |item|
21
+ item = item.tr('"','')
22
+ dependent_template_path = parse_template_id(configuration, item, language, view_type)
23
+ if dependent_template_path == nil
24
+ puts "invalid template id #{item}"
25
+ next
26
+ end
27
+ dependent_template_group = item.split('_')[0]
28
+ adb_push_presentation(configuration, environment, dependent_template_group, dependent_template_path, false, language, view_type, platform, is_real_device_connected, is_simulator_connected)
29
+ end
30
+
31
+ adb_push_template_data(template_group, language, view_type, platform, is_real_device_connected, is_simulator_connected)
32
+ end
33
+
34
+ #Push only presentation
35
+ def adb_push_presentation(configuration, environment, template_group, template_path, is_root, language, view_type, platform, is_real_device_connected, is_simulator_connected)
36
+ # create_zebuggerX_folder()
37
+ presentation = get_presentation_after_conversion_if_neeeded(configuration.apollo_config_base_url, environment, template_path)
38
+ presentation = JSON.parse(presentation, :quirks_mode => true)
39
+ presentation_file_path_to_push = template_path + '/' + 'presentation_file.json'
40
+ write_data_to_file(presentation_file_path_to_push, presentation)
41
+ if(platform == "iOS")
42
+ source_file_path = presentation_file_path_to_push
43
+ destination_file_path = "/Documents/presentation_#{template_group}_#{language}_#{view_type}.json"
44
+ adb_push_to_ios(source_file_path, destination_file_path, is_real_device_connected, is_simulator_connected)
45
+ else
46
+ adb_push_to_android(presentation_file_path_to_push, '/storage/emulated/0/Android/media/in.zeta.android.apollo.zebugger/files/zebuggerX/' + (is_root ? 'root_presentation' : ('presentation+' + template_group)) + '.json')
47
+
48
+ adb_push_to_android(presentation_file_path_to_push, '/storage/emulated/0/Download/zebuggerX/' + (is_root ? 'root_presentation' : ('presentation+' + template_group)) + '.json')
49
+ end
50
+ File.delete(presentation_file_path_to_push) if File.exist?(presentation_file_path_to_push)
51
+ end
52
+
53
+ def adb_push_template_data(template_group, language, view_type, platform, is_real_device_connected, is_simulator_connected)
54
+ # create_zebuggerX_folder()
55
+ template_data_file_path = Dir.pwd + '/scripts/commonData/' + 'generatedTemplatedData.json'
56
+ template_data_file_path = '"' + template_data_file_path + '"'
57
+
58
+ if(platform == "iOS")
59
+ source_file_path = template_data_file_path
60
+ destination_file_path = "/Documents/dataTemplate_#{template_group}_#{language}_#{view_type}.json"
61
+ adb_push_to_ios(source_file_path, destination_file_path, is_real_device_connected, is_simulator_connected)
62
+ else
63
+ adb_push_to_android(template_data_file_path, '/storage/emulated/0/Android/media/in.zeta.android.apollo.zebugger/files/zebuggerX/data.json')
64
+ adb_push_to_android(template_data_file_path, '/storage/emulated/0/Download/zebuggerX/data.json')
65
+ system("adb shell am force-stop in.zeta.android.apollo.youtube")
66
+ system("adb shell am start -n in.zeta.android.apollo.youtube/zebuggerx.zetlet.MainActivity")
67
+ end
68
+ end
69
+
70
+ def adb_push_to_android(source_file_path, destination_file_path)
71
+ cmd = 'adb push "' + source_file_path + '" "' + destination_file_path + '"'
72
+ puts "Pushing file #{source_file_path} to Android device"
73
+ system(cmd)
74
+ end
75
+
76
+ def adb_push_to_ios(source_file_path, destination_file_path, is_real_device_connected, is_simulator_connected)
77
+ if is_real_device_connected
78
+ push_to_ios_device($zebugger_ios_bundle_id, source_file_path, destination_file_path)
79
+
80
+ #Pushing to old bundle id for backward compatibility
81
+ push_to_ios_device($old_zebugger_ios_bundle_id, source_file_path, destination_file_path)
82
+ end
83
+
84
+ if is_simulator_connected
85
+ push_to_ios_simulator($zebugger_ios_bundle_id, source_file_path, destination_file_path)
86
+
87
+ #Pushing to old bundle id for backward compatibility
88
+ push_to_ios_simulator($old_zebugger_ios_bundle_id, source_file_path, destination_file_path)
89
+ end
90
+ end
91
+
92
+ def push_to_ios_device(bundle_id, source_file_path, destination_file_path)
93
+ cmd = "ios-deploy --bundle_id #{bundle_id} --upload #{source_file_path} --to #{destination_file_path}"
94
+ puts "Pushing file #{source_file_path} to connected ios device for bundleId #{bundle_id}"
95
+ system(cmd)
96
+ end
97
+
98
+ def push_to_ios_simulator(bundle_id, source_file_path, destination_file_path)
99
+ final_destination_file_path = `xcrun simctl get_app_container booted #{bundle_id} data`
100
+ final_destination_file_path.to_s.delete!("\n")
101
+ final_destination_file_path = final_destination_file_path + "#{destination_file_path}"
102
+ cmd = "cp #{source_file_path} #{final_destination_file_path}"
103
+ puts "Pushing file #{source_file_path} to newest opened ios simulator for bundleId #{bundle_id}"
104
+ system(cmd)
105
+ end
106
+
107
+ def create_zebuggerX_folder()
108
+ adb_cmd = 'adb shell mkdir "/storage/emulated/0/Download/zebuggerX"'
109
+ system(adb_cmd)
110
+ end
111
+
112
+ def get_dependent_template_ids(string, template_id_set = Set.new)
113
+ string.scan /templateID\\*\":\s*\\*\"([a-zA-Z0-9\-]*)(_[A-Z][A-Z]*_[A-Z][A-Z]*)?\\*\"/ do |match|
114
+ template_id_set.add(match[0])
115
+ end
116
+
117
+ return template_id_set
118
+ end
119
+
120
+ def parse_template_id(configuration, template_id, language, view_type)
121
+ template_id_parts = template_id.split('_')
122
+ template_group = template_id_parts[0]
123
+ template_name = "default"
124
+ template_path = resolve_template_path(configuration, template_group, language, view_type, template_name)
125
+ return template_path
126
+ end
127
+
128
+ def check_for_device_connection(platform)
129
+ is_real_device_connected = false
130
+ is_simulator_connected = false
131
+ if(platform == "iOS")
132
+ is_real_device_connected = false
133
+ stdout, stderr, status = Open3.capture3("ios-deploy --detect --timeout 1")
134
+ if stdout.include? "Found"
135
+ is_real_device_connected = true
136
+ end
137
+
138
+ is_app_simulator_connected = check_ios_simulator_availability($zebugger_ios_bundle_id)
139
+
140
+ #Checking for old app simulator for backward compatibility
141
+ is_old_app_simulator_connected = check_ios_simulator_availability($old_zebugger_ios_bundle_id)
142
+
143
+ is_simulator_connected = is_app_simulator_connected || is_old_app_simulator_connected
144
+ end
145
+
146
+ return is_real_device_connected, is_simulator_connected
147
+ end
148
+
149
+ def check_ios_simulator_availability(bundle_id)
150
+ is_simulator_connected = true
151
+ stdout, stderr, status = Open3.capture3("xcrun simctl get_app_container booted #{bundle_id} data")
152
+ if stderr.include? "No devices are booted."
153
+ is_simulator_connected = false
154
+ end
155
+ if stderr.include? "No such file or directory"
156
+ is_simulator_connected = false
157
+ end
158
+ return is_simulator_connected
159
+ end