earlgrey 0.1.6 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/earlgrey +1 -1
- data/lib/{earlgrey/earlgrey.rb → cocoapods_plugin.rb} +2 -11
- data/lib/earlgrey.rb +1 -1
- data/lib/earlgrey/cli.rb +3 -3
- data/lib/earlgrey/configure_earlgrey.rb +237 -227
- data/lib/earlgrey/extensions.rb +17 -0
- data/lib/earlgrey/extensions/aggregate_target_extensions.rb +36 -0
- data/lib/earlgrey/extensions/analyzer_extensions.rb +51 -0
- data/lib/earlgrey/version.rb +1 -1
- metadata +8 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 119eb6c49d0f9ec0a629f2e46b073ea0b27b7098
|
4
|
+
data.tar.gz: f28b6a153bd07b865c043667a9d327811f4eb62f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 322cb875b7ddce6157ff0205e7c105c98a3a00ad52e40340e5aff81473915e5e504d9ee5a31672c8f93a9149586019cf9f2b6e2b33b3a431d2943b91091084b6
|
7
|
+
data.tar.gz: 027b47b75110a4901670b6e87136575dec90600d950ba1df5209ae3e3e37aaaec53be49f4bb52070af3a73dfa4a41ce0abcc3a11e65961d7d8d77df02cde59c2
|
data/bin/earlgrey
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright
|
2
|
+
# Copyright 2017 Google Inc.
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
5
|
# you may not use this file except in compliance with the License.
|
@@ -13,13 +13,4 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
|
-
|
17
|
-
require 'xcodeproj'
|
18
|
-
require 'colored'
|
19
|
-
require 'thor'
|
20
|
-
|
21
|
-
require 'fileutils'
|
22
|
-
|
23
|
-
require_relative 'version'
|
24
|
-
require_relative 'configure_earlgrey'
|
25
|
-
require_relative 'cli'
|
16
|
+
require_relative 'earlgrey/extensions'
|
data/lib/earlgrey.rb
CHANGED
data/lib/earlgrey/cli.rb
CHANGED
@@ -12,6 +12,8 @@
|
|
12
12
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
|
+
require 'earlgrey/configure_earlgrey'
|
16
|
+
require 'thor'
|
15
17
|
|
16
18
|
# rubocop:disable Metrics/LineLength
|
17
19
|
module EarlGrey
|
@@ -36,8 +38,6 @@ module EarlGrey
|
|
36
38
|
def install
|
37
39
|
o = options.dup
|
38
40
|
|
39
|
-
# CLI will never use Cocoapod's `post_install do |installer|`
|
40
|
-
podfile_installer = nil
|
41
41
|
opts = { swift: o[SWIFT], carthage: o[CARTHAGE], swift_version: o[SWIFT_VERSION] }
|
42
42
|
|
43
43
|
# Use target as the default Scheme name.
|
@@ -46,7 +46,7 @@ module EarlGrey
|
|
46
46
|
o[PROJECT] ||= Dir.glob(File.join(Dir.pwd, '*.xcodeproj')).first
|
47
47
|
raise 'No project found' unless o[PROJECT]
|
48
48
|
|
49
|
-
EarlGrey.configure_for_earlgrey
|
49
|
+
EarlGrey.configure_for_earlgrey o[PROJECT], o[TARGET], o[SCHEME], opts
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
#
|
2
4
|
# Copyright 2016 Google Inc.
|
3
5
|
#
|
@@ -13,19 +15,50 @@
|
|
13
15
|
# See the License for the specific language governing permissions and
|
14
16
|
# limitations under the License.
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
require 'colored'
|
19
|
+
require 'fileutils'
|
20
|
+
require 'xcodeproj'
|
21
|
+
|
22
|
+
def configure_for_earlgrey(*_)
|
23
|
+
EarlGrey.puts_yellow <<-S
|
24
|
+
configure_for_earlgrey in post_install is now deprecated, you should safely remove it now.
|
25
|
+
EarlGrey pod will automatically set up your project and schemes.
|
26
|
+
|
27
|
+
for more information, please visit our installation guideline:
|
28
|
+
https://github.com/google/EarlGrey/blob/master/docs/install-and-run.md
|
29
|
+
S
|
19
30
|
end
|
20
31
|
|
21
32
|
module EarlGrey
|
33
|
+
XCScheme = Xcodeproj::XCScheme
|
34
|
+
EnvironmentVariable = XCScheme::EnvironmentVariable
|
35
|
+
|
36
|
+
XCSCHEME_EXT = '*.xcscheme'.freeze
|
37
|
+
ENVIRONMENT_KEY = 'DYLD_INSERT_LIBRARIES'.freeze
|
38
|
+
ENVIRONMENT_VALUE = '@executable_path/EarlGrey.framework/EarlGrey'.freeze
|
39
|
+
|
40
|
+
FRAMEWORK_SEARCH_PATHS = 'FRAMEWORK_SEARCH_PATHS'.freeze
|
41
|
+
HEADER_SEARCH_PATHS = 'HEADER_SEARCH_PATHS'.freeze
|
42
|
+
|
43
|
+
SWIFT_FILETYPE = 'sourcecode.swift'.freeze
|
44
|
+
UNITTEST_PRODUCTTYPE = 'com.apple.product-type.bundle.unit-test'.freeze
|
45
|
+
|
46
|
+
CARTHAGE_BUILD_IOS = '$(SRCROOT)/Carthage/Build/iOS'.freeze
|
47
|
+
CARTHAGE_HEADERS_IOS = '$(SRCROOT)/Carthage/Build/iOS/**'.freeze
|
48
|
+
|
49
|
+
EARLGREY_FRAMEWORK = 'EarlGrey.framework'.freeze
|
50
|
+
CARTHAGE_FRAMEWORK_PATH =
|
51
|
+
'${SRCROOT}/Carthage/Build/iOS/EarlGrey.framework'.freeze
|
52
|
+
POD_FRAMEWORK_PATH =
|
53
|
+
'${SRCROOT}/Pods/EarlGrey/EarlGrey/EarlGrey.framework'.freeze
|
54
|
+
|
22
55
|
class << self
|
23
|
-
attr_reader :project_name, :installer, :test_target, :test_target_name,
|
24
|
-
:user_project, :carthage, :swift, :swift_version
|
56
|
+
attr_reader :project_name, :installer, :test_target, :test_target_name,
|
57
|
+
:scheme_file, :user_project, :carthage, :swift, :swift_version
|
25
58
|
|
26
59
|
# Returns path to Xcode file, prepending current working dir if necessary.
|
27
|
-
# @param
|
28
|
-
# @param
|
60
|
+
# @param [String] project_name name of the .xcodeproj file
|
61
|
+
# @param [String] ext xcode file extension
|
29
62
|
# @return [String] path to Xcode file
|
30
63
|
def path_for(project_name, ext)
|
31
64
|
ext_match = File.extname(project_name) == ext
|
@@ -34,64 +67,59 @@ module EarlGrey
|
|
34
67
|
path ? path : nil
|
35
68
|
end
|
36
69
|
|
37
|
-
# Returns the project's directory. If CocoaPods hasn't had it passed in,
|
38
|
-
# directory is chosen.
|
70
|
+
# Returns the project's directory. If CocoaPods hasn't had it passed in,
|
71
|
+
# then the current directory is chosen.
|
39
72
|
# @return [String] directory path for the Xcode project
|
40
73
|
def dir_path
|
41
74
|
installer ? installer.config.installation_root : Dir.pwd
|
42
75
|
end
|
43
76
|
|
44
77
|
# Strips each line in a string
|
45
|
-
# @param
|
78
|
+
# @param [String] string the string to process
|
46
79
|
# @return [String] the modified string
|
47
80
|
def strip(string)
|
48
81
|
string.split("\n").map(&:strip).join("\n")
|
49
82
|
end
|
50
83
|
|
51
84
|
# Raise error message after removing excessive spaces.
|
52
|
-
# @param
|
85
|
+
# @param [String] message the message to raise
|
53
86
|
# @return [nil]
|
54
87
|
def error(message)
|
55
88
|
raise strip(message)
|
56
89
|
end
|
57
90
|
|
58
|
-
# Prints string as
|
59
|
-
# @param
|
91
|
+
# Prints string as magenta after stripping excess spacing
|
92
|
+
# @param [String] string the string to print
|
60
93
|
# @return [nil]
|
61
|
-
def
|
62
|
-
puts strip(string).
|
94
|
+
def puts_magenta(string)
|
95
|
+
puts strip(string).magenta
|
63
96
|
end
|
64
97
|
|
65
98
|
# Prints string as yellow after stripping excess spacing
|
66
|
-
# @param
|
99
|
+
# @param [String] string the string to print
|
67
100
|
# @return [nil]
|
68
101
|
def puts_yellow(string)
|
69
102
|
puts strip(string).yellow
|
70
103
|
end
|
71
104
|
|
72
|
-
def set_defaults(
|
105
|
+
def set_defaults(project_name, test_target_name, scheme_file, opts = {})
|
73
106
|
@swift = opts.fetch(:swift, false)
|
74
107
|
@carthage = opts.fetch(:carthage, false)
|
75
108
|
@swift_version = opts.fetch(:swift_version, '3.0')
|
76
|
-
@installer = installer
|
77
109
|
|
78
|
-
|
79
|
-
pods_project = installer ? installer.pods_project : true
|
110
|
+
puts_magenta "Checking and Updating #{project_name} for EarlGrey."
|
80
111
|
project_file = path_for project_name, '.xcodeproj'
|
81
112
|
|
82
113
|
raise 'No test target provided' unless test_target_name
|
83
114
|
|
84
|
-
if
|
115
|
+
if project_file.nil?
|
85
116
|
error <<-E
|
86
|
-
The target's xcodeproj file could not be found.
|
87
|
-
|
117
|
+
The target's xcodeproj file could not be found. Please check if the
|
118
|
+
correct PROJECT_NAME is being passed in the Podfile.
|
88
119
|
Current PROJECT_NAME is: #{project_name}
|
89
120
|
E
|
90
121
|
end
|
91
122
|
|
92
|
-
# must reset state on every configure
|
93
|
-
@add_earlgrey_product = nil
|
94
|
-
|
95
123
|
@project_name = project_name
|
96
124
|
@test_target_name = test_target_name
|
97
125
|
@scheme_file = File.basename(scheme_file, '.*') + '.xcscheme'
|
@@ -108,243 +136,244 @@ module EarlGrey
|
|
108
136
|
|
109
137
|
# Main entry point. Configures An Xcode project for use with EarlGrey.
|
110
138
|
#
|
111
|
-
# @param
|
112
|
-
#
|
113
|
-
# @param
|
114
|
-
#
|
139
|
+
# @param [String] project_name
|
140
|
+
# the xcodeproj file name
|
141
|
+
# @param [String] test_target_name
|
142
|
+
# the test target name contained in xcodeproj
|
143
|
+
# @param [String] scheme_file
|
144
|
+
# the scheme file name. defaults to project name when nil.
|
115
145
|
# @return [nil]
|
116
|
-
def configure_for_earlgrey(
|
117
|
-
|
146
|
+
def configure_for_earlgrey(project_name, test_target_name,
|
147
|
+
scheme_file, opts = {})
|
148
|
+
set_defaults(project_name, test_target_name, scheme_file, opts)
|
118
149
|
|
119
|
-
# Add
|
120
|
-
|
150
|
+
# Add DYLD_INSERT_LIBRARIES to the schemes
|
151
|
+
modify_scheme_for_actions(user_project, [test_target]).each do |_, scheme|
|
152
|
+
scheme.save!
|
153
|
+
end
|
121
154
|
|
122
|
-
# Add a Copy Files Build Phase for EarlGrey.framework to embed it into
|
123
|
-
|
155
|
+
# Add a Copy Files Build Phase for EarlGrey.framework to embed it into
|
156
|
+
# the app under test.
|
157
|
+
framework_ref = add_earlgrey_product user_project, carthage
|
158
|
+
add_earlgrey_framework test_target, framework_ref
|
159
|
+
add_earlgrey_copy_files_script test_target, framework_ref
|
124
160
|
|
125
161
|
# Add header/framework search paths for carthage
|
126
|
-
add_carthage_search_paths
|
162
|
+
add_carthage_search_paths test_target if carthage
|
127
163
|
|
128
164
|
# Adds EarlGrey.swift
|
129
|
-
copy_swift_files
|
130
|
-
|
131
|
-
save_earlgrey_scheme_changes(scheme) unless scheme.nil?
|
165
|
+
copy_swift_files(user_project, test_target, swift_version) if swift
|
132
166
|
|
133
|
-
|
167
|
+
user_project.save
|
168
|
+
puts_magenta <<-S
|
134
169
|
EarlGrey setup complete.
|
135
170
|
You can use the Test Target: #{test_target_name} for EarlGrey testing.
|
136
171
|
S
|
137
172
|
end
|
138
173
|
|
139
|
-
#
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
174
|
+
# Returns the schemes that contain the given targets
|
175
|
+
#
|
176
|
+
# @param [Xcodeproj::Project] project
|
177
|
+
# @param [Array<Xcodeproj::PBXNativeTarget>] targets
|
178
|
+
# @return [Array<Xcodeproj::XCScheme>]
|
179
|
+
def schemes_for_native_targets(project, targets)
|
180
|
+
schemes = Dir[File.join(XCScheme.shared_data_dir(project.path), XCSCHEME_EXT)] +
|
181
|
+
Dir[File.join(XCScheme.user_data_dir(project.path), XCSCHEME_EXT)]
|
182
|
+
|
183
|
+
schemes = schemes.map { |scheme| [scheme, Xcodeproj::XCScheme.new(scheme)] }
|
184
|
+
|
185
|
+
targets_names = targets.map(&:name)
|
186
|
+
schemes.select do |scheme|
|
187
|
+
scheme[1].test_action.testables.any? do |testable|
|
188
|
+
testable.buildable_references.any? do |buildable|
|
189
|
+
targets_names.include? buildable.target_name
|
190
|
+
end
|
191
|
+
end
|
148
192
|
end
|
193
|
+
end
|
149
194
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
195
|
+
# Add DYLD_INSERT_LIBRARIES to the launching environments for the test
|
196
|
+
# schemes to ensure that EarlGrey is correctly loaded before main() is
|
197
|
+
# called.
|
198
|
+
#
|
199
|
+
# @param [Xcodeproj::Project] project
|
200
|
+
# @param [Array<Xcodeproj::PBXNativeTarget>] targets
|
201
|
+
# @return [Array<String, Xcodeproj::XCScheme>]
|
202
|
+
def modify_scheme_for_actions(project, targets)
|
203
|
+
schemes = schemes_for_native_targets(project, targets).uniq do |name, _|
|
204
|
+
name
|
155
205
|
end
|
156
|
-
|
157
|
-
|
158
|
-
test_action_value = '@executable_path/EarlGrey.framework/EarlGrey'
|
159
|
-
unless scheme.test_action.xml_element.to_s.include? test_action_value
|
160
|
-
scheme = add_environment_variables_to_test_action_scheme(scheme_filename,
|
161
|
-
scheme,
|
162
|
-
test_action_key,
|
163
|
-
test_action_value)
|
206
|
+
schemes.each do |name, scheme|
|
207
|
+
add_environment_variables_to_test_scheme(name, scheme)
|
164
208
|
end
|
165
|
-
|
166
|
-
scheme
|
167
209
|
end
|
168
210
|
|
169
211
|
# Load the EarlGrey framework when the app binary is loaded by
|
170
212
|
# the dynamic loader, before the main() method is called.
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
213
|
+
#
|
214
|
+
# @param [String] name
|
215
|
+
# @param [Xcodeproj::XCScheme] scheme
|
216
|
+
def add_environment_variables_to_test_scheme(name, scheme)
|
217
|
+
name = File.basename(name, '.xcscheme')
|
175
218
|
test_action = scheme.test_action
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
///////////////////////////////////////////////////////////////
|
219
|
+
test_variables = test_action.environment_variables
|
220
|
+
|
221
|
+
# If any environment variables or arguments were being used in the test
|
222
|
+
# action by being copied from the launch (run) action then copy them over
|
223
|
+
# to the test action along with the EarlGrey environment variable.
|
224
|
+
if test_action.should_use_launch_scheme_args_env?
|
225
|
+
scheme.launch_action.environment_variables.all_variables.each do |var|
|
226
|
+
test_variables.assign_variable var
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
env_variable = test_variables[ENVIRONMENT_KEY] ||
|
231
|
+
EnvironmentVariable.new(key: ENVIRONMENT_KEY, value: '')
|
232
|
+
if env_variable.value.include? ENVIRONMENT_VALUE
|
233
|
+
puts_magenta <<-S
|
234
|
+
DYLD_INSERT_LIBRARIES is already set up for #{name}, ignored.
|
193
235
|
S
|
194
|
-
return
|
236
|
+
return scheme
|
195
237
|
end
|
196
|
-
|
238
|
+
puts_magenta <<-S
|
197
239
|
Adding EarlGrey Framework Location as an Environment Variable
|
198
|
-
in the App Project's Test Target's Scheme Test Action.
|
240
|
+
in the App Project's Test Target's Scheme Test Action #{name}.
|
199
241
|
S
|
200
242
|
|
201
|
-
# Check if the test action uses the run action's environment variables and arguments.
|
202
|
-
launch_action_env_args_present = false
|
203
|
-
if (scheme.test_action.xml_element.to_s.include? 'shouldUseLaunchSchemeArgsEnv') &&
|
204
|
-
((scheme.launch_action.xml_element.to_s.include? '<EnvironmentVariables>') ||
|
205
|
-
(scheme.launch_action.xml_element.to_s.include? '<CommandLineArguments>'))
|
206
|
-
launch_action_env_args_present = true
|
207
|
-
end
|
208
|
-
|
209
|
-
test_action_is_enabled = 'YES'
|
210
243
|
test_action.should_use_launch_scheme_args_env = false
|
244
|
+
env_variable.value += env_variable.value.empty? ? '' : ':'
|
245
|
+
env_variable.value += ENVIRONMENT_VALUE
|
246
|
+
env_variable.enabled = true
|
247
|
+
test_variables.assign_variable env_variable
|
248
|
+
test_action.environment_variables = test_variables
|
211
249
|
|
212
|
-
|
213
|
-
unless scheme.test_action.xml_element.to_s.include? '<EnvironmentVariables>'
|
214
|
-
scheme.test_action.xml_element.add_element('EnvironmentVariables')
|
215
|
-
end
|
216
|
-
|
217
|
-
# If Launch Action Arguments are present and none are present in the test
|
218
|
-
# action, then please add them in.
|
219
|
-
if (scheme.launch_action.xml_element.to_s.include? '<CommandLineArguments>') &&
|
220
|
-
!(scheme.test_action.xml_element.to_s.include? '<CommandLineArguments>')
|
221
|
-
scheme.test_action.xml_element.add_element('CommandLineArguments')
|
222
|
-
end
|
223
|
-
|
224
|
-
# Create a new environment variable and add it to the Environment Variables.
|
225
|
-
test_action_env_vars = scheme.test_action.xml_element.elements['EnvironmentVariables']
|
226
|
-
test_action_args = scheme.test_action.xml_element.elements['CommandLineArguments']
|
227
|
-
|
228
|
-
earl_grey_environment_variable = REXML::Element.new 'EnvironmentVariable'
|
229
|
-
earl_grey_environment_variable.attributes['key'] = test_action_key
|
230
|
-
earl_grey_environment_variable.attributes['value'] = test_action_value
|
231
|
-
earl_grey_environment_variable.attributes['isEnabled'] = test_action_is_enabled
|
232
|
-
test_action_env_vars.add_element(earl_grey_environment_variable)
|
233
|
-
|
234
|
-
# If any environment variables or arguments were being used in the test action by
|
235
|
-
# being copied from the launch (run) action then copy them over to the test action
|
236
|
-
# along with the EarlGrey environment variable.
|
237
|
-
if launch_action_env_args_present
|
238
|
-
launch_action_env_vars = scheme.launch_action.xml_element.elements['EnvironmentVariables']
|
239
|
-
launch_action_args = scheme.launch_action.xml_element.elements['CommandLineArguments']
|
240
|
-
|
241
|
-
# Add in the Environment Variables
|
242
|
-
unless launch_action_env_vars.nil?
|
243
|
-
launch_action_env_vars.elements.each('EnvironmentVariable') do |launch_action_env_var|
|
244
|
-
environment_variable = REXML::Element.new 'EnvironmentVariable'
|
245
|
-
launch_attributes = launch_action_env_var.attributes
|
246
|
-
environment_variable.attributes['key'] = launch_attributes['key']
|
247
|
-
environment_variable.attributes['value'] = launch_attributes['value']
|
248
|
-
environment_variable.attributes['isEnabled'] = launch_attributes['isEnabled']
|
249
|
-
test_action_env_vars.add_element(environment_variable)
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
# Add in the Arguments
|
254
|
-
unless launch_action_args.nil?
|
255
|
-
launch_action_args.elements.each('CommandLineArgument') do |launch_action_arg|
|
256
|
-
argument = REXML::Element.new 'CommandLineArgument'
|
257
|
-
argument.attributes['argument'] = launch_action_arg.attributes['argument']
|
258
|
-
argument.attributes['isEnabled'] = launch_action_arg.attributes['isEnabled']
|
259
|
-
test_action_args.add_element(argument)
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
end
|
264
|
-
scheme.test_action = test_action
|
265
|
-
scheme
|
250
|
+
scheme.save!
|
266
251
|
end
|
267
252
|
|
268
253
|
# Adds EarlGrey.framework to products group. Returns file ref.
|
269
|
-
|
270
|
-
|
254
|
+
#
|
255
|
+
# @param [Xcodeproj::Project] project
|
256
|
+
# the xcodeproject that the app is in, and EarlGrey.framework will
|
257
|
+
# be added to.
|
258
|
+
# @param [Boolean] carthage
|
259
|
+
# if the project is carthage
|
260
|
+
def add_earlgrey_product(project, carthage)
|
271
261
|
framework_path = if carthage
|
272
|
-
|
262
|
+
CARTHAGE_FRAMEWORK_PATH
|
273
263
|
else
|
274
|
-
|
264
|
+
POD_FRAMEWORK_PATH
|
275
265
|
end
|
276
266
|
|
277
|
-
framework_ref =
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
framework_ref
|
282
|
-
|
283
|
-
|
267
|
+
framework_ref = project.products_group.files.find do |f|
|
268
|
+
# TODO: should have some md5 check on the actual binary
|
269
|
+
f.path == framework_path
|
270
|
+
end
|
271
|
+
unless framework_ref
|
272
|
+
framework_ref = project.products_group.new_file(framework_path)
|
273
|
+
framework_ref.source_tree = 'SRCROOT'
|
274
|
+
end
|
275
|
+
framework_ref
|
284
276
|
end
|
285
277
|
|
286
278
|
# Generates a copy files build phase to embed the EarlGrey framework into
|
287
279
|
# the app under test.
|
288
|
-
|
280
|
+
#
|
281
|
+
# @param [PBXNativeTarget] target
|
282
|
+
# the native target to add a copy script that copies the earlgrey
|
283
|
+
# framework into its host app
|
284
|
+
# @param [PBXFileReference] framework_ref
|
285
|
+
# the framework reference pointing to the EarlGrey.framework
|
286
|
+
def add_earlgrey_copy_files_script(target, framework_ref)
|
289
287
|
earlgrey_copy_files_phase_name = 'EarlGrey Copy Files'
|
290
|
-
|
291
|
-
|
292
|
-
if copy_files_phase.name == earlgrey_copy_files_phase_name
|
293
|
-
earlgrey_copy_files_exists = true
|
294
|
-
end
|
288
|
+
return true if target.copy_files_build_phases.any? do |copy_files_phase|
|
289
|
+
copy_files_phase.name == earlgrey_copy_files_phase_name
|
295
290
|
end
|
296
291
|
|
297
|
-
unless
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
new_copy_files_phase.dst_subfolder_spec = '0'
|
292
|
+
return false unless target.product_type.eql? UNITTEST_PRODUCTTYPE
|
293
|
+
new_copy_files_phase = target.new_copy_files_build_phase(earlgrey_copy_files_phase_name)
|
294
|
+
new_copy_files_phase.dst_path = '$(TEST_HOST)/../'
|
295
|
+
new_copy_files_phase.dst_subfolder_spec = '0'
|
302
296
|
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
user_project.save
|
307
|
-
end
|
297
|
+
build_file = new_copy_files_phase.add_file_reference framework_ref, true
|
298
|
+
build_file.settings = { 'ATTRIBUTES' => ['CodeSignOnCopy'] }
|
299
|
+
build_file
|
308
300
|
end
|
309
301
|
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
#
|
314
|
-
#
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
carthage_headers_ios = '$(SRCROOT)/Carthage/Build/iOS/**'
|
319
|
-
|
320
|
-
test_target.build_configurations.each do |config|
|
302
|
+
# Updates test target's build configuration framework and header search
|
303
|
+
# paths for carthage. Generates a copy files build phase to embed the
|
304
|
+
# EarlGrey framework into the app under test.
|
305
|
+
#
|
306
|
+
# @param [PBXNativeTarget] target
|
307
|
+
# @return [PBXNativeTarget] target
|
308
|
+
def add_carthage_search_paths(target)
|
309
|
+
target.build_configurations.each do |config|
|
321
310
|
settings = config.build_settings
|
322
311
|
settings[FRAMEWORK_SEARCH_PATHS] = Array(settings[FRAMEWORK_SEARCH_PATHS])
|
323
|
-
unless settings[FRAMEWORK_SEARCH_PATHS].include?(
|
324
|
-
settings[FRAMEWORK_SEARCH_PATHS] <<
|
312
|
+
unless settings[FRAMEWORK_SEARCH_PATHS].include?(CARTHAGE_BUILD_IOS)
|
313
|
+
settings[FRAMEWORK_SEARCH_PATHS] << CARTHAGE_BUILD_IOS
|
325
314
|
end
|
326
315
|
|
327
316
|
settings[HEADER_SEARCH_PATHS] = Array(settings[HEADER_SEARCH_PATHS])
|
328
|
-
unless settings[HEADER_SEARCH_PATHS].include?(
|
329
|
-
settings[HEADER_SEARCH_PATHS] <<
|
317
|
+
unless settings[HEADER_SEARCH_PATHS].include?(CARTHAGE_HEADERS_IOS)
|
318
|
+
settings[HEADER_SEARCH_PATHS] << CARTHAGE_HEADERS_IOS
|
330
319
|
end
|
331
320
|
end
|
321
|
+
target
|
322
|
+
end
|
332
323
|
|
333
|
-
|
324
|
+
# Add Carthage copy phase
|
325
|
+
#
|
326
|
+
# @param [PBXNativeTarget] target
|
327
|
+
def add_carthage_copy_phase(target)
|
328
|
+
shell_script_name = 'Carthage copy-frameworks Run Script'
|
329
|
+
target_names = target.shell_script_build_phases.map(&:name)
|
330
|
+
unless target_names.include?(shell_script_name)
|
331
|
+
shell_script = target.new_shell_script_build_phase shell_script_name
|
332
|
+
shell_script.shell_path = '/bin/bash'
|
333
|
+
shell_script.shell_script = '/usr/local/bin/carthage copy-frameworks'
|
334
|
+
shell_script.input_paths = [CARTHAGE_FRAMEWORK_PATH]
|
335
|
+
end
|
334
336
|
end
|
335
337
|
|
338
|
+
# Add EarlGrey.framework into the build phase "Link Binary With Libraries"
|
339
|
+
#
|
340
|
+
# @param [PBXNativeTarget] target
|
341
|
+
# @param [PBXFileReference] framework_ref
|
342
|
+
# the framework reference pointing to the EarlGrey.framework
|
343
|
+
def add_earlgrey_framework(target, framework_ref)
|
344
|
+
linked_frameworks = target.frameworks_build_phase.files.map(&:display_name)
|
345
|
+
unless linked_frameworks.include? EARLGREY_FRAMEWORK
|
346
|
+
target.frameworks_build_phase.add_file_reference framework_ref, true
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
# Check if the target contains a swift source file
|
351
|
+
# @param [PBXNativeTarget] target
|
352
|
+
# @return [Boolean]
|
353
|
+
# rubocop:disable Style/PredicateName
|
354
|
+
def has_swift?(target)
|
355
|
+
target.source_build_phase.files_references.any? do |ref|
|
356
|
+
SWIFT_FILETYPE == (ref.last_known_file_type || ref.explicit_file_type)
|
357
|
+
end
|
358
|
+
end
|
359
|
+
# rubocop:enable Style/PredicateName
|
360
|
+
|
336
361
|
# Copies EarlGrey.swift and adds it to the project.
|
337
|
-
#
|
338
|
-
# Adds EarlGrey.swift to testing target's source build phase
|
339
|
-
# Adds Link Binary With Libraries phase to test target for EarlGrey.framework
|
340
|
-
# Adds shell script phase that runs Carthage copy-frameworks
|
362
|
+
# No op if the target doesn't contain swift.
|
341
363
|
#
|
342
|
-
#
|
343
|
-
|
344
|
-
|
364
|
+
# @param [Xcodeproj::Project] project
|
365
|
+
# @param [PBXNativeTarget] target
|
366
|
+
def copy_swift_files(project, target, swift_version = nil)
|
367
|
+
return unless has_swift?(target) || !swift_version.nil?
|
345
368
|
|
369
|
+
project_test_targets = project.main_group.children
|
370
|
+
test_target_group = project_test_targets.find { |g| g.display_name == target.name }
|
371
|
+
|
372
|
+
raise "Test target group not found! #{test_target_group}" unless test_target_group
|
373
|
+
|
374
|
+
swift_version ||= '3.0'
|
346
375
|
src_root = File.join(__dir__, 'files')
|
347
|
-
dst_root =
|
376
|
+
dst_root = test_target_group.real_path
|
348
377
|
raise "Missing target folder #{dst_root}" unless File.exist? dst_root
|
349
378
|
|
350
379
|
src_swift_name = 'EarlGrey.swift'
|
@@ -355,10 +384,6 @@ module EarlGrey
|
|
355
384
|
|
356
385
|
FileUtils.copy src_swift, dst_swift
|
357
386
|
|
358
|
-
project_test_targets = user_project.main_group.children
|
359
|
-
test_target_group = project_test_targets.find { |g| g.display_name == test_target_name }
|
360
|
-
raise "Test target group not found! #{test_target_group}" unless test_target_group
|
361
|
-
|
362
387
|
# Add files to testing target group otherwise Xcode can't read them.
|
363
388
|
new_files = [src_swift_name]
|
364
389
|
existing_files = test_target_group.children.map(&:display_name)
|
@@ -369,30 +394,15 @@ module EarlGrey
|
|
369
394
|
end
|
370
395
|
|
371
396
|
# Add EarlGrey.swift to sources build phase
|
372
|
-
existing_sources =
|
397
|
+
existing_sources = target.source_build_phase.files.map(&:display_name)
|
373
398
|
unless existing_sources.include? src_swift_name
|
374
399
|
target_files = test_target_group.files
|
375
400
|
earlgrey_swift_file_ref = target_files.find { |f| f.display_name == src_swift_name }
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
# Link Binary With Libraries - frameworks_build_phase - Add EarlGrey.framework
|
381
|
-
earlgrey_framework = 'EarlGrey.framework'
|
382
|
-
existing_frameworks = test_target.frameworks_build_phase.files.map(&:display_name)
|
383
|
-
unless existing_frameworks.include? earlgrey_framework
|
384
|
-
framework_ref = add_earlgrey_product
|
385
|
-
# must pass 'true' to avoid duplicates
|
386
|
-
test_target.frameworks_build_phase.add_file_reference(framework_ref, true)
|
401
|
+
unless earlgrey_swift_file_ref
|
402
|
+
raise 'EarlGrey.swift not found in testing target'
|
403
|
+
end
|
404
|
+
target.source_build_phase.add_file_reference earlgrey_swift_file_ref, true
|
387
405
|
end
|
388
|
-
|
389
|
-
user_project.save
|
390
|
-
end
|
391
|
-
|
392
|
-
# Save the scheme changes. This is done here to prevent any irreversible changes in case
|
393
|
-
# of an exception being thrown.
|
394
|
-
def save_earlgrey_scheme_changes(scheme)
|
395
|
-
scheme.save!
|
396
406
|
end
|
397
407
|
end
|
398
408
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2017 Google Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
require_relative 'extensions/aggregate_target_extensions'
|
17
|
+
require_relative 'extensions/analyzer_extensions'
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2017 Google Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
require_relative '../configure_earlgrey'
|
17
|
+
|
18
|
+
module EarlGrey
|
19
|
+
module AggregateTargetExtensions
|
20
|
+
# rubocop:disable Style/PredicateName
|
21
|
+
def is_earlgrey?
|
22
|
+
@is_earlgrey ||= specs.any? { |spec| 'EarlGrey'.eql? spec.name }
|
23
|
+
end
|
24
|
+
# rubocop:enable Style/PredicateName
|
25
|
+
|
26
|
+
def schemes_for_native_targets
|
27
|
+
EarlGrey.schemes_for_native_targets user_project, user_targets
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
module Pod
|
33
|
+
class AggregateTarget
|
34
|
+
include EarlGrey::AggregateTargetExtensions
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2017 Google Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
require_relative '../configure_earlgrey'
|
17
|
+
require_relative 'aggregate_target_extensions'
|
18
|
+
|
19
|
+
module EarlGrey
|
20
|
+
module AnalyzerExtension
|
21
|
+
def analyze(*_)
|
22
|
+
result = super
|
23
|
+
eg_targets = result.targets.select(&:is_earlgrey?).each do |target|
|
24
|
+
target.user_targets.each do |native_target|
|
25
|
+
EarlGrey.copy_swift_files(target.user_project, native_target,
|
26
|
+
target.target_definition.swift_version)
|
27
|
+
|
28
|
+
framework_ref = EarlGrey.add_earlgrey_product target.user_project, false
|
29
|
+
EarlGrey.add_earlgrey_copy_files_script native_target, framework_ref
|
30
|
+
EarlGrey.add_earlgrey_framework native_target, framework_ref
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
schemes = eg_targets.map(&:schemes_for_native_targets).flatten(1).uniq do |name, _|
|
35
|
+
name
|
36
|
+
end
|
37
|
+
schemes.each do |name, scheme|
|
38
|
+
EarlGrey.add_environment_variables_to_test_scheme(name, scheme)
|
39
|
+
end
|
40
|
+
result
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module Pod
|
46
|
+
class Installer
|
47
|
+
class Analyzer
|
48
|
+
prepend EarlGrey::AnalyzerExtension
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/earlgrey/version.rb
CHANGED
metadata
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: earlgrey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- khandpur
|
8
8
|
- tirodkar
|
9
9
|
- bootstraponline
|
10
|
+
- wuhao5
|
10
11
|
autorequire:
|
11
12
|
bindir: bin
|
12
13
|
cert_chain: []
|
13
|
-
date: 2017-03-
|
14
|
+
date: 2017-03-30 00:00:00.000000000 Z
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
17
|
name: colored
|
@@ -82,20 +83,6 @@ dependencies:
|
|
82
83
|
- - ">="
|
83
84
|
- !ruby/object:Gem::Version
|
84
85
|
version: 0.39.0
|
85
|
-
- !ruby/object:Gem::Dependency
|
86
|
-
name: coveralls
|
87
|
-
requirement: !ruby/object:Gem::Requirement
|
88
|
-
requirements:
|
89
|
-
- - "~>"
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
version: 0.8.13
|
92
|
-
type: :development
|
93
|
-
prerelease: false
|
94
|
-
version_requirements: !ruby/object:Gem::Requirement
|
95
|
-
requirements:
|
96
|
-
- - "~>"
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
version: 0.8.13
|
99
86
|
- !ruby/object:Gem::Dependency
|
100
87
|
name: pry
|
101
88
|
requirement: !ruby/object:Gem::Requirement
|
@@ -132,10 +119,13 @@ extensions: []
|
|
132
119
|
extra_rdoc_files: []
|
133
120
|
files:
|
134
121
|
- bin/earlgrey
|
122
|
+
- lib/cocoapods_plugin.rb
|
135
123
|
- lib/earlgrey.rb
|
136
124
|
- lib/earlgrey/cli.rb
|
137
125
|
- lib/earlgrey/configure_earlgrey.rb
|
138
|
-
- lib/earlgrey/
|
126
|
+
- lib/earlgrey/extensions.rb
|
127
|
+
- lib/earlgrey/extensions/aggregate_target_extensions.rb
|
128
|
+
- lib/earlgrey/extensions/analyzer_extensions.rb
|
139
129
|
- lib/earlgrey/files/Swift-2.3/EarlGrey.swift
|
140
130
|
- lib/earlgrey/files/Swift-3.0/EarlGrey.swift
|
141
131
|
- lib/earlgrey/version.rb
|
@@ -159,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
149
|
version: '0'
|
160
150
|
requirements: []
|
161
151
|
rubyforge_project:
|
162
|
-
rubygems_version: 2.6.
|
152
|
+
rubygems_version: 2.6.11
|
163
153
|
signing_key:
|
164
154
|
specification_version: 4
|
165
155
|
summary: EarlGrey installer gem
|