simctl 1.2.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ac630b987ba9c0f46f26ced5fd5ec0d6487394bd
4
- data.tar.gz: 07d80b1f7451dcc2dc21aae2e255ace702c4768f
3
+ metadata.gz: 5dfe7554bf2998c41f884105ec70bc6a4dee155a
4
+ data.tar.gz: b96a52ae6049709614ded55bc6038afc9ed23ed5
5
5
  SHA512:
6
- metadata.gz: d170e8e970ee62839dd7c082907cca67cd0c98f794bc2606cbeb22675fbaf412d5fa56bd5e787fc68e5e68ba5d1377c540d447dbd5c6c695bb538bf1912f186b
7
- data.tar.gz: 79e93352a0b4aa486a5456c2896b32f5b894ce7dd1078daecc34eec184d095910b31386b9cb8fa747409d377448126ba83b4dca32b1f4e41a1a29744e6d99653
6
+ metadata.gz: 8864a6e8fc2d0d5106bd9c1baad25225a8f6ce3bd9141ab2226d0b809d2ba5648c155da99681d4de21fcfa01c851710d72118715534198125d861a635fa810cb
7
+ data.tar.gz: b4541558026993c78934f76ae571648a21f210c7537595070fb5bec80f3961e99d68095e37c7b66ff49e131868e5e5505d3e601e46759b49a08f60cb47bc12f4
data/.travis.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  language: objective-c
2
- osx_image: xcode7.2
2
+ osx_image: xcode7.3
3
3
  before_script:
4
4
  - export LANG=en_US.UTF-8
5
5
  install: bundle
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simctl (1.2.3)
4
+ simctl (1.3.0)
5
5
  CFPropertyList
6
6
 
7
7
  GEM
@@ -14,6 +14,8 @@ module SimCtl
14
14
  def create_device(name, devicetype, runtime)
15
15
  runtime = runtime(name: runtime) unless runtime.is_a?(Runtime)
16
16
  devicetype = devicetype(name: devicetype) unless devicetype.is_a?(DeviceType)
17
+ raise "Invalid runtime: #{runtime}" unless runtime.is_a?(Runtime)
18
+ raise "Invalid devicetype: #{devicetype}" unless devicetype.is_a?(DeviceType)
17
19
  Executor.execute([COMMAND, Shellwords.shellescape(name), devicetype.identifier, runtime.identifier]) do |identifier|
18
20
  device(udid: identifier)
19
21
  end
@@ -10,6 +10,18 @@ module SimCtl
10
10
  def delete_device(device)
11
11
  Executor.execute([COMMAND, device.udid])
12
12
  end
13
+
14
+ # Delete all devices
15
+ #
16
+ # @return [SimCtl::List] a list of all deleted SimCtl::Device objects
17
+ def delete_all_devices
18
+ list_devices.each do |device|
19
+ device.kill!
20
+ device.shutdown! if device.state != :shutdown
21
+ device.wait! {|d| d.state == :shutdown}
22
+ device.delete!
23
+ end
24
+ end
13
25
  end
14
26
  end
15
27
  end
@@ -8,12 +8,17 @@ module SimCtl
8
8
  #
9
9
  # @param device [SimCtl::Device] the device to launch
10
10
  # @return [void]
11
- def launch_device(device, scale=1.0)
11
+ def launch_device(device, scale=1.0, opts={})
12
12
  raise "unsupported scale '#{scale}' (supported: #{SUPPORTED_SCALE.join(', ')})" unless SUPPORTED_SCALE.include?(scale)
13
13
  # Launching the same device twice does not work.
14
14
  # Simulator.app would just hang. Solution: Kill first.
15
15
  kill_device(device)
16
- command = "open -n #{XCODE_HOME}/Applications/Simulator.app --args -ConnectHardwareKeyboard 0 -CurrentDeviceUDID #{device.udid} -SimulatorWindowLastScale-#{device.devicetype.identifier} #{scale}"
16
+ args = {
17
+ '-ConnectHardwareKeyboard' => 1,
18
+ '-CurrentDeviceUDID' => device.udid,
19
+ "-SimulatorWindowLastScale-#{device.devicetype.identifier}" => scale,
20
+ }.merge(opts).zip.flatten.join(' ')
21
+ command = "open -Fgn #{XCODE_HOME}/Applications/Simulator.app --args #{args}"
17
22
  system command
18
23
  end
19
24
  end
data/lib/simctl/device.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'cfpropertylist'
2
2
  require 'ostruct'
3
+ require 'simctl/device_path'
3
4
  require 'simctl/object'
4
5
  require 'timeout'
5
6
 
@@ -19,6 +20,24 @@ module SimCtl
19
20
  @devicetype ||= SimCtl.devicetype(identifier: plist.deviceType)
20
21
  end
21
22
 
23
+ def disable_keyboard_helpers!
24
+ path.edit path.preferences_plist do |plist|
25
+ %w(
26
+ KeyboardPeriodShortcut
27
+ KeyboardAutocapitalization
28
+ KeyboardCheckSpelling
29
+ KeyboardAssistant
30
+ KeyboardAutocorrection
31
+ KeyboardPrediction
32
+ KeyboardShowPredictionBar
33
+ KeyboardCapsLock
34
+ ).each do |key|
35
+ plist[key] = false
36
+ end
37
+ plist
38
+ end
39
+ end
40
+
22
41
  def erase!
23
42
  SimCtl.erase_device(self)
24
43
  end
@@ -27,14 +46,22 @@ module SimCtl
27
46
  SimCtl.kill_device(self)
28
47
  end
29
48
 
30
- def launch!(scale=1.0)
31
- SimCtl.launch_device(self, scale)
49
+ def launch!(scale=1.0, opts={})
50
+ SimCtl.launch_device(self, scale, opts)
51
+ end
52
+
53
+ def path
54
+ @path ||= DevicePath.new(udid)
32
55
  end
33
56
 
34
57
  def rename!(name)
35
58
  SimCtl.rename_device(self, name)
36
59
  end
37
60
 
61
+ def reset!
62
+ SimCtl.reset_device name, devicetype, runtime
63
+ end
64
+
38
65
  def runtime
39
66
  @runtime ||= SimCtl.runtime(identifier: plist.runtime)
40
67
  end
@@ -56,17 +83,15 @@ module SimCtl
56
83
  end
57
84
 
58
85
  def ==(other)
86
+ return false if other.nil?
87
+ return false unless other.kind_of? Device
59
88
  other.udid == udid
60
89
  end
61
90
 
62
91
  private
63
92
 
64
93
  def plist
65
- @plist ||= OpenStruct.new(CFPropertyList.native_types(CFPropertyList::List.new(file: plist_path).value))
66
- end
67
-
68
- def plist_path
69
- File.join(ENV['HOME'], 'Library/Developer/CoreSimulator/Devices', udid, 'device.plist')
94
+ @plist ||= OpenStruct.new(CFPropertyList.native_types(CFPropertyList::List.new(file: path.device_plist).value))
70
95
  end
71
96
 
72
97
  end
@@ -0,0 +1,21 @@
1
+ require 'simctl/object'
2
+
3
+ module SimCtl
4
+ class DevicePath
5
+ attr_reader :device_plist, :home, :preferences_plist
6
+
7
+ def initialize(udid)
8
+ @home = File.join(ENV['HOME'], 'Library/Developer/CoreSimulator/Devices', udid)
9
+ @device_plist = File.join(@home, 'device.plist')
10
+ @preferences_plist = File.join(@home, 'data/Library/Preferences/com.apple.Preferences.plist')
11
+ end
12
+
13
+ def edit(path, &block)
14
+ plist = File.exists?(path) ? CFPropertyList::List.new(file: path) : CFPropertyList::List.new
15
+ content = CFPropertyList.native_types(plist.value) || {}
16
+ plist.value = CFPropertyList.guess(yield content)
17
+ plist.save(path, CFPropertyList::List::FORMAT_BINARY)
18
+ end
19
+
20
+ end
21
+ end
@@ -5,6 +5,8 @@ module SimCtl
5
5
  attr_reader :identifier, :name
6
6
 
7
7
  def ==(other)
8
+ return false if other.nil?
9
+ return false unless other.kind_of? DeviceType
8
10
  other.identifier == identifier
9
11
  end
10
12
  end
@@ -10,14 +10,10 @@ module SimCtl
10
10
  output = stdout.read
11
11
  raise StandardError.new(output) if result.value.to_i > 0
12
12
  return unless block_given?
13
- begin
14
- if looks_like_json?(output)
15
- yield JSON.parse(output)
16
- else
17
- yield output.chomp
18
- end
19
- rescue StandardError => e
20
- raise StandardError.new("Failed to execute '#{command}' (output: '#{output.chomp}'): #{e}")
13
+ if looks_like_json?(output)
14
+ yield JSON.parse(output)
15
+ else
16
+ yield output.chomp
21
17
  end
22
18
  end
23
19
  end
@@ -5,6 +5,8 @@ module SimCtl
5
5
  attr_reader :availability, :buildversion, :identifier, :name, :version
6
6
 
7
7
  def ==(other)
8
+ return false if other.nil?
9
+ return false unless other.kind_of? Runtime
8
10
  other.identifier == identifier
9
11
  end
10
12
 
@@ -1,3 +1,3 @@
1
1
  module SimCtl
2
- VERSION = "1.2.3"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -2,83 +2,95 @@ require 'securerandom'
2
2
  require 'test_helper'
3
3
 
4
4
  class SimCtl::Command::CRUDTest < Minitest::Test
5
- def setup
6
- @devicetype = SimCtl.list_devicetypes.select {|devicetype| devicetype.name =~ %r[iPhone]}.first
7
- @runtime = SimCtl.list_runtimes.select {|runtime| runtime.name =~ %r[iOS.*9]}.first
8
- @device = SimCtl.create_device SecureRandom.hex, @devicetype, @runtime
9
- @device.wait! {|d| d.state != :creating}
10
- end
5
+ order_dependent!
11
6
 
12
- def teardown
13
- device = SimCtl.device(udid: @device.udid)
14
- return unless device
15
- device.kill!
16
- device.shutdown! if device.state != :shutdown
17
- device.wait! {|d| d.state == :shutdown}
18
- device.delete!
7
+ udid = nil
8
+ name = SecureRandom.hex
9
+ devicetype = 'iPhone 5'
10
+
11
+ should 'raise exception if devicetype lookup failed' do
12
+ assert_raises { SimCtl.create_device SecureRandom.hex, 'invalid devicetype', SimCtl::Runtime.latest(:ios) }
19
13
  end
20
14
 
21
- #should 'have devicetype and runtime property' do
22
- # device = SimCtl.device(udid: @device.udid)
23
- # assert device == @device
24
- # assert device.devicetype == @devicetype
25
- # assert device.runtime == @runtime
26
- #end
15
+ should 'raise exception if runtime lookup failed' do
16
+ assert_raises { SimCtl.create_device name, SimCtl::DeviceType.find(name: devicetype), 'invalid runtime' }
17
+ end
27
18
 
28
- should 'lookup devicetype and runtime strings' do
29
- device = SimCtl.create_device SecureRandom.hex, @devicetype.name, @runtime.name
30
- device.wait! {|d| d.state != :creating}
31
- device.delete!
19
+ should '01. create a new device' do
20
+ device = SimCtl.create_device name, devicetype, SimCtl::Runtime.latest(:ios)
21
+ device.wait! {|d| d.state == :shutdown}
22
+ udid = device.udid
32
23
  end
33
24
 
34
- should 'find the device created in setup' do
35
- device = SimCtl.device(udid: @device.udid)
25
+ should '02. find the device by udid' do
26
+ device = SimCtl.device(udid: udid)
36
27
  assert_kind_of SimCtl::Device, device
37
28
  assert device.availability != nil
38
- assert device.name != nil
29
+ assert device.name == name
39
30
  assert device.os != nil
40
31
  assert device.state != nil
41
32
  assert device.udid != nil
42
33
  end
43
34
 
44
- should 'launch and kill the device created in setup' do
45
- device = SimCtl.device(udid: @device.udid)
46
- assert SimCtl.launch_device(device)
35
+ should '03. find the device by name' do
36
+ assert SimCtl.device(name: name).udid == udid
37
+ end
38
+
39
+ should '04. have devicetype property' do
40
+ assert SimCtl.device(udid: udid).devicetype == SimCtl.devicetype(name: devicetype)
41
+ end
42
+
43
+ should '05. have runtime property' do
44
+ assert SimCtl.device(udid: udid).runtime == SimCtl::Runtime.latest(:ios)
45
+ end
46
+
47
+ should '06. rename the device' do
48
+ SimCtl.device(udid: udid).rename!('new name')
49
+ assert SimCtl.device(udid: udid).name == 'new name'
50
+ end
51
+
52
+ should '07. erase the device' do
53
+ SimCtl.device(udid: udid).erase!
54
+ end
55
+
56
+ should '08. launch the device' do
57
+ device = SimCtl.device(udid: udid)
58
+ device.launch!
47
59
  device.wait!{|d| d.state == :booted}
48
- assert device.kill!
49
- device.wait!{|d| d.state == :shutdown}
50
60
  end
51
61
 
52
- should 'erase the device created in setup' do
53
- device = SimCtl.device(udid: @device.udid)
54
- device.erase!
62
+ should '09. kill the device' do
63
+ device = SimCtl.device(udid: udid)
64
+ assert device.kill!
65
+ device.wait!{|d| d.state == :shutdown}
55
66
  end
56
67
 
57
- should 'boot/shutdown the device created in setup' do
58
- device = SimCtl.device(udid: @device.udid)
68
+ should '10. boot the device' do
69
+ device = SimCtl.device(udid: udid)
59
70
  device.boot!
60
- device.wait! {|d| d.state == :booted}
61
- device.shutdown!
62
- device.wait! {|d| d.state == :shutdown}
71
+ device.wait!{|d| d.state == :booted}
63
72
  end
64
73
 
65
- should 'delete the device created in setup' do
66
- device = SimCtl.device(udid: @device.udid)
67
- SimCtl.delete_device device
68
- assert_nil SimCtl.device(udid: @device.udid)
74
+ should '11. shutdown the device' do
75
+ device = SimCtl.device(udid: udid)
76
+ device.shutdown!
77
+ device.wait!{|d| d.state == :shutdown}
69
78
  end
70
79
 
71
- should 'rename the device created in setup' do
72
- device = SimCtl.device(udid: @device.udid)
73
- device.rename!('new name')
74
- assert SimCtl.device(udid: @device.udid).name == 'new name'
80
+ should '12. reset the device' do
81
+ old_device = SimCtl.device(udid: udid)
82
+ new_device = SimCtl.reset_device old_device.name, old_device.devicetype, old_device.runtime
83
+ new_device.wait!{|d| d.state != :creating}
84
+ assert old_device.name == new_device.name
85
+ assert old_device.devicetype == new_device.devicetype
86
+ assert old_device.runtime == new_device.runtime
87
+ assert old_device.udid != new_device.udid
88
+ udid = new_device.udid
75
89
  end
76
90
 
77
- should 'reset the device created in setup' do
78
- device = SimCtl.reset_device @device.name, @devicetype, @runtime
79
- assert_kind_of SimCtl::Device, device
80
- assert_nil SimCtl.device(udid: @device.udid)
81
- @device = device # teardown cleanup
82
- device.wait! {|d| d.state != :creating}
91
+ should '13. delete the device' do
92
+ device = SimCtl.device(udid: udid)
93
+ device.delete!
94
+ assert_nil SimCtl.device(udid: udid)
83
95
  end
84
96
  end
@@ -49,6 +49,18 @@ class SimCtl::Command::ListTest < Minitest::Test
49
49
  should 'parse name property' do
50
50
  assert SimCtl.list_runtimes.first.name != nil
51
51
  end
52
+
53
+ should 'return latest ios runtime' do
54
+ assert_kind_of SimCtl::Runtime, SimCtl::Runtime.latest(:ios)
55
+ end
56
+
57
+ should 'return latest tvos runtime' do
58
+ assert_kind_of SimCtl::Runtime, SimCtl::Runtime.latest(:tvos)
59
+ end
60
+
61
+ should 'return latest watchos runtime' do
62
+ assert_kind_of SimCtl::Runtime, SimCtl::Runtime.latest(:watchos)
63
+ end
52
64
  end
53
65
 
54
66
  context 'runtime' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simctl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johannes Plunien
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-27 00:00:00.000000000 Z
11
+ date: 2016-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -108,6 +108,7 @@ files:
108
108
  - lib/simctl/command/reset.rb
109
109
  - lib/simctl/command/shutdown.rb
110
110
  - lib/simctl/device.rb
111
+ - lib/simctl/device_path.rb
111
112
  - lib/simctl/device_type.rb
112
113
  - lib/simctl/executor.rb
113
114
  - lib/simctl/list.rb