dryrun 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -1
- data/lib/dryrun.rb +9 -2
- data/lib/dryrun/android_project.rb +33 -76
- data/lib/dryrun/android_utils.rb +17 -0
- data/lib/dryrun/gradle_adapter.rb +55 -0
- data/lib/dryrun/install_application_command.rb +33 -0
- data/lib/dryrun/manifest_parser.rb +33 -0
- data/lib/dryrun/test_application_command.rb +28 -0
- data/lib/dryrun/version.rb +1 -1
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12d9fa58a5064dd85da72920ac21be5fcaa0906c
|
4
|
+
data.tar.gz: cc3f02008e17b792b1e637bf16377e47d4da7e22
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 889183fa40425402bed0665325d5abc4aa7ee8c3741864c87e4c46637a82d5881f90c7868874fe5b0727b3f47c6860f35bd696518658e12d98f33026901fd397
|
7
|
+
data.tar.gz: 18739688e6362dc37467995c029eee686d7e43632f885526d24227d7663ec4e4c14d49924e48aba1a0f894ada9a4408b54ccc45f84bcc72441881936fe018b6a
|
data/README.md
CHANGED
@@ -49,6 +49,7 @@ Options
|
|
49
49
|
-w, --wipe Wipe the temporary dryrun folder
|
50
50
|
-h, --help Displays help
|
51
51
|
-v, --version Displays the version
|
52
|
+
-a, --android-test Execute android tests
|
52
53
|
```
|
53
54
|
|
54
55
|
## Alternative scenario (if you don't use `dryrun`)
|
@@ -80,7 +81,7 @@ Be aware that ANDROID_HOME needs to be set with the adb path:
|
|
80
81
|
- MAC -> ```ANDROID_HOME=/usr/local/opt/android-sdk```
|
81
82
|
- Linux -> ```ANDROID_HOME=/usr/local/opt/android-sdk```
|
82
83
|
- Windows -> ```ANDROID_HOME="...sdk"```
|
83
|
-
In windows this ANDROID_HOME is not automatically created, see more in [here](https://
|
84
|
+
In windows this ANDROID_HOME is not automatically created, see more in [here](https://github.com/facebook/react-native/blob/0.24-stable/docs/DevelopmentSetupAndroid.md#define-the-android_home-environment-variable)
|
84
85
|
|
85
86
|
Additionally, on windows in order to use git commands, the following path should be on the environment variable
|
86
87
|
- ```...\Git\cmd ```
|
data/lib/dryrun.rb
CHANGED
@@ -4,6 +4,8 @@ require 'fileutils'
|
|
4
4
|
require 'dryrun/github'
|
5
5
|
require 'dryrun/version'
|
6
6
|
require 'dryrun/android_project'
|
7
|
+
require 'dryrun/install_application_command'
|
8
|
+
require 'dryrun/test_application_command'
|
7
9
|
require 'dryrun/device'
|
8
10
|
require 'highline/import'
|
9
11
|
require 'openssl'
|
@@ -25,6 +27,7 @@ module Dryrun
|
|
25
27
|
@branch = 'master'
|
26
28
|
@devices = []
|
27
29
|
@cleanup = false
|
30
|
+
@command = InstallApplicationCommand.new
|
28
31
|
|
29
32
|
# Parse Options
|
30
33
|
create_options_parser(arguments)
|
@@ -74,6 +77,10 @@ module Dryrun
|
|
74
77
|
exit
|
75
78
|
end
|
76
79
|
|
80
|
+
opts.on('-a', '--android-test', 'Execute android tests') do
|
81
|
+
@command = TestApplicationCommand.new
|
82
|
+
end
|
83
|
+
|
77
84
|
opts.parse!
|
78
85
|
end
|
79
86
|
end
|
@@ -118,7 +125,7 @@ module Dryrun
|
|
118
125
|
if @devices.size >= 2
|
119
126
|
puts 'Pick your device (1,2,3...):'
|
120
127
|
|
121
|
-
@devices.each_with_index.map {
|
128
|
+
@devices.each_with_index.map {|key, index| puts "#{index.to_s.green} - #{key.name} \n"}
|
122
129
|
|
123
130
|
input = gets.chomp
|
124
131
|
|
@@ -198,7 +205,7 @@ module Dryrun
|
|
198
205
|
puts "Using custom module: #{@custom_module.green}" if @custom_module
|
199
206
|
|
200
207
|
# clean and install the apk
|
201
|
-
android_project.
|
208
|
+
android_project.execute_command(@command)
|
202
209
|
|
203
210
|
puts "\n> If you want to remove the app you just installed, execute:\n#{android_project.uninstall_command.yellow}\n\n"
|
204
211
|
end
|
@@ -3,6 +3,8 @@ require 'fileutils'
|
|
3
3
|
require 'tempfile'
|
4
4
|
require 'find'
|
5
5
|
require_relative 'dryrun_utils'
|
6
|
+
require_relative 'manifest_parser'
|
7
|
+
require_relative 'gradle_adapter'
|
6
8
|
|
7
9
|
module Dryrun
|
8
10
|
class AndroidProject
|
@@ -52,7 +54,8 @@ module Dryrun
|
|
52
54
|
|
53
55
|
# Write good lines to temporary file
|
54
56
|
File.open(file, 'r') do |f|
|
55
|
-
f.each do |l|
|
57
|
+
f.each do |l|
|
58
|
+
tmp << l unless l.include? 'applicationId'
|
56
59
|
end
|
57
60
|
end
|
58
61
|
tmp.close
|
@@ -71,7 +74,7 @@ module Dryrun
|
|
71
74
|
|
72
75
|
def valid?(main_gradle_file = @main_gradle_file)
|
73
76
|
File.exist?(main_gradle_file) &&
|
74
|
-
|
77
|
+
File.exist?(@settings_gradle_path)
|
75
78
|
end
|
76
79
|
|
77
80
|
def find_modules
|
@@ -79,111 +82,69 @@ module Dryrun
|
|
79
82
|
|
80
83
|
content = File.open(@settings_gradle_path, 'rb').read
|
81
84
|
modules = content.scan(/'([^']*)'/)
|
82
|
-
modules.each {
|
85
|
+
modules.each {|replacement| replacement.first.tr!(':', '/')}
|
83
86
|
end
|
84
87
|
|
85
|
-
def
|
88
|
+
def execute_command(command)
|
86
89
|
Dir.chdir @base_path
|
87
90
|
|
88
|
-
path
|
91
|
+
path = sample_project
|
92
|
+
manifest_parsed = parse_manifest(path)
|
89
93
|
|
90
|
-
if path == false &&
|
94
|
+
if path == false && manifest_parsed == false
|
91
95
|
puts "Couldn't open the sample project, sorry!".red
|
92
96
|
exit 1
|
93
97
|
end
|
94
98
|
|
95
|
-
builder =
|
96
|
-
|
97
|
-
if File.exist?('gradlew')
|
98
|
-
if !Gem.win_platform?
|
99
|
-
DryrunUtils.execute('chmod +x gradlew')
|
100
|
-
else
|
101
|
-
DryrunUtils.execute('icacls gradlew /T')
|
102
|
-
end
|
103
|
-
builder = './gradlew'
|
104
|
-
end
|
105
|
-
|
106
|
-
# Generate the gradle/ folder
|
107
|
-
DryrunUtils.execute('gradle wrap') if File.exist?('gradlew') && !gradle_wrapped?
|
99
|
+
builder = create_builder
|
108
100
|
|
109
101
|
remove_application_id
|
110
102
|
remove_local_properties
|
111
103
|
|
112
|
-
|
113
|
-
DryrunUtils.execute("#{builder} clean")
|
114
|
-
DryrunUtils.execute("#{builder} :#{@custom_module}:install#{@flavour}Debug")
|
115
|
-
else
|
116
|
-
DryrunUtils.execute("#{builder} clean")
|
117
|
-
|
118
|
-
if @device.nil?
|
119
|
-
puts 'No devices picked/available, proceeding with assemble instead'.green
|
120
|
-
puts "#{builder} assemble#{@flavour}Debug"
|
121
|
-
DryrunUtils.execute("#{builder} assemble#{@flavour}Debug")
|
122
|
-
else
|
123
|
-
puts "#{builder} install#{@flavour}Debug"
|
124
|
-
DryrunUtils.execute("#{builder} install#{@flavour}Debug")
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
unless @device.nil?
|
129
|
-
clear_app_data
|
130
|
-
puts "Installing #{@package.green}...\n"
|
131
|
-
puts "executing: #{execute_line.green}\n"
|
132
|
-
|
133
|
-
DryrunUtils.run_adb("shell #{execute_line}")
|
134
|
-
end
|
104
|
+
command.run(builder, @package, @launcher_activity, @custom_module, @flavour, @device)
|
135
105
|
end
|
136
106
|
|
137
107
|
def gradle_wrapped?
|
138
108
|
return false unless File.directory?('gradle/')
|
139
109
|
|
140
110
|
File.exist?('gradle/wrapper/gradle-wrapper.properties') &&
|
141
|
-
|
111
|
+
File.exist?('gradle/wrapper/gradle-wrapper.jar')
|
142
112
|
end
|
143
113
|
|
144
114
|
def sample_project
|
145
|
-
if @custom_module && @modules.any? {
|
115
|
+
if @custom_module && @modules.any? {|m| m.first == "/#{@custom_module}"}
|
146
116
|
@path_to_sample = File.join(@base_path, "/#{@custom_module}")
|
147
|
-
return @path_to_sample
|
117
|
+
return @path_to_sample
|
148
118
|
else
|
149
119
|
@modules.each do |child|
|
150
120
|
full_path = File.join(@base_path, child.first)
|
151
121
|
@path_to_sample = full_path
|
152
|
-
|
153
|
-
execution_line_command = get_execution_line_command(full_path)
|
154
|
-
return full_path, execution_line_command if execution_line_command
|
122
|
+
return full_path
|
155
123
|
end
|
156
124
|
end
|
157
|
-
|
125
|
+
false
|
158
126
|
end
|
159
127
|
|
160
128
|
def uninstall_command
|
161
129
|
"adb uninstall \"#{@package}\""
|
162
130
|
end
|
163
131
|
|
164
|
-
def clear_app_data
|
165
|
-
DryrunUtils.run_adb("shell pm clear #{@package}")
|
166
|
-
end
|
167
|
-
|
168
132
|
def uninstall_application
|
169
133
|
DryrunUtils.run_adb("shell pm uninstall #{@package}")
|
170
134
|
end
|
171
135
|
|
172
|
-
def
|
136
|
+
def parse_manifest(path_to_sample)
|
173
137
|
manifest_file = get_manifest(path_to_sample)
|
174
138
|
|
175
139
|
return false if manifest_file.nil?
|
176
140
|
|
177
|
-
|
178
|
-
|
179
|
-
@
|
180
|
-
@launcher_activity = get_launcher_activity(doc)
|
141
|
+
manifest_parser = ManifestParser.new(manifest_file)
|
142
|
+
@package = manifest_parser.package
|
143
|
+
@launcher_activity = manifest_parser.launcher_activity
|
181
144
|
|
182
145
|
return false unless @launcher_activity
|
183
146
|
|
184
147
|
manifest_file.close
|
185
|
-
|
186
|
-
"am start -n \"#{launcheable_activity}\" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER"
|
187
148
|
end
|
188
149
|
|
189
150
|
def get_manifest(path_to_sample)
|
@@ -199,25 +160,21 @@ module Dryrun
|
|
199
160
|
end
|
200
161
|
end
|
201
162
|
|
202
|
-
def
|
203
|
-
|
204
|
-
"#{@package}/#{full_path_to_launcher}"
|
205
|
-
end
|
206
|
-
|
207
|
-
def get_package(doc)
|
208
|
-
doc.xpath('//manifest').attr('package').first.value
|
209
|
-
end
|
210
|
-
|
211
|
-
def get_launcher_activity(doc)
|
212
|
-
activities = doc.css('activity')
|
213
|
-
activities.each do |child|
|
214
|
-
intent_filter = child.css('intent-filter')
|
163
|
+
def create_builder
|
164
|
+
builder = 'gradle'
|
215
165
|
|
216
|
-
|
217
|
-
|
166
|
+
if File.exist?('gradlew')
|
167
|
+
if !Gem.win_platform?
|
168
|
+
DryrunUtils.execute('chmod +x gradlew')
|
169
|
+
else
|
170
|
+
DryrunUtils.execute('icacls gradlew /T')
|
218
171
|
end
|
172
|
+
builder = './gradlew'
|
219
173
|
end
|
220
|
-
|
174
|
+
|
175
|
+
# Generate the gradle/ folder
|
176
|
+
DryrunUtils.execute('gradle wrap') if File.exist?('gradlew') && !gradle_wrapped?
|
177
|
+
GradleAdapter.new(builder)
|
221
178
|
end
|
222
179
|
end
|
223
180
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative 'dryrun_utils'
|
2
|
+
|
3
|
+
module Dryrun
|
4
|
+
class AndroidUtils
|
5
|
+
|
6
|
+
def self.pretty_run(execute_line, package)
|
7
|
+
puts "Installing #{package.green}...\n"
|
8
|
+
puts "executing: #{execute_line.green}\n"
|
9
|
+
|
10
|
+
DryrunUtils.run_adb("shell #{execute_line}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.clear_app_data(package)
|
14
|
+
DryrunUtils.run_adb("shell pm clear #{package}")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require_relative 'dryrun_utils'
|
2
|
+
|
3
|
+
module Dryrun
|
4
|
+
class GradleAdapter
|
5
|
+
|
6
|
+
def initialize(builder)
|
7
|
+
@builder = builder
|
8
|
+
end
|
9
|
+
|
10
|
+
def clean
|
11
|
+
DryrunUtils.execute("#{@builder} clean")
|
12
|
+
end
|
13
|
+
|
14
|
+
def run_android_tests(custom_module, flavour)
|
15
|
+
if custom_module
|
16
|
+
puts "#{@builder} :#{custom_module}:connected#{flavour}DebugAndroidTest"
|
17
|
+
DryrunUtils.execute("#{@builder} :#{custom_module}:connected#{flavour}DebugAndroidTest")
|
18
|
+
else
|
19
|
+
puts "#{@builder} connected#{flavour}DebugAndroidTest"
|
20
|
+
DryrunUtils.execute("#{@builder} connected#{flavour}DebugAndroidTest")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def run_unit_tests(custom_module, flavour)
|
25
|
+
if custom_module
|
26
|
+
puts "#{@builder} :#{custom_module}:test#{flavour}DebugUnitTest"
|
27
|
+
DryrunUtils.execute("#{@builder} :#{custom_module}:test#{flavour}DebugUnitTest")
|
28
|
+
else
|
29
|
+
puts "#{@builder} test#{flavour}DebugUnitTest"
|
30
|
+
DryrunUtils.execute("#{@builder} test#{flavour}DebugUnitTest")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def install(custom_module, flavour)
|
35
|
+
if custom_module
|
36
|
+
puts "#{@builder} :#{custom_module}:install#{flavour}Debug"
|
37
|
+
DryrunUtils.execute("#{@builder} :#{custom_module}:install#{flavour}Debug")
|
38
|
+
else
|
39
|
+
puts "#{@builder} install#{flavour}Debug"
|
40
|
+
DryrunUtils.execute("#{@builder} install#{flavour}Debug")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def assemble(custom_module, flavour)
|
46
|
+
if custom_module
|
47
|
+
puts "#{@builder} :#{custom_module}:assemble#{flavour}Debug"
|
48
|
+
DryrunUtils.execute("#{@builder} :#{custom_module}:assemble#{flavour}Debug")
|
49
|
+
else
|
50
|
+
puts "#{@builder} assemble#{flavour}Debug"
|
51
|
+
DryrunUtils.execute("#{@builder} assemble#{flavour}Debug")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative 'dryrun_utils'
|
2
|
+
require_relative 'android_utils'
|
3
|
+
|
4
|
+
module Dryrun
|
5
|
+
class InstallApplicationCommand
|
6
|
+
|
7
|
+
def run(builder, package, launcher_activity, custom_module, flavour, device)
|
8
|
+
execute_line = get_execution_command_line(package, launcher_activity)
|
9
|
+
builder.clean
|
10
|
+
|
11
|
+
if device.nil?
|
12
|
+
puts 'No devices picked/available, proceeding with assemble instead'.green
|
13
|
+
builder.assemble(custom_module, flavour)
|
14
|
+
else
|
15
|
+
builder.install(custom_module, flavour)
|
16
|
+
end
|
17
|
+
|
18
|
+
unless device.nil?
|
19
|
+
AndroidUtils.clear_app_data(package)
|
20
|
+
AndroidUtils.pretty_run(execute_line, package)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_execution_command_line(package, launcher_activity)
|
25
|
+
"am start -n \"#{launcheable_activity(package, launcher_activity)}\" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER"
|
26
|
+
end
|
27
|
+
|
28
|
+
def launcheable_activity(package, launcher_activity)
|
29
|
+
full_path_to_launcher = "#{package}#{launcher_activity.gsub(package, '')}"
|
30
|
+
"#{package}/#{full_path_to_launcher}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'oga'
|
2
|
+
|
3
|
+
module Dryrun
|
4
|
+
|
5
|
+
class ManifestParser
|
6
|
+
|
7
|
+
attr_accessor :package, :launcher_activity
|
8
|
+
|
9
|
+
def initialize(manifest_file)
|
10
|
+
doc = Oga.parse_xml(manifest_file)
|
11
|
+
|
12
|
+
@package = get_package(doc)
|
13
|
+
@launcher_activity = get_launcher_activity(doc)
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_package(doc)
|
17
|
+
doc.xpath('//manifest').attr('package').first.value
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_launcher_activity(doc)
|
21
|
+
activities = doc.css('activity')
|
22
|
+
activities.each do |child|
|
23
|
+
intent_filter = child.css('intent-filter')
|
24
|
+
|
25
|
+
if !intent_filter.nil? && !intent_filter.empty?
|
26
|
+
return child.attr('android:name').value
|
27
|
+
end
|
28
|
+
end
|
29
|
+
false
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative 'dryrun_utils'
|
2
|
+
require_relative 'android_utils'
|
3
|
+
|
4
|
+
module Dryrun
|
5
|
+
class TestApplicationCommand
|
6
|
+
|
7
|
+
def run(builder, package, launcher_activity, custom_module, flavour, device)
|
8
|
+
execute_line = get_execution_command_line(package)
|
9
|
+
builder.clean
|
10
|
+
|
11
|
+
if device.nil?
|
12
|
+
puts 'No devices picked/available, proceeding with unit tests instead'.green
|
13
|
+
builder.run_unit_tests(custom_module, flavour)
|
14
|
+
else
|
15
|
+
builder.run_android_tests(custom_module, flavour)
|
16
|
+
end
|
17
|
+
|
18
|
+
unless device.nil?
|
19
|
+
AndroidUtils.clear_app_data(package)
|
20
|
+
AndroidUtils.pretty_run(execute_line, package)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_execution_command_line(package)
|
25
|
+
"adb shell am instrument -w #{package}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/dryrun/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dryrun
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- cesar ferreira
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -149,9 +149,14 @@ files:
|
|
149
149
|
- extras/usage_v4.gif
|
150
150
|
- lib/dryrun.rb
|
151
151
|
- lib/dryrun/android_project.rb
|
152
|
+
- lib/dryrun/android_utils.rb
|
152
153
|
- lib/dryrun/device.rb
|
153
154
|
- lib/dryrun/dryrun_utils.rb
|
154
155
|
- lib/dryrun/github.rb
|
156
|
+
- lib/dryrun/gradle_adapter.rb
|
157
|
+
- lib/dryrun/install_application_command.rb
|
158
|
+
- lib/dryrun/manifest_parser.rb
|
159
|
+
- lib/dryrun/test_application_command.rb
|
155
160
|
- lib/dryrun/version.rb
|
156
161
|
- spec/dryrun_spec.rb
|
157
162
|
- spec/github_spec.rb
|
@@ -177,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
182
|
version: '0'
|
178
183
|
requirements: []
|
179
184
|
rubyforge_project:
|
180
|
-
rubygems_version: 2.6.
|
185
|
+
rubygems_version: 2.6.14
|
181
186
|
signing_key:
|
182
187
|
specification_version: 4
|
183
188
|
summary: Tool to try any android library hosted online directly from the command line
|