motion-calabash 0.9.160 → 0.9.160.1

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: 07ff3173195fcb90b6bbdb65c00f103b6e979217
4
- data.tar.gz: 9b43761b1815806bed83478b4f47666811cc4781
3
+ metadata.gz: 69d5a5633079bf4dcf584074416372d824c24f65
4
+ data.tar.gz: d0ecfba809c637c9e761f4b3b46ec3991ce3ecaa
5
5
  SHA512:
6
- metadata.gz: 745ea9c67c0f2eacf0f015af8500560a1c3e305593d9ab12d8bd3c06444d709de7beb12bd7415d84821042c72482b61219d0bd412cd18aeae61c1b1ca2b5f988
7
- data.tar.gz: 9b9b4bf0708dcd35136068ce5cbec7c8ebbaf2efc64e3280048771a2a68aefe7b7dffadd91420a800c77e21f14f8e1cb15b898124c7001a66911de631511a111
6
+ metadata.gz: 4e52523aa8e0a00c000c216cf3cc7aadf9e4b992b9cc570fbe35776ed7cf5f8e0b882832d5b37d697e228da2a6b3fb1ecd111a41db71efd786c8de5901c7a39b
7
+ data.tar.gz: 65a209bedd6949f609933f99380b3a8f48cb8ab73a0a2dd6ce1608c6b8b7cee9679b6999c0b38b9dcae45f9f5714566ad1295ed5b6de199cdb851f6da03ddc2f
@@ -34,7 +34,7 @@ namespace 'calabash' do
34
34
 
35
35
  # Retrieve optional Calabash args.
36
36
  def gather_calabash_env
37
- sdk = ENV['target'] || ENV['sdk'] || ENV['SDK_VERSION'] || "6.1" #Calabash env vars
37
+ sdk = ENV['target'] || ENV['sdk'] || ENV['SDK_VERSION'] || "7.0" #Calabash env vars
38
38
  major = sdk[0]
39
39
  os = ENV['os'] || ENV['OS']
40
40
  if os.nil?
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
7
7
  s.author = 'Karl Krukow'
8
8
  s.email = 'karl.krukow@xamarin.com'
9
9
  s.homepage = 'http://www.xamarin.com'
10
- s.version = '0.9.160'
10
+ s.version = '0.9.160.1'
11
11
  s.summary = %q{Calabash support for RubyMotion}
12
12
  s.description = %q{This linkes-in calabash for iOS}
13
13
  s.files = ["lib/framework/libcalabashuni-0.9.160.a"].concat(`git ls-files`.split("\n"))
@@ -23,36 +23,59 @@
23
23
 
24
24
  require 'calabash-cucumber/launch/simulator_helper'
25
25
  require 'sim_launcher'
26
+ require 'calabash-cucumber/device'
26
27
  require 'run_loop'
28
+ require 'cfpropertylist'
27
29
 
28
- # Uncomment and replace ?? appropriately
29
- # This should point to your Simulator build
30
- # which includes calabash framework
31
- # this is usually the Calabash build configuration
32
- # of your production target.
33
- #APP_BUNDLE_PATH = "~/Library/Developer/Xcode/DerivedData/??/Build/Products/Calabash-iphonesimulator/??.app"
34
- #
30
+ class Calabash::Cucumber::Launcher
31
+ attr_accessor :run_loop
32
+ attr_accessor :device
33
+ attr_accessor :launch_args
35
34
 
35
+ @@launcher = nil
36
36
 
37
- def calabash_no_stop?
38
- ENV['NO_LAUNCH']=="1" or ENV['NO_STOP']=="1"
39
- end
37
+ class StartError < RuntimeError
38
+ attr_accessor :error
40
39
 
41
- def device_target?
42
- ENV['DEVICE_TARGET'] == 'device'
43
- end
40
+ def initialize(err)
41
+ self.error= err
42
+ end
44
43
 
44
+ def to_s
45
+ "#{super.to_s}: #{error}"
46
+ end
47
+ end
45
48
 
46
- class MotionLauncherTimeoutErr < Timeout::Error
47
- end
49
+ class CalabashLauncherTimeoutErr < Timeout::Error
50
+ end
48
51
 
49
- class MotionLauncher
50
- attr_accessor :run_loop
52
+ def self.launcher
53
+ @@launcher ||= Launcher.new
54
+ end
51
55
 
52
- def reset_app_jail(sdk, app_path)
53
- return if device_target?
56
+ def self.launcher_if_used
57
+ @@launcher
58
+ end
59
+
60
+ def initialize
61
+ @@launcher = self
62
+ end
63
+
64
+ def ios_major_version
65
+ return nil if device.nil? or device.ios_version.nil?
66
+ device.ios_major_version
67
+ end
68
+
69
+ def ios_version
70
+ return nil if device.nil?
71
+ device.ios_version
72
+ end
54
73
 
55
- app = File.basename(app_path)
74
+ def reset_app_jail(sdk=nil, path=nil)
75
+ sdk ||= sdk_version || SimLauncher::SdkDetector.new().latest_sdk_version
76
+ path ||= Calabash::Cucumber::SimulatorHelper.app_bundle_or_raise(app_path)
77
+
78
+ app = File.basename(path)
56
79
  bundle = `find "#{ENV['HOME']}/Library/Application Support/iPhone Simulator/#{sdk}/Applications/" -type d -depth 2 -name "#{app}" | head -n 1`
57
80
  return if bundle.empty? # Assuming we're already clean
58
81
 
@@ -62,22 +85,172 @@ class MotionLauncher
62
85
  end
63
86
  end
64
87
 
65
- def relaunch(args=nil)
66
- if run_loop
67
- RunLoop.stop(run_loop)
88
+ def default_launch_args
89
+ # APP_BUNDLE_PATH
90
+ # BUNDLE_ID
91
+ # APP (unifies APP_BUNDLE_PATH, BUNDLE_ID)
92
+ # DEVICE_TARGET
93
+ # SDK_VERSION
94
+ # RESET_BETWEEN_SCENARIOS
95
+ # DEVICE
96
+ # NO_LAUNCH
97
+ # NO_STOP
98
+
99
+ args = {
100
+ :launch_method => default_launch_method,
101
+ :reset => reset_between_scenarios?,
102
+ :bundle_id => ENV['BUNDLE_ID'],
103
+ :device => device_env,
104
+ :no_stop => calabash_no_stop?,
105
+ :no_launch => calabash_no_launch?,
106
+ :sdk_version => sdk_version
107
+ }
108
+
109
+ #:device_target will be set
110
+
111
+ if run_with_instruments?(args) && !simulator_target?
112
+ device_tgt = ENV['DEVICE_TARGET']
113
+ if detect_connected_device? && (device_tgt.nil? || device_tgt.downcase == 'device')
114
+ device_tgt = RunLoop::Core.detect_connected_device
115
+ end
116
+
117
+ if device_tgt
118
+ args[:device_target] = args[:udid] = device_tgt
119
+ else
120
+ args[:device_target] = 'simulator'
121
+ end
122
+ else
123
+ args[:device_target] = 'simulator'
68
124
  end
69
- if device_target?
70
- self.run_loop = RunLoop.run(:app => ENV['BUNDLE_ID'])
71
- ensure_connectivity
125
+
126
+
127
+ args
128
+ end
129
+
130
+ def detect_connected_device?
131
+ return ENV['DETECT_CONNECTED_DEVICE'] != '0'
132
+ end
133
+
134
+ def default_launch_method
135
+ return :instruments unless sdk_version || use_instruments_env?
136
+ return :instruments if sdk_version.start_with?('7') # Only instruments supported for iOS7+
137
+ sim_detector = SimLauncher::SdkDetector.new()
138
+ available = sim_detector.available_sdk_versions.reject { |v| v.start_with?('7') }
139
+ if available.include?(sdk_version)
140
+ :sim_launcher
141
+ else
142
+ :instruments
143
+ end
144
+ end
145
+
146
+ def relaunch(args={})
147
+ RunLoop.stop(run_loop) if run_loop
148
+
149
+ args = default_launch_args.merge(args)
150
+
151
+ args[:app] = args[:app] || args[:bundle_id] || app_path || detect_app_bundle_from_args(args)
152
+
153
+
154
+ if args[:app]
155
+ if File.directory?(args[:app])
156
+ args[:app] = File.expand_path(args[:app])
157
+ else
158
+ # args[:app] is not a directory so must be a bundle id
159
+ if args[:device_target] == 'simulator' ## bundle id set, but simulator target
160
+ args[:app] = app_path || detect_app_bundle_from_args(args)
161
+ end
162
+ end
163
+ end
164
+
165
+ unless args[:app]
166
+ if args[:device_target]=='simulator'
167
+ device_xamarin_build_dir = 'iPhoneSimulator'
168
+ else
169
+ device_xamarin_build_dir = 'iPhone'
170
+ end
171
+ args[:app] = Calabash::Cucumber::SimulatorHelper.app_bundle_or_raise(app_path, device_xamarin_build_dir)
172
+ end
173
+
174
+ args[:bundle_id] ||= detect_bundle_id_from_app_bundle(args)
175
+
176
+ args[:device] ||= detect_device_from_args(args)
177
+
178
+
179
+ reset_app_jail if args[:reset]
180
+
181
+ if run_with_instruments?(args)
182
+ self.run_loop = new_run_loop(args)
72
183
  else
73
- sdk = ENV['SDK_VERSION'] || SimLauncher::SdkDetector.new().latest_sdk_version
184
+ # run with sim launcher
185
+ sdk = sdk_version || SimLauncher::SdkDetector.new().available_sdk_versions.reverse.find { |x| !x.start_with?('7') }
74
186
  path = Calabash::Cucumber::SimulatorHelper.app_bundle_or_raise(app_path)
75
- if ENV['RESET_BETWEEN_SCENARIOS']=="1"
76
- reset_app_jail(sdk, path)
187
+ Calabash::Cucumber::SimulatorHelper.relaunch(path, sdk, args[:device].to_s, args)
188
+ end
189
+ self.launch_args = args
190
+ ensure_connectivity
191
+ end
192
+
193
+ def detect_device_from_args(args)
194
+ if args[:app] && File.directory?(args[:app])
195
+ # Derive bundle id from bundle_dir
196
+ plist_as_hash = info_plist_from_bundle_path(args[:app])
197
+ if plist_as_hash
198
+ device_family = plist_as_hash['UIDeviceFamily']
199
+ if device_family
200
+ first_device = device_family.first
201
+ if first_device == 2
202
+ return 'ipad'
203
+ else
204
+ return 'iphone'
205
+ end
206
+ end
207
+ end
208
+ else
209
+ args[:app]
210
+ end
211
+
212
+
213
+ end
214
+
215
+ def detect_app_bundle_from_args(args)
216
+ if args[:device_target]=='simulator'
217
+ device_xamarin_build_dir = 'iPhoneSimulator'
218
+ else
219
+ device_xamarin_build_dir = 'iPhone'
220
+ end
221
+ Calabash::Cucumber::SimulatorHelper.detect_app_bundle(nil, device_xamarin_build_dir)
222
+ end
223
+
224
+ def detect_bundle_id_from_app_bundle(args)
225
+ if args[:app] && File.directory?(args[:app])
226
+ # Derive bundle id from bundle_dir
227
+ plist_as_hash = info_plist_from_bundle_path(args[:app])
228
+ if plist_as_hash
229
+ plist_as_hash['CFBundleIdentifier']
77
230
  end
78
- Calabash::Cucumber::SimulatorHelper.relaunch(path, sdk, ENV['DEVICE'] || 'iphone', args)
231
+ else
232
+ args[:app]
79
233
  end
234
+ end
80
235
 
236
+ def info_plist_from_bundle_path(bundle_path)
237
+ plist_path = File.join(bundle_path, 'Info.plist')
238
+ info_plist_as_hash(plist_path) if File.exist?(plist_path)
239
+ end
240
+
241
+ def new_run_loop(args)
242
+ last_err = nil
243
+ 3.times do
244
+ begin
245
+ return RunLoop.run(args)
246
+ rescue RunLoop::TimeoutError => e
247
+ last_err = e
248
+ if ENV['CALABASH_FULL_CONSOLE_OUTPUT'] == '1'
249
+ puts "retrying run loop..."
250
+ end
251
+ end
252
+ end
253
+ raise StartError.new(last_err)
81
254
  end
82
255
 
83
256
  def ensure_connectivity
@@ -86,12 +259,14 @@ class MotionLauncher
86
259
  timeout = (ENV['CONNECT_TIMEOUT'] || 30).to_i
87
260
  retry_count = 0
88
261
  connected = false
89
- puts "Waiting for App to be ready"
262
+ if ENV['CALABASH_FULL_CONSOLE_OUTPUT'] == '1'
263
+ puts "Waiting for App to be ready"
264
+ end
90
265
  until connected do
91
266
  raise "MAX_RETRIES" if retry_count == max_retry_count
92
267
  retry_count += 1
93
268
  begin
94
- Timeout::timeout(timeout, MotionLauncherTimeoutErr) do
269
+ Timeout::timeout(timeout, CalabashLauncherTimeoutErr) do
95
270
  until connected
96
271
  begin
97
272
  connected = (ping_app == '200')
@@ -104,11 +279,11 @@ class MotionLauncher
104
279
  end
105
280
  end
106
281
  end
107
- rescue MotionLauncherTimeoutErr => e
282
+ rescue CalabashLauncherTimeoutErr => e
108
283
  puts "Timed out...Retry.."
109
284
  end
110
285
  end
111
- rescue e
286
+ rescue RuntimeError => e
112
287
  p e
113
288
  msg = "Unable to make connection to Calabash Server at #{ENV['DEVICE_ENDPOINT']|| "http://localhost:37265/"}\n"
114
289
  msg << "Make sure you don't have a firewall blocking traffic to #{ENV['DEVICE_ENDPOINT']|| "http://localhost:37265/"}.\n"
@@ -121,7 +296,7 @@ class MotionLauncher
121
296
 
122
297
  http = Net::HTTP.new(url.host, url.port)
123
298
  res = http.start do |sess|
124
- sess.request Net::HTTP::Get.new "version"
299
+ sess.request Net::HTTP::Get.new(ENV['CALABASH_VERSION_PATH'] || "version")
125
300
  end
126
301
  status = res.code
127
302
  begin
@@ -130,6 +305,11 @@ class MotionLauncher
130
305
 
131
306
  end
132
307
 
308
+ if status == '200'
309
+ version_body = JSON.parse(res.body)
310
+ self.device = Calabash::Cucumber::Device.new(url, version_body)
311
+ end
312
+
133
313
  status
134
314
  end
135
315
 
@@ -137,10 +317,6 @@ class MotionLauncher
137
317
  RunLoop.stop(run_loop)
138
318
  end
139
319
 
140
- def app_path
141
- ENV['APP_BUNDLE_PATH'] || (defined?(APP_BUNDLE_PATH) && APP_BUNDLE_PATH)
142
- end
143
-
144
320
  def calabash_notify(world)
145
321
  if world.respond_to?(:on_launch)
146
322
  world.on_launch
@@ -148,24 +324,75 @@ class MotionLauncher
148
324
  end
149
325
 
150
326
 
151
- end
327
+ def info_plist_as_hash(plist_path)
328
+ unless File.exist?(plist_path)
329
+ raise "Unable to find Info.plist: #{plist_path}"
330
+ end
331
+ parsedplist = CFPropertyList::List.new(:file => plist_path)
332
+ CFPropertyList.native_types(parsedplist.value)
333
+ end
152
334
 
153
- AfterConfiguration do
154
- system("rake device") if device_target?
155
- end
335
+ def detect_bundle_id
336
+ begin
337
+ bundle_path = Calabash::Cucumber::SimulatorHelper.app_bundle_or_raise(app_path)
338
+ plist_path = File.join(bundle_path, 'Info.plist')
339
+ info_plist_as_hash(plist_path)['CFBundleIdentifier']
340
+ rescue => e
341
+ raise "Unable to automatically find bundle id. Please set BUNDLE_ID environment variable. #{e}"
342
+ end
343
+ end
156
344
 
157
- Before do |scenario|
158
- @launcher = MotionLauncher.new
159
- @launcher.relaunch
160
- @launcher.calabash_notify(self)
161
- end
345
+ def calabash_no_stop?
346
+ calabash_no_launch? or ENV['NO_STOP']=="1"
347
+ end
162
348
 
163
- After do |scenario|
164
- unless calabash_no_stop?
165
- if device_target?
166
- @launcher.stop
167
- else
168
- Calabash::Cucumber::SimulatorHelper.stop
349
+ def calabash_no_launch?
350
+ ENV['NO_LAUNCH']=='1'
351
+ end
352
+
353
+ def device_target?
354
+ (ENV['DEVICE_TARGET'] != nil) && (not simulator_target?)
355
+ end
356
+
357
+ def simulator_target?
358
+ ENV['DEVICE_TARGET'] == 'simulator'
359
+ end
360
+
361
+ def sdk_version
362
+ ENV['SDK_VERSION']
363
+ end
364
+
365
+ def use_instruments_env?
366
+ ENV['LAUNCH_VIA'] == 'instruments'
367
+ end
368
+
369
+ def reset_between_scenarios?
370
+ ENV['RESET_BETWEEN_SCENARIOS']=="1"
371
+ end
372
+
373
+ def device_env
374
+ ENV['DEVICE']
375
+ end
376
+
377
+ def app_path
378
+ ENV['APP_BUNDLE_PATH'] || (defined?(APP_BUNDLE_PATH) && APP_BUNDLE_PATH) || ENV['APP']
379
+ end
380
+
381
+ def run_with_instruments?(args)
382
+ args[:launch_method] == :instruments
383
+ end
384
+
385
+ def active?
386
+ not run_loop.nil?
387
+ end
388
+
389
+ def inspect
390
+ msg = ["#{self.class}: Launch Method #{launch_args[:launch_method]}"]
391
+ if run_with_instruments?(self.launch_args) && self.run_loop
392
+ msg << "Log file: #{self.run_loop[:log_file]}"
169
393
  end
394
+ msg.join("\n")
170
395
  end
396
+
397
+
171
398
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motion-calabash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.160
4
+ version: 0.9.160.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karl Krukow
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-07 00:00:00.000000000 Z
11
+ date: 2013-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: calabash-cucumber