run_loop 2.0.7 → 2.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 48c1c78396cdf8d493ce6d242d09b2a36884fe5e
4
- data.tar.gz: 83cfc779ce7803e4deae06af1bc7a3a55a299310
3
+ metadata.gz: a796cf1b151815127a2c4ee38c6fadf13be9cef8
4
+ data.tar.gz: 40e6b8e223325fba4d2a13683afa1609b2f9348c
5
5
  SHA512:
6
- metadata.gz: 2acc78eed572c025036a5e168b592c0ea00c2ca53cfb8562118a6e603052eccde496fd262ed1c9cb0ab2a1cbefb2d35a306829c8e7725bfc51842c404f172599
7
- data.tar.gz: 6d0a90bf5529840121434d05ec23948bd0cc50a1be2fa5bf6616d4748154b479e8e1eff07bc7cf35447610a43805649b4a32e3ee76f987a057052bfbf8f1bf44
6
+ metadata.gz: d0b6d5bb57703550c6592a5d665c1d11d74db9075bf8b688156e2f6094efd6ab0e3efc72c19e9080228f1da8d003f8d115382f804303228a091d05043d3a7309
7
+ data.tar.gz: 8b53742a9c3b4fe65036f387e93dd189ff350e57bd24ebd90bb7c24e1f6635543a675aafb9500bdf34b92640d61ed6adb5c8eb81e9c9833fcab2f6588d28d7a7
@@ -17,6 +17,10 @@ require 'run_loop/plist_buddy'
17
17
  require "run_loop/codesign"
18
18
  require 'run_loop/app'
19
19
  require 'run_loop/ipa'
20
+ require "run_loop/detect_aut/errors"
21
+ require "run_loop/detect_aut/xamarin_studio"
22
+ require "run_loop/detect_aut/xcode"
23
+ require "run_loop/detect_aut/detect"
20
24
  require 'run_loop/sim_control'
21
25
  require 'run_loop/device'
22
26
  require 'run_loop/instruments'
@@ -25,7 +25,8 @@ Bundle must:
25
25
 
26
26
  1. be a directory that exists,
27
27
  2. have a .app extension,
28
- 3. and contain an Info.plist.
28
+ 3. contain an Info.plist,
29
+ 4. and the app binary (CFBundleExecutable) must exist
29
30
  }
30
31
  end
31
32
  end
@@ -49,10 +50,12 @@ Bundle must:
49
50
  def self.valid?(app_bundle_path)
50
51
  return false if app_bundle_path.nil?
51
52
 
52
- File.exist?(app_bundle_path) &&
53
- File.directory?(app_bundle_path) &&
54
- File.extname(app_bundle_path) == '.app' &&
55
- File.exist?(File.join(app_bundle_path, "Info.plist"))
53
+ return false if !File.directory?(app_bundle_path)
54
+ return false if !File.extname(app_bundle_path) == ".app"
55
+
56
+ return false if !self.info_plist_exist?(app_bundle_path)
57
+ return false if !self.executable_file_exist?(app_bundle_path)
58
+ true
56
59
  end
57
60
 
58
61
  # Returns the Info.plist path.
@@ -66,7 +69,7 @@ Bundle must:
66
69
  # @raise [RuntimeError] If the plist cannot be read or the
67
70
  # CFBundleIdentifier is empty or does not exist.
68
71
  def bundle_identifier
69
- identifier = plist_buddy.plist_read('CFBundleIdentifier', info_plist_path)
72
+ identifier = plist_buddy.plist_read("CFBundleIdentifier", info_plist_path)
70
73
  unless identifier
71
74
  raise "Expected key 'CFBundleIdentifier' in '#{info_plist_path}'"
72
75
  end
@@ -78,11 +81,28 @@ Bundle must:
78
81
  # @raise [RuntimeError] If the plist cannot be read or the
79
82
  # CFBundleExecutable is empty or does not exist.
80
83
  def executable_name
81
- identifier = plist_buddy.plist_read('CFBundleExecutable', info_plist_path)
82
- unless identifier
84
+ name = plist_buddy.plist_read("CFBundleExecutable", info_plist_path)
85
+ unless name
83
86
  raise "Expected key 'CFBundleExecutable' in '#{info_plist_path}'"
84
87
  end
85
- identifier
88
+ name
89
+ end
90
+
91
+ # Returns the arches for the binary.
92
+ def arches
93
+ @arches ||= lipo.info
94
+ end
95
+
96
+ # True if the app has been built for the simulator
97
+ def simulator?
98
+ arches.include?("i386") || arches.include?("x86_64")
99
+ end
100
+
101
+ # True if the app has been built for physical devices
102
+ def physical_device?
103
+ arches.any? do |arch|
104
+ arch[/arm/, 0]
105
+ end
86
106
  end
87
107
 
88
108
  # Inspects the app's file for the server version
@@ -115,7 +135,6 @@ Bundle must:
115
135
  def executables
116
136
  executables = []
117
137
  Dir.glob("#{path}/**/*") do |file|
118
- next if File.directory?(file)
119
138
  next if skip_executable_check?(file)
120
139
  if otool(file).executable?
121
140
  executables << file
@@ -131,6 +150,30 @@ Bundle must:
131
150
 
132
151
  private
133
152
 
153
+ # @!visibility private
154
+ def self.info_plist_exist?(app_bundle_path)
155
+ info_plist = File.join(app_bundle_path, "Info.plist")
156
+ File.exist?(info_plist)
157
+ end
158
+
159
+ # @!visibility private
160
+ def self.executable_file_exist?(app_bundle_path)
161
+ return false if !self.info_plist_exist?(app_bundle_path)
162
+ info_plist = File.join(app_bundle_path, "Info.plist")
163
+ pbuddy = RunLoop::PlistBuddy.new
164
+ name = pbuddy.plist_read("CFBundleExecutable", info_plist)
165
+ if name
166
+ File.exist?(File.join(app_bundle_path, name))
167
+ else
168
+ false
169
+ end
170
+ end
171
+
172
+ # @!visibility private
173
+ def lipo
174
+ @lipo ||= RunLoop::Lipo.new(path)
175
+ end
176
+
134
177
  # @!visibility private
135
178
  def plist_buddy
136
179
  @plist_buddy ||= RunLoop::PlistBuddy.new
@@ -150,17 +193,20 @@ Bundle must:
150
193
 
151
194
  # @!visibility private
152
195
  def skip_executable_check?(file)
153
- image?(file) ||
196
+ File.directory?(file) ||
197
+ image?(file) ||
154
198
  text?(file) ||
155
199
  plist?(file) ||
156
200
  lproj_asset?(file) ||
157
201
  code_signing_asset?(file) ||
158
- core_data_asset?(file)
202
+ core_data_asset?(file) ||
203
+ font?(file)
159
204
  end
160
205
 
161
206
  # @!visibility private
162
207
  def text?(file)
163
208
  extension = File.extname(file)
209
+ filename = File.basename(file)
164
210
 
165
211
  extension == ".txt" ||
166
212
  extension == ".md" ||
@@ -170,12 +216,25 @@ Bundle must:
170
216
  extension == ".yaml" ||
171
217
  extension == ".yml" ||
172
218
  extension == ".rtf" ||
173
- file[/NOTICE|LICENSE|README|ABOUT/, 0]
219
+
220
+ ["NOTICE", "LICENSE", "README", "ABOUT"].any? do |elm|
221
+ filename[/#{elm}/]
222
+ end
174
223
  end
175
224
 
176
225
  # @!visibility private
177
226
  def image?(file)
178
- file[/jpeg|jpg|gif|png|tiff|svg|pdf|car|iTunesArtwork/, 0]
227
+ extension = File.extname(file)
228
+
229
+ extension == ".jpeg" ||
230
+ extension == ".jpg" ||
231
+ extension == ".gif" ||
232
+ extension == ".png" ||
233
+ extension == ".tiff" ||
234
+ extension == ".svg" ||
235
+ extension == ".pdf" ||
236
+ extension == ".car" ||
237
+ file[/iTunesArtwork/, 0]
179
238
  end
180
239
 
181
240
  # @!visibility private
@@ -186,9 +245,11 @@ Bundle must:
186
245
  # @!visibility private
187
246
  def lproj_asset?(file)
188
247
  extension = File.extname(file)
248
+ dir_extension = File.extname(File.dirname(file))
189
249
 
190
- file[/lproj/, 0] ||
191
- file[/storyboard/, 0] ||
250
+ dir_extension == ".lproj" ||
251
+ dir_extension == ".storyboard" ||
252
+ dir_extension == ".storyboardc" ||
192
253
  extension == ".strings" ||
193
254
  extension == ".xib" ||
194
255
  extension == ".nib"
@@ -198,21 +259,31 @@ Bundle must:
198
259
  def code_signing_asset?(file)
199
260
  name = File.basename(file)
200
261
  extension = File.extname(file)
262
+ dirname = File.basename(File.dirname(file))
201
263
 
202
264
  name == "PkgInfo" ||
203
265
  name == "embedded" ||
204
266
  extension == ".mobileprovision" ||
205
267
  extension == ".xcent" ||
206
- file[/_CodeSignature/, 0]
268
+ dirname == "_CodeSignature"
207
269
  end
208
270
 
209
271
  # @!visibility private
210
272
  def core_data_asset?(file)
211
273
  extension = File.extname(file)
274
+ dir_extension = File.extname(File.dirname(file))
212
275
 
213
- file[/momd/, 0] ||
276
+ dir_extension == ".momd" ||
214
277
  extension == ".mom" ||
215
- extension == ".db"
278
+ extension == ".db" ||
279
+ extension == ".omo"
280
+ end
281
+
282
+ # @!visibility private
283
+ def font?(file)
284
+ extension = File.extname(file)
285
+
286
+ extension == ".tff" || extension == ".otf"
216
287
  end
217
288
  end
218
289
  end
@@ -0,0 +1,96 @@
1
+ module RunLoop
2
+
3
+ # @!visibility private
4
+ module DetectAUT
5
+
6
+ # @!visibility private
7
+ class Detect
8
+ include RunLoop::DetectAUT::Errors
9
+ include RunLoop::DetectAUT::XamarinStudio
10
+ include RunLoop::DetectAUT::Xcode
11
+
12
+ # @!visibility private
13
+ def app_for_simulator
14
+ path = RunLoop::Environment.path_to_app_bundle
15
+ return RunLoop::App.new(path) if path
16
+
17
+ if xcode_project?
18
+ apps, search_dirs = detect_xcode_apps
19
+ elsif xamarin_project?
20
+ search_dirs = [solution_directory]
21
+ apps = candidate_apps(search_dirs.first)
22
+ else
23
+ apps = []
24
+ search_dirs = []
25
+ end
26
+
27
+ # If this is a Xamarin project, we've already searched the local
28
+ # directory tree for .app.
29
+ if apps.empty? && !xamarin_project?
30
+ search_dirs << File.expand_path("./")
31
+ apps = candidate_apps(File.expand_path("./"))
32
+ end
33
+
34
+ if apps.empty?
35
+ raise_no_simulator_app_found(search_dirs)
36
+ end
37
+
38
+ app = select_most_recent_app(apps)
39
+
40
+ RunLoop.log_info2("Detected app at path:")
41
+ RunLoop.log_info2("#{app.path}")
42
+ time_str = mtime(app).strftime("%a %d %b %Y %H:%M:%S %Z")
43
+ RunLoop.log_info2("Modification time of app: #{time_str}")
44
+ RunLoop.log_info2("If this is incorrect, set the APP variable and/or rebuild your app")
45
+ RunLoop.log_info2("It is your responsibility to ensure you are testing the right app.")
46
+
47
+ app
48
+ end
49
+
50
+ # @!visibility private
51
+ # @param [Array<RunLoop::Detect>] apps
52
+ def select_most_recent_app(apps)
53
+ apps.max do |a, b|
54
+ mtime(a).to_i <=> mtime(b).to_i
55
+ end
56
+ end
57
+
58
+ # @!visibility private
59
+ # @param [String] bundle_path
60
+ def app_with_bundle(bundle_path)
61
+ RunLoop::App.new(bundle_path)
62
+ end
63
+
64
+ # @!visibility private
65
+ # @param [String] base_dir where to start the recursive search
66
+ def candidate_apps(base_dir)
67
+ candidates = []
68
+ Dir.glob("#{base_dir}/**/*.app").each do |bundle_path|
69
+ app = app_or_nil(bundle_path)
70
+ candidates << app if app
71
+ end
72
+ candidates
73
+ end
74
+
75
+ # @!visibility private
76
+ # @param [String] bundle_path path to .app
77
+ def app_or_nil(bundle_path)
78
+ return nil if !RunLoop::App.valid?(bundle_path)
79
+
80
+ app = app_with_bundle(bundle_path)
81
+ if app.simulator? && app.calabash_server_version
82
+ app
83
+ else
84
+ nil
85
+ end
86
+ end
87
+
88
+ # @!visibility private
89
+ # @param [RunLoop::Detect] app
90
+ def mtime(app)
91
+ path = File.join(app.path, app.executable_name)
92
+ File.mtime(path)
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,127 @@
1
+ module RunLoop
2
+
3
+ # @!visibility private
4
+ class SolutionMissingError < RuntimeError ; end
5
+
6
+ # @!visibility private
7
+ class XcodeprojMissingError < RuntimeError; end
8
+
9
+ # @!visibility private
10
+ class MultipleXcodeprojError < RuntimeError; end
11
+
12
+ # @!visibility private
13
+ class NoSimulatorAppFoundError < RuntimeError; end
14
+
15
+ # @!visibility private
16
+ module DetectAUT
17
+
18
+ # @!visibility private
19
+ module Errors
20
+
21
+ # @!visibility private
22
+ #
23
+ # Raised when XCODEPROJ is defined, but does not exist
24
+ def raise_xcodeproj_missing(xcodeproj)
25
+ raise RunLoop::XcodeprojMissingError,
26
+ %Q[The XCODEPROJ environment variable has been set to:
27
+
28
+ #{xcodeproj}
29
+
30
+ but no directory exists at that path.
31
+
32
+ You should only set XCODEPROJ variable if your Calabash project has more than
33
+ one .xcodeproj directory or your .xcodeproj directory is located above the
34
+ current directory (where you run `cucumber` from). Calabash will discover the
35
+ .xcodeproj if is below the current working directory.
36
+
37
+ # .xcodeproj is above the working directory
38
+ $ ls ../*.xcodeproj
39
+ MyApp.xcodeproj
40
+
41
+ $ XCODEPROJ=../*.xcodeproj cucumber
42
+
43
+ # There is more than one .xcodeproj
44
+ $ ls *.xcodeproj
45
+ MyiOSApp.xcodeproj
46
+ MyMacApp.xcodeproj
47
+
48
+ $ XCODEPROJ=MyiOSApp.xcodeproj
49
+ ]
50
+ end
51
+
52
+ # @!visibility private
53
+ #
54
+ # Raised when there are more than > 1 .xcodeproj in **/*
55
+ # Is not raised when there are 0 .xcodeproj in **/*
56
+ #
57
+ # @param [Array<String>] projects a list of paths to .xcodeproj
58
+ def raise_multiple_xcodeproj(projects)
59
+ raise RunLoop::MultipleXcodeprojError,
60
+ %Q[Found multiple .xcodeproj directories:
61
+
62
+ #{projects.each { |path| puts " #{path}" }}
63
+
64
+ Which project contains the target of the application you are trying to test?
65
+
66
+ Set the XCODEPROJ variable to specify the correct .xcodeproj directory.
67
+
68
+ # Examples
69
+ $ XCODEPROJ="../MyApp.xcodeproj" cucumber
70
+ $ XCODEPROJ="iOS/MyApp.xcodeproj" cucumber
71
+ ]
72
+ end
73
+
74
+ # @!visibility private
75
+ #
76
+ # Raised when SOLUTION is defined but does not exist
77
+ def raise_solution_missing(solution)
78
+ raise RunLoop::SolutionMissingError,
79
+ %Q[The SOLUTION environment variable has been set to:
80
+
81
+ #{solution}
82
+
83
+ but no solution exists at that path.
84
+
85
+ You should only set SOLUTION variable if your .sln is not located in
86
+ the current directory or in the directory just above the current
87
+ directory (where you run `cucumber` from). Calabash will discover the
88
+ .snl if it is in the current working directory or the directory just
89
+ above.
90
+
91
+ # Calabash will discover solution - don't set SOLUTION
92
+ $ ls *.sln => MyApp.sln
93
+ $ ls ../*.sln => MyApp.sln
94
+
95
+ # Calabash will _not_ discover solution
96
+ $ ls ../../*.sln => MyApp.sln
97
+ $ SOLUTION=../../MyApp.sln cucumber
98
+
99
+ $ ls project/*.sln => MyApp.sln
100
+ $ SOLUTION=project/MyApp.sln cucumber
101
+
102
+ $ ls ~/some/other/directory/*.sln => MyApp.sln
103
+ $ SOLUTION=~/some/other/directory/MyApp.sln
104
+ ]
105
+ end
106
+
107
+ # @!visibility private
108
+ # Raised when no app can found by the discovery algorithm
109
+ def raise_no_simulator_app_found(search_directories)
110
+ raise RunLoop::NoSimulatorAppFoundError,
111
+ %Q[Searched these directories:
112
+
113
+ #{search_directories.each { |path| puts " #{path}" }}
114
+
115
+ but could not find any .app for the simulator that contains the Calabash iOS
116
+ server.
117
+
118
+ Make sure you have built your app for a simulator target from Xcode.
119
+
120
+ If you testing a stand-alone .app (you don't have an Xcode project), put your
121
+ .app in the same directory (or below) the directory you run `cucumber` from.
122
+ ]
123
+ end
124
+ end
125
+ end
126
+ end
127
+
@@ -0,0 +1,46 @@
1
+ module RunLoop
2
+ # @!visibility private
3
+ module DetectAUT
4
+
5
+ # @!visibility private
6
+ module XamarinStudio
7
+
8
+ # @!visibility private
9
+ def xamarin_project?
10
+ solution_directory != nil
11
+ end
12
+
13
+ # @!visibility private
14
+ def solution_directory
15
+ solution = RunLoop::Environment.solution
16
+
17
+ if solution && !File.exist?(solution)
18
+ raise_solution_missing(solution)
19
+ end
20
+
21
+ # SOLUTION defined and exists
22
+ return File.dirname(solution) if solution
23
+
24
+ solution_dir = find_solution_directory
25
+ return nil if solution_dir.nil?
26
+
27
+ solution_dir
28
+ end
29
+
30
+ # @!visibility private
31
+ def find_solution_directory
32
+ pwd = Dir.pwd
33
+ solutions = Dir.glob("#{pwd}/*.sln")
34
+
35
+ if solutions.empty?
36
+ solutions = Dir.glob("#{pwd}/../*.sln")
37
+ end
38
+
39
+ return nil if solutions.empty?
40
+
41
+ File.expand_path(File.dirname(solutions.first))
42
+ end
43
+ end
44
+ end
45
+ end
46
+
@@ -0,0 +1,136 @@
1
+ module RunLoop
2
+ # @!visibility private
3
+ module DetectAUT
4
+ # @!visibility private
5
+ module Xcode
6
+
7
+ # @!visibility private
8
+ def xcode_project?
9
+ xcodeproj != nil
10
+ end
11
+
12
+ # @!visibility private
13
+ def xcodeproj
14
+ xcodeproj = RunLoop::Environment.xcodeproj
15
+
16
+ if xcodeproj && !File.directory?(xcodeproj)
17
+ raise_xcodeproj_missing(xcodeproj)
18
+ end
19
+
20
+ # XCODEPROJ defined and exists
21
+ return xcodeproj if xcodeproj
22
+
23
+ projects = find_xcodeproj
24
+
25
+ return nil if projects.empty?
26
+ return projects[0] if projects.count == 1
27
+
28
+ raise_multiple_xcodeproj(projects)
29
+ end
30
+
31
+ # @!visibility private
32
+ def find_xcodeproj
33
+ Dir.glob("#{Dir.pwd}/**/*.xcodeproj")
34
+ end
35
+
36
+ # @!visibility private
37
+ def detect_xcode_apps
38
+ dirs_to_search = derived_data_search_dirs
39
+
40
+ dir_from_prefs = xcode_preferences_search_dir
41
+ if dir_from_prefs
42
+ dirs_to_search << dir_from_prefs
43
+ end
44
+
45
+ apps = []
46
+ dirs_to_search.each do |dir|
47
+ # defined in detect_aut/apps.rb
48
+ candidates = candidate_apps(dir)
49
+ apps = apps.concat(candidates)
50
+ end
51
+
52
+ return apps, dirs_to_search
53
+ end
54
+
55
+ # @!visibility private
56
+ PLIST_KEYS = {
57
+ :workspace => "WorkspacePath",
58
+ :shared_build => "IDESharedBuildFolderName",
59
+ :custom_build => "IDECustomBuildProductsPath"
60
+ }
61
+
62
+ # @!visibility private
63
+ # TODO Needs unit tests
64
+ def derived_data_search_dirs
65
+ project = xcodeproj
66
+ project_name = File.basename(project)
67
+ matches = []
68
+
69
+ # WorkspacePath could be a .xcodeproj or .xcworkspace
70
+ #
71
+ # # Exact match.
72
+ # xcodeproj = path/to/MyApp/MyApp.xcodeproj
73
+ # WorkspacePath = path/to/MyApp/MyApp.xcodeproj
74
+ #
75
+ # # CocoaPods projects are often configured like this. As are legacy
76
+ # # projects that have been added to a new workspace.
77
+ # xcodeproj = path/to/MyApp/MyApp.xcodeproj
78
+ # WorkspacePath = path/to/MyApp/MyApp.xcworkspace
79
+ #
80
+ # # This is the Xcode default when creating new iOS project
81
+ # xcodeproj = path/to/MyApp/MyApp/MyApp.xcodeproj
82
+ # WorkspacePath = path/to/MyApp/MyApp.xcworkspace
83
+ key = PLIST_KEYS[:workspace]
84
+ Dir.glob("#{derived_data}/*/info.plist") do |plist|
85
+ workspace = pbuddy.plist_read(key, plist)
86
+ if workspace == project
87
+ matches << File.dirname(plist)
88
+ else
89
+ base_dir = File.dirname(workspace)
90
+ if File.exist?(File.join(base_dir, project_name))
91
+ matches << File.dirname(plist)
92
+ elsif !Dir.glob("#{File.dirname(workspace)}/*/#{project_name}").empty?
93
+ matches << File.dirname(plist)
94
+ elsif !Dir.glob("#{File.dirname(workspace)}/**/#{project_name}").empty?
95
+ matches << File.dirname(plist)
96
+ end
97
+ end
98
+ end
99
+ matches
100
+ end
101
+
102
+ # @!visibility private
103
+ def xcode_preferences_search_dir
104
+ plist = xcode_preferences_plist
105
+
106
+ shared_build_folder = pbuddy.plist_read(PLIST_KEYS[:shared_build], plist)
107
+ custom_build_folder = pbuddy.plist_read(PLIST_KEYS[:custom_build], plist)
108
+
109
+ if shared_build_folder
110
+ File.join(derived_data, shared_build_folder, "Products")
111
+ elsif custom_build_folder
112
+ File.join(File.dirname(xcodeproj), custom_build_folder)
113
+ else
114
+ nil
115
+ end
116
+ end
117
+
118
+ # @!visibility private
119
+ def derived_data
120
+ RunLoop::Environment.derived_data ||
121
+ File.expand_path("~/Library/Developer/Xcode/DerivedData")
122
+ end
123
+
124
+ # @!visibility private
125
+ def xcode_preferences_plist
126
+ File.expand_path('~/Library/Preferences/com.apple.dt.Xcode.plist')
127
+ end
128
+
129
+ # @!visibility private
130
+ def pbuddy
131
+ @pbuddy ||= RunLoop::PlistBuddy.new
132
+ end
133
+ end
134
+ end
135
+ end
136
+
@@ -38,6 +38,49 @@ module RunLoop
38
38
  ENV["DEVICE_ENDPOINT"]
39
39
  end
40
40
 
41
+ # Returns the value of XCODEPROJ which can be used to specify an Xcode
42
+ # project directory (my.xcodeproj).
43
+ #
44
+ # This is useful if your project has multiple xcodeproj directories.
45
+ #
46
+ # Most users should not set this variable.
47
+ def self.xcodeproj
48
+ value = ENV["XCODEPROJ"]
49
+ if value.nil? || value == ""
50
+ return nil
51
+ else
52
+ File.expand_path(value)
53
+ end
54
+ end
55
+
56
+ # Returns the value of DERIVED_DATA which can be used to specify an
57
+ # alternative DerivedData directory.
58
+ #
59
+ # The default is ~/Library/Xcode/DerivedData, but Xcode allows you to
60
+ # change this value.
61
+ def self.derived_data
62
+ value = ENV["DERIVED_DATA"]
63
+ if value.nil? || value == ""
64
+ nil
65
+ else
66
+ File.expand_path(value)
67
+ end
68
+ end
69
+
70
+ # Returns the value of SOLUTION which can be used to specify a
71
+ # Xamarin Studio .sln
72
+ #
73
+ # This is useful if your project has multiple solutions (.sln)
74
+ # and Calabash cannot detect the correct one.
75
+ def self.solution
76
+ value = ENV["SOLUTION"]
77
+ if value.nil? || value == ""
78
+ nil
79
+ else
80
+ File.expand_path(value)
81
+ end
82
+ end
83
+
41
84
  # Returns the value of TRACE_TEMPLATE; the Instruments template to use
42
85
  # during testing.
43
86
  def self.trace_template
@@ -45,6 +45,11 @@ module RunLoop
45
45
  app.executable_name
46
46
  end
47
47
 
48
+ # Returns the arches for the binary.
49
+ def arches
50
+ app.arches
51
+ end
52
+
48
53
  # Inspects the app's executables for the server version
49
54
  # @return[RunLoop::Version] a version instance
50
55
  def calabash_server_version
@@ -42,7 +42,7 @@ must exist and not be a directory.
42
42
  # @!visibility private
43
43
  def arch_info
44
44
  args = ["otool", "-hv", "-arch", "all", path]
45
- opts = { :log_cmd => true }
45
+ opts = { :log_cmd => false }
46
46
 
47
47
  hash = xcrun.exec(args, opts)
48
48
 
@@ -1,5 +1,5 @@
1
1
  module RunLoop
2
- VERSION = "2.0.7"
2
+ VERSION = "2.0.8"
3
3
 
4
4
  # A model of a software release version that can be used to compare two versions.
5
5
  #
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: run_loop
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.7
4
+ version: 2.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karl Krukow
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-26 00:00:00.000000000 Z
11
+ date: 2016-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -296,6 +296,10 @@ files:
296
296
  - lib/run_loop/codesign.rb
297
297
  - lib/run_loop/core.rb
298
298
  - lib/run_loop/core_simulator.rb
299
+ - lib/run_loop/detect_aut/detect.rb
300
+ - lib/run_loop/detect_aut/errors.rb
301
+ - lib/run_loop/detect_aut/xamarin_studio.rb
302
+ - lib/run_loop/detect_aut/xcode.rb
299
303
  - lib/run_loop/device.rb
300
304
  - lib/run_loop/directory.rb
301
305
  - lib/run_loop/dot_dir.rb
@@ -369,3 +373,4 @@ specification_version: 4
369
373
  summary: The bridge between Calabash iOS and Xcode command-line tools like instruments
370
374
  and simctl.
371
375
  test_files: []
376
+ has_rdoc: