aaet 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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: []