aaet 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,161 @@
1
+ #https://developer.android.com/studio/run/emulator-commandline.html
2
+ #https://devmaze.wordpress.com/2011/12/12/starting-and-stopping-android-emulators/
3
+ #-tcpdump /path/dumpfile.cap
4
+
5
+ require 'apktools/apkxml'
6
+ require 'json'
7
+
8
+ class AndroidSetup
9
+
10
+ attr_accessor :cloud, :caps, :cloud_service
11
+
12
+ def initialize settings
13
+ self.cloud = settings[:options][:cloud]
14
+ self.caps = settings[:config][:caps][:caps]
15
+ self.cloud_service = settings[:config][:cloud][:service] || nil
16
+ end
17
+
18
+ ###Emulator methods
19
+ def available_emulators
20
+ %x($ANDROID_HOME/tools/emulator -list-avds).split("\n")
21
+ end
22
+
23
+ def check_emulator avd
24
+ emulators = available_emulators
25
+ if avd.nil? or !emulators.include? avd
26
+ puts "\nINVALID OR NIL EMULATOR: #{avd}\nAvailable Emulators: #{emulators}\n".red
27
+ puts "Example: -e #{emulators.sample}\nAborting...".red
28
+ abort
29
+ else
30
+ true
31
+ end
32
+ end
33
+
34
+ def emulators_booted?
35
+ %x(adb -s #{uuid} shell getprop sys.boot_completed).strip == "1"
36
+ end
37
+
38
+ def start_avd
39
+ unless emulator_running?
40
+ if check_emulator avd
41
+ kill_emulator uuid
42
+ @pid = spawn("$ANDROID_HOME/tools/emulator -avd #{avd} -port #{port} &", :out=>"/dev/null")
43
+ #%x(adb -s #{uuid} wait-for-device)
44
+ start = Time.now
45
+ until emulators_booted?
46
+ sleep 1
47
+ if Time.now - start > 30
48
+ puts "\nEmulator #{uuid} failed to boot within 30 seconds. Aborting run....".red
49
+ puts "Check Emulator: #{uuid}\n".red
50
+ abort
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ def kill_emulator emulator
58
+ system("adb -s #{emulator} emu kill >> /dev/null 2>&1")
59
+ end
60
+
61
+ def running_emulators
62
+ (`adb devices`).scan(/\n(.*)\t/).flatten.select { |d| d.include? "emulator" }
63
+ end
64
+
65
+ def emulator_running?
66
+ running_emulators.include? uuid
67
+ end
68
+
69
+ def kill_all_emulators
70
+ emulators = running_emulators
71
+ emulators.delete uuid
72
+ if emulators.any?
73
+ puts "\nKilling all emulators...\n"
74
+ emulators.each { |emulator| kill_emulator emulator }
75
+ sleep 5
76
+ end
77
+ end
78
+
79
+ ###End Emulator methods
80
+
81
+ def devices
82
+ (`adb devices`).scan(/\n(.*)\t/).flatten
83
+ end
84
+
85
+ def devices_connected?
86
+ devices.any?
87
+ end
88
+
89
+ def check_for_devices
90
+ unless devices_connected?
91
+ puts "\nNo Devices Connected or Authorized!!!\nMake sure at least one device (emulator/simulator) is connected!\n".red
92
+ abort
93
+ end
94
+ end
95
+
96
+ def check_uuid uuid
97
+ if devices_connected?
98
+ if devices.include? uuid
99
+ true
100
+ else
101
+ puts "\nINVALID OR NIL UUID: #{avd}\nAvailable Devices: #{devices}\n".red
102
+ puts "Example: -u #{devices.sample}\nAborting...".red
103
+ abort
104
+ end
105
+ else
106
+ false
107
+ end
108
+ end
109
+
110
+ def get_device_data uuid
111
+ specs = {
112
+ os: "ro.build.version.release",
113
+ manufacturer: "ro.product.manufacturer",
114
+ model: "ro.product.model",
115
+ sdk: "ro.build.version.sdk"
116
+ }
117
+ hash = {}
118
+ specs.each do |key, spec|
119
+ value = `adb -s #{uuid} shell getprop "#{spec}"`.strip
120
+ hash.merge!({key=> "#{value}"})
121
+ end
122
+ hash.merge!({platform: "android", uuid: uuid, resolution: nil, process: Parallel.worker_number})
123
+ end
124
+
125
+ def app_size
126
+ (`wc -c <#{caps[:app]}`).strip
127
+ end
128
+
129
+ def get_app_data
130
+ data = ApkXml.new caps[:app]
131
+ data.parse_xml("AndroidManifest.xml", false, true)
132
+ manifest = data.xml_elements[0].attributes
133
+ package = manifest.find {|x| x.name == "package" }["value"].strip
134
+ version = manifest.find {|x| x.name == "versionName" }["value"].strip
135
+ { package: package, version: version }
136
+ end
137
+
138
+ def app_and_device_data uuid
139
+ app_data = get_app_data
140
+ if cloud
141
+ device_data = {
142
+ uuid: "#{cloud_service}-#{uuid}",
143
+ deviceName: "#{caps[:deviceName].gsub(' ','_')}",
144
+ os: caps[:platformVersion],
145
+ manufacturer: "unknown",
146
+ model: "unknown",
147
+ sdk: "unknown",
148
+ resolution: nil,
149
+ process: Parallel.worker_number
150
+ }
151
+ else
152
+ device_data = get_device_data(uuid).merge!(deviceName: "#{caps[:deviceName].gsub(' ','_')}")
153
+ end
154
+ {
155
+ app_package: app_data[:package],
156
+ app_version: app_data[:version],
157
+ app_size: app_size,
158
+ device: device_data
159
+ }
160
+ end
161
+ end
@@ -0,0 +1,209 @@
1
+ require 'curb'
2
+ require 'toml-rb'
3
+ require 'colorize'
4
+ require 'pry'
5
+ require 'redic'
6
+ require 'highline'
7
+
8
+ class CommonSetup
9
+
10
+ attr_accessor :redis, :cli
11
+
12
+ def initialize
13
+ self.redis = Redic.new
14
+ self.cli = HighLine.new
15
+ end
16
+
17
+ def kill_process process
18
+ `ps -ef | grep #{process} | awk '{print $2}' | xargs kill >> /dev/null 2>&1`
19
+ end
20
+
21
+ def kill_processes process
22
+ pids = (`ps -ef | grep #{process} | awk '{print $2}'`).split("\n")
23
+ pids.each { |pid| `kill -9 #{pid} >> /dev/null 2>&1` }
24
+ end
25
+
26
+ def wait_for_appium_server port
27
+ loop.with_index do |_, count|
28
+ break if `lsof -i:#{port}`.to_s.length != 0
29
+ if count * 5 > 30
30
+ fail "Invoke Appium server timed out"
31
+ end
32
+ sleep 5
33
+ end
34
+ end
35
+
36
+ def start_appium_server process, reset_session, device, date_dir
37
+ process = process
38
+ port = "472#{process}".to_i
39
+ bp = "225#{process}".to_i
40
+ appium_log = "./output/#{date_dir}/appium-#{process}.log"
41
+ pid = spawn("appium #{reset_session} --port #{port} -bp #{bp} #{device} --log #{appium_log} --device-ready-timeout 60 --tmp /tmp/#{process}", :out=>"/dev/null")
42
+ wait_for_appium_server port
43
+ { appium_pid: pid, appium_port: port, appium_log: appium_log }
44
+ end
45
+
46
+ def clear_redis
47
+ puts "\nClearing Redis DB..\n"
48
+ redis.call "FLUSHALL"
49
+ end
50
+
51
+ def prep_environment
52
+ kill_processes "appium"
53
+ kill_processes "logcat"
54
+ clear_redis
55
+ end
56
+
57
+ def cleanup_screenshots
58
+ print_debug "Cleaning files in: #{dir}"
59
+ #add ruby remove dir method
60
+ `rm -rf #{dir}/*`
61
+ end
62
+
63
+ def create_output_directory name, time
64
+ Dir.mkdir name unless File.exists? name
65
+ output_dir_base = "#{name}/#{time}"
66
+ Dir.mkdir output_dir_base unless File.exists? output_dir_base
67
+ return output_dir_base
68
+ end
69
+
70
+ def create_directories dir_data
71
+ start_dir = Dir.pwd
72
+ Dir.mkdir "output" unless File.exists? "output"
73
+ Dir.chdir "output"
74
+ dir_data.each do |d|
75
+ Dir.mkdir d unless File.exists? d
76
+ Dir.chdir d
77
+ end
78
+ dir = Dir.pwd
79
+ Dir.chdir start_dir
80
+ dir
81
+ end
82
+
83
+ def format_options options
84
+ config = TomlRB.load_file(options[:config], symbolize_keys: true)
85
+ app_caps = config[:caps]
86
+ app_caps[:orientation] = options[:orientation].to_s.upcase #make sure orientation is always an upcased string...
87
+ app_caps[:platform] = app_caps[:platform].downcase #make sure platform is always downcased...
88
+
89
+ if options[:cloud] #get cloud device capabilities
90
+ cloud_caps = TomlRB.load_file(config[:cloud][:caps_path], symbolize_keys: true)
91
+ app = upload_app_to_cloud(config)
92
+ cloud_caps[:common_caps][:cloud_app] = app
93
+ app_caps.delete(:deviceName)
94
+ caps = cloud_caps.map { |device_caps| { caps: device_caps[1].merge!(cloud_caps[:common_caps]).merge!(app_caps) } if device_caps.to_s.include? "Device" }.compact
95
+ capabilities = caps.each { |cap| cap.merge!({:appium_lib=>cloud_caps[:appium_lib], :wait=> 0}) }
96
+ else #get local device capabilities
97
+ if options[:emulator]
98
+ emulators = options[:emulator].join.split
99
+ emulator_caps = emulators.map do |emulator|
100
+ { caps: app_caps }.merge!(avd: emulator).merge!({:appium_lib=>{:server_url=>app_caps[:url], :wait=> 0}})
101
+ end
102
+ end
103
+
104
+ if options[:uuid]
105
+ devices = options[:uuid].join.split
106
+ device_caps = devices.map do |device|
107
+ { caps: app_caps }.merge!(udid: device).merge!({:appium_lib=>{:server_url=>app_caps[:url], :wait=> 0}})
108
+ end
109
+ end
110
+ capabilities = [emulator_caps, device_caps].compact.flatten
111
+ end
112
+
113
+ #convert language string to array. e.g. -l "en fr de" -> ["en", "fr", "de"]
114
+ options[:language] = options[:language].join.split unless options[:mode] == "monkey"
115
+
116
+ #Load App Activities
117
+ #TODO: Figure out out to parse iOS app activities.
118
+ if app_caps[:platform] == 'android'
119
+ activities = get_android_activities app_caps[:app], app_caps[:appPackage]
120
+ load_activities activities
121
+ elsif app_caps[:platform] == 'ios'
122
+ #placeholder for ios activities
123
+ end
124
+
125
+ { activities: activities, options: options, config: config, caps: capabilities }
126
+ end
127
+
128
+ def add_activity activity
129
+ redis.call "LPUSH", "activities", activity
130
+ end
131
+
132
+ def load_activities activities
133
+ puts "\nApp Activities: "
134
+ ap activities
135
+ activities.each { |a| add_activity a }
136
+ puts "\n"
137
+ end
138
+
139
+ def get_android_activities app, package
140
+ data = ApkXml.new app
141
+ data.parse_xml("AndroidManifest.xml", false, true)
142
+ activities = []
143
+ data.xml_elements.each do |x|
144
+ x.attributes.each do |y|
145
+ activities << y.value if y.value.include? "Activity"
146
+ end
147
+ end
148
+ activities.find_all { |x| x.include? package }.uniq
149
+ activities.map { |x| x.gsub(package, "") }.uniq
150
+ end
151
+
152
+ def report_dir
153
+ "#{Dir.pwd}/runs"
154
+ end
155
+
156
+ def get_run_reports package_name
157
+ runs = Dir.glob("#{report_dir}/*").find_all { |r| r.include? package_name }
158
+ runs.sort_by { |r| r.match(/#{report_dir}\/(.*)d*-/)[1].split("-")[0] }
159
+ end
160
+
161
+ def select_run package_name
162
+ reports = get_run_reports(package_name)
163
+ puts ""
164
+ cli.choose do |menu|
165
+ menu.prompt = "Please Choose a Test Run: "
166
+ menu.choices(*reports) do |chosen|
167
+ puts "\nTest Chosen: #{chosen}\n".yellow
168
+ return chosen
169
+ end
170
+ end
171
+ end
172
+
173
+ def symbolize(obj)
174
+ return obj.reduce({}) do |memo, (k, v)|
175
+ memo.tap { |m| m[k.to_sym] = symbolize(v) }
176
+ end if obj.is_a? Hash
177
+
178
+ return obj.reduce([]) do |memo, v|
179
+ memo << symbolize(v); memo
180
+ end if obj.is_a? Array
181
+
182
+ obj
183
+ end
184
+
185
+ def upload_app_to_cloud config
186
+ if !config[:cloud][:service] == "saucelabs"
187
+ puts "\nCurrently only Sauce Labs ('saucelabs') is supported\n".red
188
+ abort
189
+ end
190
+ app = config[:caps][:zippedApp]
191
+ filename = File.basename(app)
192
+ puts "Uploading App to Sauce Labs: #{app}"
193
+ url = "https://saucelabs.com/rest/v1/storage/#{config[:cloud][:user]}/#{filename}?overwrite=true"
194
+ c = Curl::Easy.new(url)
195
+ c.http_auth_types = :basic
196
+ c.username = config[:cloud][:user]
197
+ c.password = config[:cloud][:key]
198
+ c.multipart_form_post = true
199
+ c.http_post(Curl::PostField.file("@#{app}", app))
200
+ if c.status == "200 OK"
201
+ puts "\nFile Upload Status Code: #{c.status}"
202
+ puts "Cloud App: sauce-storage:#{filename}\n"
203
+ "sauce-storage:#{filename}"
204
+ else
205
+ puts "\n#{app}: File did not upload successfully.\nFile Upload Status Code: #{c.status}\nAborting...\n".red
206
+ abort
207
+ end
208
+ end
209
+ end
@@ -0,0 +1,11 @@
1
+ require 'json'
2
+
3
+ class IosSetup
4
+
5
+ attr_accessor :uuid, :cloud
6
+
7
+ def initialize settings
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,48 @@
1
+ //Open in Firefox... or create http-server > https://stackoverflow.com/questions/20041656/xmlhttprequest-cannot-load-file-cross-origin-requests-are-only-supported-for-ht
2
+ !!!
3
+ %html
4
+ %head
5
+ %meta{charset: 'UTF-8'}
6
+ %script{type: 'text/javascript', src: 'https://www.google.com/jsapi'}
7
+ %script{type: 'text/javascript', src: 'https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'}
8
+ :javascript
9
+ google.load('visualization', '1', {'packages':['corechart']});
10
+
11
+ // Set a callback to run when the Google Visualization API is loaded.
12
+ google.setOnLoadCallback(drawChart);
13
+
14
+ function drawChart() {
15
+ var jsonData = $.ajax({
16
+ url: data_path(),
17
+ dataType:"json",
18
+ async: false
19
+ }).responseText;
20
+
21
+ // Create our data table out of JSON data loaded from server.
22
+ var data = new google.visualization.DataTable(jsonData);
23
+
24
+ var options = {
25
+ title: "#{title}",
26
+ width: #{graph_settings[:width]},
27
+ height: #{graph_settings[:height]},
28
+ pointSize: 15,
29
+ pointShape: { type: 'triangle', rotation: 180 },
30
+ hAxis: {title: 'Time', titleTextStyle: {color: '#333'}, slantedText:true, slantedTextAngle:80},
31
+ vAxis: {minValue: 0},
32
+ explorer: { actions: ['dragToZoom', 'rightClickToReset'], axis: 'horizontal', keepInBounds: true, maxZoomIn: 4.0},
33
+ tooltip:{isHtml:true}
34
+ };
35
+
36
+ // Instantiate and draw our chart, passing in some options.
37
+ var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
38
+ chart.draw(data, options);
39
+ }
40
+
41
+ function data_path() {
42
+ return '#{data_file_path}';
43
+ }
44
+
45
+ %title #{title}
46
+ %body
47
+ %h1 #{header1}
48
+ %div{id: 'chart_div'}
metadata ADDED
@@ -0,0 +1,354 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aaet
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - isonic1
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-06-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.13'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: commander
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: awesome_print
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: colorize
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: faker
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: os
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: redic
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 1.5.0
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 1.5.0
153
+ - !ruby/object:Gem::Dependency
154
+ name: apktools
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 0.7.1
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: 0.7.1
167
+ - !ruby/object:Gem::Dependency
168
+ name: parallel
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: 1.9.0
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 1.9.0
181
+ - !ruby/object:Gem::Dependency
182
+ name: eyes_selenium
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - '='
186
+ - !ruby/object:Gem::Version
187
+ version: 3.10.1
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - '='
193
+ - !ruby/object:Gem::Version
194
+ version: 3.10.1
195
+ - !ruby/object:Gem::Dependency
196
+ name: tilt
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: haml
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: curb
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :runtime
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: httparty
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :runtime
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: toml-rb
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ type: :runtime
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
265
+ - !ruby/object:Gem::Dependency
266
+ name: appium_lib
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - ">="
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
272
+ type: :runtime
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ">="
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: jsonpath
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - ">="
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ type: :runtime
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - ">="
291
+ - !ruby/object:Gem::Version
292
+ version: '0'
293
+ description: A CLI to collect metadata about an applicaton on every run from the command
294
+ line
295
+ email:
296
+ - justin.ison@gmail.com
297
+ executables:
298
+ - aaet
299
+ extensions: []
300
+ extra_rdoc_files: []
301
+ files:
302
+ - CODE_OF_CONDUCT.md
303
+ - Gemfile
304
+ - Gemfile.lock
305
+ - LICENSE
306
+ - README.md
307
+ - Rakefile
308
+ - aaet.gemspec
309
+ - bin/aaet
310
+ - bin/console
311
+ - bin/setup
312
+ - generate_reports.rb
313
+ - lib/aaet.rb
314
+ - lib/aaet/android/android.rb
315
+ - lib/aaet/android/parser.rb
316
+ - lib/aaet/common/applitools.rb
317
+ - lib/aaet/common/common_methods.rb
318
+ - lib/aaet/common/locators.rb
319
+ - lib/aaet/common/redis.rb
320
+ - lib/aaet/ios/ios.rb
321
+ - lib/aaet/ios/parser.rb
322
+ - lib/version.rb
323
+ - run.rb
324
+ - setup/android_setup_methods.rb
325
+ - setup/common_setup_methods.rb
326
+ - setup/ios_setup_methods.rb
327
+ - template_google_api_format.haml
328
+ homepage: https://github.com/isonic1/Appium-Native-Crawler
329
+ licenses:
330
+ - Apache-2.0
331
+ metadata:
332
+ allowed_push_host: https://rubygems.org
333
+ post_install_message:
334
+ rdoc_options: []
335
+ require_paths:
336
+ - lib
337
+ required_ruby_version: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - ">="
340
+ - !ruby/object:Gem::Version
341
+ version: '0'
342
+ required_rubygems_version: !ruby/object:Gem::Requirement
343
+ requirements:
344
+ - - ">="
345
+ - !ruby/object:Gem::Version
346
+ version: '0'
347
+ requirements: []
348
+ rubyforge_project:
349
+ rubygems_version: 2.6.14.1
350
+ signing_key:
351
+ specification_version: 4
352
+ summary: A CLI to crawl native mobile Android applications with Appium on Devices,
353
+ Emulators & Cloud Serivces
354
+ test_files: []