mobmanager 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/README.md +2 -0
- data/lib/mobmanager/mobile/appium/server/server.rb +72 -0
- data/lib/mobmanager/mobile/os/os.rb +18 -0
- data/lib/mobmanager/mobile/platform/android/common.rb +32 -0
- data/lib/mobmanager/mobile/platform/android/device.rb +65 -0
- data/lib/mobmanager/mobile/platform/android/emulator.rb +134 -0
- data/lib/mobmanager/mobile/platform/ios/common.rb +21 -0
- data/lib/mobmanager/mobile/platform/ios/device.rb +13 -0
- data/lib/mobmanager/mobile/platform/ios/simulator.rb +74 -0
- data/lib/mobmanager/version.rb +3 -0
- data/lib/mobmanager.rb +9 -0
- data/mobmanager.gemspec +18 -0
- metadata +72 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: aef04bb70e5ad38e7e6b0e61999d5e1cd20eff19
|
4
|
+
data.tar.gz: 44ec61ad4b32c6008c6f839261f1e29b1e258e69
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 056abce902ace629d88e045c2022089e3791564cfe9151fa2ed671b9e3e38cd1889928da920b9e402c02304e781f2e4ab56e1b8f994a6b376e4374c5ef954e10
|
7
|
+
data.tar.gz: 1dab5c43178fafdea35829b211a14ec7de43265535623e5c6f45a1d269d84af2275b3b0d4a9fcec715a95c0175eb55da5b645e99f3bd5cf67a9a4cc00ffc21cd
|
data/.gitignore
ADDED
data/README.md
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require_relative '../../../../mobmanager/mobile/os/os'
|
2
|
+
|
3
|
+
module Mobile
|
4
|
+
module Appium
|
5
|
+
module Server
|
6
|
+
include OS
|
7
|
+
|
8
|
+
def start_appium_server
|
9
|
+
end_appium_server if node_running?
|
10
|
+
puts 'Starting Appium server...'
|
11
|
+
|
12
|
+
platform = ENV['PLATFORM']
|
13
|
+
|
14
|
+
if platform == 'android'
|
15
|
+
puts '-- Android Platform --'
|
16
|
+
if ENV['ANDROID_PHONE'] == 'emulator'
|
17
|
+
start_server
|
18
|
+
else
|
19
|
+
start_server ENV['DEVICE']
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
if platform == 'ios'
|
24
|
+
puts '-- IOS Platform --'
|
25
|
+
if ENV['IOS_PHONE'] == 'simulator'
|
26
|
+
start_server
|
27
|
+
else
|
28
|
+
start_server ENV['UIUD']
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
sleep 5
|
33
|
+
puts "Appium is listening...\n\n"
|
34
|
+
end
|
35
|
+
|
36
|
+
def end_appium_server
|
37
|
+
if node_running?
|
38
|
+
puts 'Terminating Appium server...'
|
39
|
+
if mac?
|
40
|
+
termination = system 'pkill node'
|
41
|
+
else
|
42
|
+
termination = system 'TASKKILL /F /IM node.exe'
|
43
|
+
end
|
44
|
+
return print_response(termination)
|
45
|
+
end
|
46
|
+
puts 'No Appium server found.'
|
47
|
+
end
|
48
|
+
|
49
|
+
def node_running?
|
50
|
+
if mac?
|
51
|
+
return true if %x[ps aux | grep -i node | grep -v grep | wc -l].to_i > 0
|
52
|
+
else
|
53
|
+
return true if %x[tasklist /FI "IMAGENAME eq node.exe"].to_s.include? 'node'
|
54
|
+
end
|
55
|
+
false
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def print_response(success)
|
60
|
+
return puts "Appium server terminated successfully." if success
|
61
|
+
return puts "Appium server was not found." unless success
|
62
|
+
warn '[PANIC]: Something went wrong while terminating the appium server.'
|
63
|
+
end
|
64
|
+
|
65
|
+
def start_server(id=nil, log_level='--log-level error')
|
66
|
+
udid = "--udid #{id}" unless id.nil?
|
67
|
+
command = "appium #{udid} #{log_level}"
|
68
|
+
spawn command
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module OS
|
2
|
+
def mac?
|
3
|
+
begin
|
4
|
+
os = %x[sw_vers -productName]
|
5
|
+
rescue Exception
|
6
|
+
os = nil
|
7
|
+
end
|
8
|
+
if os.nil?
|
9
|
+
return false if %x[ver].to_s.downcase.include? 'windows'
|
10
|
+
elsif os
|
11
|
+
return true if %[sw_vers -productName].to_s.downcase.include? 'mac'
|
12
|
+
else
|
13
|
+
fail '[PANIC:] Failed to determine OS.'
|
14
|
+
return false
|
15
|
+
end
|
16
|
+
true
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative '../../../../mobmanager/mobile/platform/android/device'
|
2
|
+
require_relative '../../../../mobmanager/mobile/platform/android/emulator'
|
3
|
+
|
4
|
+
module Platform
|
5
|
+
module Android
|
6
|
+
module Common
|
7
|
+
|
8
|
+
include Platform::Android::Device
|
9
|
+
include Platform::Android::Emulator
|
10
|
+
|
11
|
+
def prepare_android_phone(settings = nil)
|
12
|
+
if ENV['ANDROID_PHONE'] == 'emulator'
|
13
|
+
if ENV['TARGET'] == 'sauce'
|
14
|
+
start_emulator(settings)
|
15
|
+
else
|
16
|
+
terminate_emulator
|
17
|
+
start_emulator
|
18
|
+
online = wait_for_emulator
|
19
|
+
retry_again unless online
|
20
|
+
end
|
21
|
+
else
|
22
|
+
start_android_device
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def back_button
|
27
|
+
%x[adb shell input keyevent KEYCODE_BACK]
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require_relative '../../../../mobmanager/mobile/os/os'
|
2
|
+
|
3
|
+
module Platform
|
4
|
+
module Android
|
5
|
+
module Device
|
6
|
+
|
7
|
+
include OS
|
8
|
+
|
9
|
+
ANDROID_DEVICE ||= ENV['DEVICE']
|
10
|
+
|
11
|
+
def start_android_device
|
12
|
+
puts "Setting android device #{ANDROID_DEVICE}"
|
13
|
+
system 'adb start-server'
|
14
|
+
wait_for_android_device
|
15
|
+
end
|
16
|
+
|
17
|
+
def wait_for_android_device
|
18
|
+
max_wait = 5
|
19
|
+
counter = 0
|
20
|
+
|
21
|
+
found = false
|
22
|
+
while !found && counter <= max_wait
|
23
|
+
devices = %x[adb devices]
|
24
|
+
list = list_of_devices(devices)
|
25
|
+
begin
|
26
|
+
found = is_partial_string_in_array?(ANDROID_DEVICE, list)
|
27
|
+
rescue Exception => e
|
28
|
+
found = false
|
29
|
+
end
|
30
|
+
if found
|
31
|
+
return puts "Android device #{ANDROID_DEVICE} found."
|
32
|
+
end
|
33
|
+
counter += 1
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def terminate_android_device
|
38
|
+
system 'adb kill-server'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
#TODO - move to a helper module maybe adb?
|
45
|
+
def list_of_devices(text)
|
46
|
+
devices = []
|
47
|
+
lines = text.split("\n")
|
48
|
+
|
49
|
+
lines.each do |ele|
|
50
|
+
if ele.include?("\t")
|
51
|
+
devices << ele.split("\t")
|
52
|
+
else
|
53
|
+
devices << ele
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
devices.flatten!
|
58
|
+
end
|
59
|
+
|
60
|
+
def is_partial_string_in_array?(part_of_string, in_array)
|
61
|
+
in_array.each do |element|
|
62
|
+
return true if part_of_string.include? element
|
63
|
+
false
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require_relative '../../../../mobmanager/mobile/os/os'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Platform
|
5
|
+
module Android
|
6
|
+
module Emulator
|
7
|
+
|
8
|
+
include OS
|
9
|
+
|
10
|
+
ANDROID_EMULATOR ||= ENV['DEVICE']
|
11
|
+
OFFLINE_CHECKS ||= 15
|
12
|
+
|
13
|
+
def start_emulator(settings = nil)
|
14
|
+
if ENV['TARGET'] == 'sauce'
|
15
|
+
caps = settings unless settings.nil?
|
16
|
+
caps = YAML.load_file(Dir.pwd + '/features/support/settings/android.yml') if settings.nil?
|
17
|
+
setup_for_android_sauce caps
|
18
|
+
else
|
19
|
+
spawn "emulator -avd #{ANDROID_EMULATOR} -no-audio"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def setup_for_android_sauce(settings)
|
24
|
+
sauce_user = %x[echo $SAUCE_USER].strip
|
25
|
+
sauce_key = %x[echo $SAUCE_KEY].strip
|
26
|
+
app_path = settings[:apk_path]
|
27
|
+
app = app_path.split('/').select{|item| item.include?('.apk')}.first
|
28
|
+
puts 'MobTest: Connecting to sauce server...'
|
29
|
+
system "curl https://#{sauce_user}:#{sauce_key}@saucelabs.com/rest/v1/users/#{sauce_user}"
|
30
|
+
puts 'MobTest: Sending apk to sauce storage'
|
31
|
+
system 'curl -u '+"#{sauce_user}:#{sauce_key}"+' -X POST "https://saucelabs.com/rest/v1/storage/'+sauce_user+'/'+app+'?overwrite=true" -H "Content-Type: application/octet-stream" --data-binary @'+app_path
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
# Wait until emulator is online
|
36
|
+
def wait_for_emulator
|
37
|
+
online = false
|
38
|
+
iterations = 0
|
39
|
+
while online == false && iterations < OFFLINE_CHECKS
|
40
|
+
iterations += 1
|
41
|
+
sleep 3
|
42
|
+
puts 'Emulator is offline...'
|
43
|
+
list_of_devices = %x[adb devices].to_s
|
44
|
+
if list_of_devices.include? 'emulator'
|
45
|
+
if list_of_devices.include? 'offline'
|
46
|
+
online = false
|
47
|
+
else
|
48
|
+
puts "Emulator is online...\n\n"
|
49
|
+
online = true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
online
|
55
|
+
end
|
56
|
+
|
57
|
+
def retry_again
|
58
|
+
puts 'Something went wrong while getting the AVD. Retrying now...'
|
59
|
+
delete_locked_files
|
60
|
+
terminate_emulator
|
61
|
+
system 'adb kill-server'
|
62
|
+
system 'adb start-server'
|
63
|
+
start_emulator
|
64
|
+
online = wait_for_emulator
|
65
|
+
unless online
|
66
|
+
fail 'Something went wrong while getting the AVD. Verify the selected AVD exists.'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def terminate_emulator
|
71
|
+
if emulator_running?
|
72
|
+
puts 'Terminating Android emulator...'
|
73
|
+
if mac?
|
74
|
+
termination = system 'pkill -9 emulator'
|
75
|
+
else
|
76
|
+
termination = system 'TASKKILL /F /IM emulator-x86.exe'
|
77
|
+
cleanup_after_emulator
|
78
|
+
end
|
79
|
+
print_termination_response(termination)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def cleanup_after_emulator
|
84
|
+
if mac?
|
85
|
+
#remove /private/temp/android-<username>
|
86
|
+
path = '/private/tmp'
|
87
|
+
files = Dir["#{path}/**"]
|
88
|
+
files.each do |file|
|
89
|
+
if File.directory(file)
|
90
|
+
FileUtils.remove_dir(file) if ((file.include? 'android-'))
|
91
|
+
end
|
92
|
+
end
|
93
|
+
else
|
94
|
+
# Delete temp files from AppData/Local/Temp/AndroidEmulator
|
95
|
+
user_profile = %x[echo %USERPROFILE%].to_s.chomp!
|
96
|
+
Dir.glob(user_profile.gsub("\\", '/')+ '//AppData//Local//Temp//AndroidEmulator//*.tmp').each { |f| File.delete(f) }
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def emulator_running?
|
101
|
+
if mac?
|
102
|
+
if %x[ps aux | grep -i emulator | grep -v grep | wc -l].to_i > 0
|
103
|
+
return true
|
104
|
+
end
|
105
|
+
else
|
106
|
+
if %x[tasklist /FI "IMAGENAME eq emulator-x86.exe"].to_s.include? 'emulator'
|
107
|
+
return true
|
108
|
+
end
|
109
|
+
end
|
110
|
+
false
|
111
|
+
end
|
112
|
+
|
113
|
+
private
|
114
|
+
def print_termination_response(success)
|
115
|
+
if success
|
116
|
+
puts 'Android emulator terminated successfully.'
|
117
|
+
elsif !success
|
118
|
+
puts 'Android emulator was not found.'
|
119
|
+
else
|
120
|
+
warn '[PANIC]: Something went wrong while terminating the Android emulator.'
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def delete_locked_files
|
125
|
+
# Delete lock files from ./.android/avd
|
126
|
+
path = "#{Dir.home}/.android/avd"
|
127
|
+
locks = Dir["#{path}/**/*.lock"]
|
128
|
+
locks.each do |file|
|
129
|
+
File.delete(file)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative '../../../../mobmanager/mobile/platform/ios/device'
|
2
|
+
require_relative '../../../../mobmanager/mobile/platform/ios/simulator'
|
3
|
+
|
4
|
+
module Platform
|
5
|
+
module IOS
|
6
|
+
module Common
|
7
|
+
include Platform::IOS::Device
|
8
|
+
include Platform::IOS::Simulator
|
9
|
+
|
10
|
+
def prepare_ios_phone(settings = nil)
|
11
|
+
if ENV['IOS_PHONE'] == 'simulator'
|
12
|
+
terminate_simulator
|
13
|
+
start_simulator(settings)
|
14
|
+
else
|
15
|
+
start_ios_device
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require_relative '../../../../mobmanager/mobile/os/os'
|
3
|
+
|
4
|
+
module Platform
|
5
|
+
module IOS
|
6
|
+
module Simulator
|
7
|
+
|
8
|
+
include OS
|
9
|
+
|
10
|
+
def start_simulator(settings = nil)
|
11
|
+
caps = settings unless settings.nil?
|
12
|
+
caps = YAML.load_file(Dir.pwd + '/features/support/settings/ios.yml') if settings.nil?
|
13
|
+
|
14
|
+
unless caps[:workspace_path].nil?
|
15
|
+
build_ios_app(caps)
|
16
|
+
end
|
17
|
+
|
18
|
+
if ENV['TARGET'] == 'sauce'
|
19
|
+
setup_for_sauce(caps)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def build_ios_app(settings)
|
24
|
+
puts 'Building ios app with xcodebuild tool...'
|
25
|
+
puts 'MobTest: Building ios app with xcodebuild tool...'
|
26
|
+
#TODO - Add to PATH?
|
27
|
+
puts "ENV['IOS_DERIVED_DATA_PATH'] #{ENV['IOS_DERIVED_DATA_PATH']}"
|
28
|
+
fail("MobTest: Failed to determine app_path. Please check your ios.yml settings") if settings[:app_path].nil?
|
29
|
+
app = settings[:app_path].split('/').select{|element| element.include?'.app'}.first
|
30
|
+
system "xcodebuild -workspace #{settings[:workspace_path]} -scheme \"#{app.gsub('.app', '')}\" -configuration Debug -sdk \"#{settings['sim_sdk']}\" -derivedDataPath \"~/\""
|
31
|
+
end
|
32
|
+
|
33
|
+
def setup_for_sauce(settings)
|
34
|
+
sauce_user = %x[echo $SAUCE_USER].strip
|
35
|
+
sauce_key = %x[echo $SAUCE_KEY].strip
|
36
|
+
app_path = settings[:app_path]
|
37
|
+
zipped_app_path = app_path.gsub('.app','.zip')
|
38
|
+
app = app_path.split('/').select{|item| item.include?('.app')}.first.gsub('.app','')
|
39
|
+
puts 'MobTest: Connecting to sauce server...'
|
40
|
+
system "curl https://#{sauce_user}:#{sauce_key}@saucelabs.com/rest/v1/users/#{sauce_user}"
|
41
|
+
puts 'MobTest: Zipping iOS app'
|
42
|
+
system "zip -r #{zipped_app_path} #{app_path}/"
|
43
|
+
zipped_app_path = zipped_app_path.gsub('~',Dir.home)
|
44
|
+
puts 'MobTest: Sending zipped app to sauce storage'
|
45
|
+
system 'curl -u '+"#{sauce_user}:#{sauce_key}"+' -X POST "https://saucelabs.com/rest/v1/storage/'+sauce_user+'/'+app+'.zip?overwrite=true" -H "Content-Type: application/octet-stream" --data-binary @'+zipped_app_path
|
46
|
+
end
|
47
|
+
|
48
|
+
def terminate_simulator
|
49
|
+
spawn 'killall "iOS Simulator"'
|
50
|
+
spawn 'killall -9 instruments'
|
51
|
+
end
|
52
|
+
|
53
|
+
def close_and_clean_simulator
|
54
|
+
terminate_simulator
|
55
|
+
remove_sim_temp_files
|
56
|
+
end
|
57
|
+
|
58
|
+
def remove_sim_temp_files
|
59
|
+
if mac?
|
60
|
+
#remove ios related files from /private/temp/
|
61
|
+
path = '/private/tmp'
|
62
|
+
files = Dir["#{path}/**"]
|
63
|
+
files.each do |file|
|
64
|
+
if File.directory?(file)
|
65
|
+
FileUtils.remove_dir(file) if ((file.include? 'com.apple.') || (file.include? 'appium-instruments'))
|
66
|
+
end
|
67
|
+
end
|
68
|
+
else
|
69
|
+
# TODO - research in Windows OS
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/lib/mobmanager.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'mobmanager/version'
|
2
|
+
require 'mobmanager/mobile/appium/server/server'
|
3
|
+
require 'mobmanager/mobile/os/os'
|
4
|
+
require 'mobmanager/mobile/platform/android/common'
|
5
|
+
require 'mobmanager/mobile/platform/android/device'
|
6
|
+
require 'mobmanager/mobile/platform/android/emulator'
|
7
|
+
require 'mobmanager/mobile/platform/ios/common'
|
8
|
+
require 'mobmanager/mobile/platform/ios/device'
|
9
|
+
require 'mobmanager/mobile/platform/ios/simulator'
|
data/mobmanager.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'mobmanager/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "mobmanager"
|
8
|
+
spec.version = Mobmanager::VERSION
|
9
|
+
spec.authors = ['Milton Davalos']
|
10
|
+
spec.email = ['miltondavalos@gmail.com']
|
11
|
+
spec.summary = %q{Provides methods to manage Appium server}
|
12
|
+
spec.description = %q{Provides methods to start/end Appium server and management of apps in Android and iOS}
|
13
|
+
spec.homepage = 'https://github.com/miltondavalos/MobManager'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
spec.files = `git ls-files`.split("\n")
|
16
|
+
spec.require_paths = ["lib"]
|
17
|
+
spec.add_dependency 'require_all'
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mobmanager
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Milton Davalos
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-12-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: require_all
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Provides methods to start/end Appium server and management of apps in
|
28
|
+
Android and iOS
|
29
|
+
email:
|
30
|
+
- miltondavalos@gmail.com
|
31
|
+
executables: []
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- .gitignore
|
36
|
+
- README.md
|
37
|
+
- lib/mobmanager.rb
|
38
|
+
- lib/mobmanager/mobile/appium/server/server.rb
|
39
|
+
- lib/mobmanager/mobile/os/os.rb
|
40
|
+
- lib/mobmanager/mobile/platform/android/common.rb
|
41
|
+
- lib/mobmanager/mobile/platform/android/device.rb
|
42
|
+
- lib/mobmanager/mobile/platform/android/emulator.rb
|
43
|
+
- lib/mobmanager/mobile/platform/ios/common.rb
|
44
|
+
- lib/mobmanager/mobile/platform/ios/device.rb
|
45
|
+
- lib/mobmanager/mobile/platform/ios/simulator.rb
|
46
|
+
- lib/mobmanager/version.rb
|
47
|
+
- mobmanager.gemspec
|
48
|
+
homepage: https://github.com/miltondavalos/MobManager
|
49
|
+
licenses:
|
50
|
+
- MIT
|
51
|
+
metadata: {}
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options: []
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
requirements: []
|
67
|
+
rubyforge_project:
|
68
|
+
rubygems_version: 2.0.14
|
69
|
+
signing_key:
|
70
|
+
specification_version: 4
|
71
|
+
summary: Provides methods to manage Appium server
|
72
|
+
test_files: []
|