simctl 1.4.1 → 1.5.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 +4 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +4 -1
- data/lib/simctl/command.rb +2 -0
- data/lib/simctl/command/install.rb +18 -0
- data/lib/simctl/command/launch.rb +17 -1
- data/lib/simctl/command/list.rb +8 -4
- data/lib/simctl/device.rb +18 -0
- data/lib/simctl/executor.rb +5 -1
- data/lib/simctl/version.rb +1 -1
- data/test/SampleApp/.gitignore +51 -0
- data/test/SampleApp/SampleApp.xcodeproj/project.pbxproj +269 -0
- data/test/SampleApp/SampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/test/SampleApp/SampleApp/AppDelegate.h +17 -0
- data/test/SampleApp/SampleApp/AppDelegate.m +17 -0
- data/test/SampleApp/SampleApp/Info.plist +38 -0
- data/test/SampleApp/SampleApp/main.m +17 -0
- data/test/simctl/command/crud_test.rb +32 -14
- data/test/simctl/command/list_test.rb +9 -1
- metadata +18 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 11fcd32b757a21e4fbf179095f081bf05c173a62
|
|
4
|
+
data.tar.gz: 1422938aace085d235c73e5bc62c70a78b52ae1a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4caf9e1dda2ecf77aadea8d71c2ae6a329dfd2b24b0807bab3b67d8cdf6e9b8041263b49e8f6fc5a979ec0f3b9677deab74e936ee26407cc84aff6e95f767450
|
|
7
|
+
data.tar.gz: 9e264b21cb31b756c297333f4e8c1f030dd5eaf144eb48244638cab1e94106b7b79682ae0e87923d2a9ba84ff084f6cca83a285370a92492f54b45fbee817106
|
data/CHANGELOG.md
ADDED
data/Gemfile.lock
CHANGED
data/lib/simctl/command.rb
CHANGED
|
@@ -2,6 +2,7 @@ require 'simctl/command/boot'
|
|
|
2
2
|
require 'simctl/command/create'
|
|
3
3
|
require 'simctl/command/delete'
|
|
4
4
|
require 'simctl/command/erase'
|
|
5
|
+
require 'simctl/command/install'
|
|
5
6
|
require 'simctl/command/kill'
|
|
6
7
|
require 'simctl/command/launch'
|
|
7
8
|
require 'simctl/command/list'
|
|
@@ -16,6 +17,7 @@ module SimCtl
|
|
|
16
17
|
include SimCtl::Command::Create
|
|
17
18
|
include SimCtl::Command::Delete
|
|
18
19
|
include SimCtl::Command::Erase
|
|
20
|
+
include SimCtl::Command::Install
|
|
19
21
|
include SimCtl::Command::Kill
|
|
20
22
|
include SimCtl::Command::Launch
|
|
21
23
|
include SimCtl::Command::List
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'shellwords'
|
|
2
|
+
|
|
3
|
+
module SimCtl
|
|
4
|
+
class Command
|
|
5
|
+
module Install
|
|
6
|
+
COMMAND = %w[xcrun simctl install]
|
|
7
|
+
|
|
8
|
+
# Installs an app on a device
|
|
9
|
+
#
|
|
10
|
+
# @param device [SimCtl::Device] the device the app should be installed on
|
|
11
|
+
# @param path Absolute path to the app that should be installed
|
|
12
|
+
# @return [void]
|
|
13
|
+
def install_app(device, path)
|
|
14
|
+
Executor.execute([COMMAND, device.udid, Shellwords.shellescape(path)])
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
require 'shellwords'
|
|
2
|
+
|
|
1
3
|
module SimCtl
|
|
2
4
|
class Command
|
|
3
5
|
module Launch
|
|
4
|
-
|
|
6
|
+
LAUNCH_APP_COMMAND = 'xcrun simctl launch'
|
|
5
7
|
SUPPORTED_SCALE = [1.0, 0.75, 0.5, 0.25]
|
|
8
|
+
XCODE_HOME = `xcode-select -p`.chomp
|
|
6
9
|
|
|
7
10
|
# Launches a Simulator instance with the given device
|
|
8
11
|
#
|
|
@@ -21,6 +24,19 @@ module SimCtl
|
|
|
21
24
|
command = "open -Fgn #{XCODE_HOME}/Applications/Simulator.app --args #{args}"
|
|
22
25
|
system command
|
|
23
26
|
end
|
|
27
|
+
|
|
28
|
+
# Launches an app in the given device
|
|
29
|
+
#
|
|
30
|
+
# @param device [SimCtl::Device] the device to launch
|
|
31
|
+
# @param opts [Hash] options hash - `{ wait_for_debugger: true/false }`
|
|
32
|
+
# @param identifier [String] the app identifier
|
|
33
|
+
# @param args [Array] optional launch arguments
|
|
34
|
+
# @return [void]
|
|
35
|
+
def launch_app(device, identifier, args=[], opts={})
|
|
36
|
+
launch_args = args.map {|arg| Shellwords.shellescape arg}
|
|
37
|
+
launch_opts = opts[:wait_for_debugger] ? '-w' : ''
|
|
38
|
+
Executor.execute([LAUNCH_APP_COMMAND, launch_opts, device.udid, identifier, launch_args])
|
|
39
|
+
end
|
|
24
40
|
end
|
|
25
41
|
end
|
|
26
42
|
end
|
data/lib/simctl/command/list.rb
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
module SimCtl
|
|
2
|
+
class DeviceTypeNotFound < StandardError; end
|
|
3
|
+
class RuntimeNotFound < StandardError; end
|
|
2
4
|
class Command
|
|
3
5
|
module List
|
|
4
6
|
COMMAND = %w[xcrun simctl list -j]
|
|
@@ -14,9 +16,10 @@ module SimCtl
|
|
|
14
16
|
# Find a device type
|
|
15
17
|
#
|
|
16
18
|
# @param filter [Hash] the filter
|
|
17
|
-
# @return [SimCtl::DeviceType
|
|
19
|
+
# @return [SimCtl::DeviceType] the device type matching the given filter
|
|
20
|
+
# @raise [DeviceTypeNotFound] if the device type could not be found
|
|
18
21
|
def devicetype(filter)
|
|
19
|
-
list_devicetypes.where(filter).first
|
|
22
|
+
list_devicetypes.where(filter).first or raise DeviceTypeNotFound.new("Could not find a device type matching #{filter.inspect}")
|
|
20
23
|
end
|
|
21
24
|
|
|
22
25
|
# List all devices
|
|
@@ -49,9 +52,10 @@ module SimCtl
|
|
|
49
52
|
# Find a runtime
|
|
50
53
|
#
|
|
51
54
|
# @param filter [Hash] the filter
|
|
52
|
-
# @return [SimCtl::Runtime
|
|
55
|
+
# @return [SimCtl::Runtime] the runtime matching the given filter
|
|
56
|
+
# @raise [RuntimeNotFound] if the runtime could not be found
|
|
53
57
|
def runtime(filter)
|
|
54
|
-
list_runtimes.where(filter).first
|
|
58
|
+
list_runtimes.where(filter).first or raise RuntimeNotFound.new("Could not find a runtime matching #{filter.inspect}")
|
|
55
59
|
end
|
|
56
60
|
|
|
57
61
|
end
|
data/lib/simctl/device.rb
CHANGED
|
@@ -45,6 +45,14 @@ module SimCtl
|
|
|
45
45
|
SimCtl.erase_device(self)
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
+
# Installs an app on a device
|
|
49
|
+
#
|
|
50
|
+
# @param path Absolute path to the app that should be installed
|
|
51
|
+
# @return [void]
|
|
52
|
+
def install!(path)
|
|
53
|
+
SimCtl.install_app(self, path)
|
|
54
|
+
end
|
|
55
|
+
|
|
48
56
|
# Kills the device
|
|
49
57
|
#
|
|
50
58
|
# @return [void]
|
|
@@ -59,6 +67,16 @@ module SimCtl
|
|
|
59
67
|
SimCtl.launch_device(self, scale, opts)
|
|
60
68
|
end
|
|
61
69
|
|
|
70
|
+
# Launches an app in the given device
|
|
71
|
+
#
|
|
72
|
+
# @param opts [Hash] options hash - `{ wait_for_debugger: true/false }`
|
|
73
|
+
# @param identifier [String] the app identifier
|
|
74
|
+
# @param args [Array] optional launch arguments
|
|
75
|
+
# @return [void]
|
|
76
|
+
def launch_app!(identifier, args=[], opts={})
|
|
77
|
+
SimCtl.launch_app(self, identifier, args, opts)
|
|
78
|
+
end
|
|
79
|
+
|
|
62
80
|
def path
|
|
63
81
|
@path ||= DevicePath.new(udid)
|
|
64
82
|
end
|
data/lib/simctl/executor.rb
CHANGED
|
@@ -6,9 +6,13 @@ module SimCtl
|
|
|
6
6
|
class << self
|
|
7
7
|
def execute(command)
|
|
8
8
|
command = command.flatten.join(' ')
|
|
9
|
+
$stderr.puts command if ENV['SIMCTL_DEBUG']
|
|
9
10
|
Open3.popen3(command) do |stdin, stdout, stderr, result|
|
|
10
11
|
output = stdout.read
|
|
11
|
-
|
|
12
|
+
if result.value.to_i > 0
|
|
13
|
+
output = stderr.read if output.empty?
|
|
14
|
+
raise StandardError.new(output)
|
|
15
|
+
end
|
|
12
16
|
return unless block_given?
|
|
13
17
|
if looks_like_json?(output)
|
|
14
18
|
yield JSON.parse(output)
|
data/lib/simctl/version.rb
CHANGED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Xcode
|
|
2
|
+
#
|
|
3
|
+
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
|
|
4
|
+
|
|
5
|
+
## Build generated
|
|
6
|
+
build/
|
|
7
|
+
DerivedData/
|
|
8
|
+
|
|
9
|
+
## Various settings
|
|
10
|
+
*.pbxuser
|
|
11
|
+
!default.pbxuser
|
|
12
|
+
*.mode1v3
|
|
13
|
+
!default.mode1v3
|
|
14
|
+
*.mode2v3
|
|
15
|
+
!default.mode2v3
|
|
16
|
+
*.perspectivev3
|
|
17
|
+
!default.perspectivev3
|
|
18
|
+
xcuserdata/
|
|
19
|
+
|
|
20
|
+
## Other
|
|
21
|
+
*.moved-aside
|
|
22
|
+
*.xcuserstate
|
|
23
|
+
|
|
24
|
+
## Obj-C/Swift specific
|
|
25
|
+
*.hmap
|
|
26
|
+
*.ipa
|
|
27
|
+
|
|
28
|
+
# CocoaPods
|
|
29
|
+
#
|
|
30
|
+
# We recommend against adding the Pods directory to your .gitignore. However
|
|
31
|
+
# you should judge for yourself, the pros and cons are mentioned at:
|
|
32
|
+
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
|
|
33
|
+
#
|
|
34
|
+
# Pods/
|
|
35
|
+
|
|
36
|
+
# Carthage
|
|
37
|
+
#
|
|
38
|
+
# Add this line if you want to avoid checking in source code from Carthage dependencies.
|
|
39
|
+
# Carthage/Checkouts
|
|
40
|
+
|
|
41
|
+
Carthage/Build
|
|
42
|
+
|
|
43
|
+
# fastlane
|
|
44
|
+
#
|
|
45
|
+
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
|
|
46
|
+
# screenshots whenever they are needed.
|
|
47
|
+
# For more information about the recommended setup visit:
|
|
48
|
+
# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
|
|
49
|
+
|
|
50
|
+
fastlane/report.xml
|
|
51
|
+
fastlane/screenshots
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
// !$*UTF8*$!
|
|
2
|
+
{
|
|
3
|
+
archiveVersion = 1;
|
|
4
|
+
classes = {
|
|
5
|
+
};
|
|
6
|
+
objectVersion = 46;
|
|
7
|
+
objects = {
|
|
8
|
+
|
|
9
|
+
/* Begin PBXBuildFile section */
|
|
10
|
+
05185E8C1CC73EFA00987485 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 05185E8B1CC73EFA00987485 /* main.m */; };
|
|
11
|
+
05185E8F1CC73EFA00987485 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 05185E8E1CC73EFA00987485 /* AppDelegate.m */; };
|
|
12
|
+
/* End PBXBuildFile section */
|
|
13
|
+
|
|
14
|
+
/* Begin PBXFileReference section */
|
|
15
|
+
05185E871CC73EFA00987485 /* SampleApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SampleApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
16
|
+
05185E8B1CC73EFA00987485 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
|
17
|
+
05185E8D1CC73EFA00987485 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
|
|
18
|
+
05185E8E1CC73EFA00987485 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
|
|
19
|
+
05185E9B1CC73EFA00987485 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
|
20
|
+
/* End PBXFileReference section */
|
|
21
|
+
|
|
22
|
+
/* Begin PBXFrameworksBuildPhase section */
|
|
23
|
+
05185E841CC73EFA00987485 /* Frameworks */ = {
|
|
24
|
+
isa = PBXFrameworksBuildPhase;
|
|
25
|
+
buildActionMask = 2147483647;
|
|
26
|
+
files = (
|
|
27
|
+
);
|
|
28
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
29
|
+
};
|
|
30
|
+
/* End PBXFrameworksBuildPhase section */
|
|
31
|
+
|
|
32
|
+
/* Begin PBXGroup section */
|
|
33
|
+
05185E7E1CC73EFA00987485 = {
|
|
34
|
+
isa = PBXGroup;
|
|
35
|
+
children = (
|
|
36
|
+
05185E891CC73EFA00987485 /* SampleApp */,
|
|
37
|
+
05185E881CC73EFA00987485 /* Products */,
|
|
38
|
+
);
|
|
39
|
+
sourceTree = "<group>";
|
|
40
|
+
};
|
|
41
|
+
05185E881CC73EFA00987485 /* Products */ = {
|
|
42
|
+
isa = PBXGroup;
|
|
43
|
+
children = (
|
|
44
|
+
05185E871CC73EFA00987485 /* SampleApp.app */,
|
|
45
|
+
);
|
|
46
|
+
name = Products;
|
|
47
|
+
sourceTree = "<group>";
|
|
48
|
+
};
|
|
49
|
+
05185E891CC73EFA00987485 /* SampleApp */ = {
|
|
50
|
+
isa = PBXGroup;
|
|
51
|
+
children = (
|
|
52
|
+
05185E8D1CC73EFA00987485 /* AppDelegate.h */,
|
|
53
|
+
05185E8E1CC73EFA00987485 /* AppDelegate.m */,
|
|
54
|
+
05185E9B1CC73EFA00987485 /* Info.plist */,
|
|
55
|
+
05185E8A1CC73EFA00987485 /* Supporting Files */,
|
|
56
|
+
);
|
|
57
|
+
path = SampleApp;
|
|
58
|
+
sourceTree = "<group>";
|
|
59
|
+
};
|
|
60
|
+
05185E8A1CC73EFA00987485 /* Supporting Files */ = {
|
|
61
|
+
isa = PBXGroup;
|
|
62
|
+
children = (
|
|
63
|
+
05185E8B1CC73EFA00987485 /* main.m */,
|
|
64
|
+
);
|
|
65
|
+
name = "Supporting Files";
|
|
66
|
+
sourceTree = "<group>";
|
|
67
|
+
};
|
|
68
|
+
/* End PBXGroup section */
|
|
69
|
+
|
|
70
|
+
/* Begin PBXNativeTarget section */
|
|
71
|
+
05185E861CC73EFA00987485 /* SampleApp */ = {
|
|
72
|
+
isa = PBXNativeTarget;
|
|
73
|
+
buildConfigurationList = 05185E9E1CC73EFA00987485 /* Build configuration list for PBXNativeTarget "SampleApp" */;
|
|
74
|
+
buildPhases = (
|
|
75
|
+
05185E831CC73EFA00987485 /* Sources */,
|
|
76
|
+
05185E841CC73EFA00987485 /* Frameworks */,
|
|
77
|
+
05185E851CC73EFA00987485 /* Resources */,
|
|
78
|
+
);
|
|
79
|
+
buildRules = (
|
|
80
|
+
);
|
|
81
|
+
dependencies = (
|
|
82
|
+
);
|
|
83
|
+
name = SampleApp;
|
|
84
|
+
productName = SampleApp;
|
|
85
|
+
productReference = 05185E871CC73EFA00987485 /* SampleApp.app */;
|
|
86
|
+
productType = "com.apple.product-type.application";
|
|
87
|
+
};
|
|
88
|
+
/* End PBXNativeTarget section */
|
|
89
|
+
|
|
90
|
+
/* Begin PBXProject section */
|
|
91
|
+
05185E7F1CC73EFA00987485 /* Project object */ = {
|
|
92
|
+
isa = PBXProject;
|
|
93
|
+
attributes = {
|
|
94
|
+
LastUpgradeCheck = 0730;
|
|
95
|
+
ORGANIZATIONNAME = "Johannes Plunien";
|
|
96
|
+
TargetAttributes = {
|
|
97
|
+
05185E861CC73EFA00987485 = {
|
|
98
|
+
CreatedOnToolsVersion = 7.3;
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
buildConfigurationList = 05185E821CC73EFA00987485 /* Build configuration list for PBXProject "SampleApp" */;
|
|
103
|
+
compatibilityVersion = "Xcode 3.2";
|
|
104
|
+
developmentRegion = English;
|
|
105
|
+
hasScannedForEncodings = 0;
|
|
106
|
+
knownRegions = (
|
|
107
|
+
en,
|
|
108
|
+
Base,
|
|
109
|
+
);
|
|
110
|
+
mainGroup = 05185E7E1CC73EFA00987485;
|
|
111
|
+
productRefGroup = 05185E881CC73EFA00987485 /* Products */;
|
|
112
|
+
projectDirPath = "";
|
|
113
|
+
projectRoot = "";
|
|
114
|
+
targets = (
|
|
115
|
+
05185E861CC73EFA00987485 /* SampleApp */,
|
|
116
|
+
);
|
|
117
|
+
};
|
|
118
|
+
/* End PBXProject section */
|
|
119
|
+
|
|
120
|
+
/* Begin PBXResourcesBuildPhase section */
|
|
121
|
+
05185E851CC73EFA00987485 /* Resources */ = {
|
|
122
|
+
isa = PBXResourcesBuildPhase;
|
|
123
|
+
buildActionMask = 2147483647;
|
|
124
|
+
files = (
|
|
125
|
+
);
|
|
126
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
127
|
+
};
|
|
128
|
+
/* End PBXResourcesBuildPhase section */
|
|
129
|
+
|
|
130
|
+
/* Begin PBXSourcesBuildPhase section */
|
|
131
|
+
05185E831CC73EFA00987485 /* Sources */ = {
|
|
132
|
+
isa = PBXSourcesBuildPhase;
|
|
133
|
+
buildActionMask = 2147483647;
|
|
134
|
+
files = (
|
|
135
|
+
05185E8F1CC73EFA00987485 /* AppDelegate.m in Sources */,
|
|
136
|
+
05185E8C1CC73EFA00987485 /* main.m in Sources */,
|
|
137
|
+
);
|
|
138
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
139
|
+
};
|
|
140
|
+
/* End PBXSourcesBuildPhase section */
|
|
141
|
+
|
|
142
|
+
/* Begin XCBuildConfiguration section */
|
|
143
|
+
05185E9C1CC73EFA00987485 /* Debug */ = {
|
|
144
|
+
isa = XCBuildConfiguration;
|
|
145
|
+
buildSettings = {
|
|
146
|
+
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
147
|
+
CLANG_ANALYZER_NONNULL = YES;
|
|
148
|
+
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
149
|
+
CLANG_CXX_LIBRARY = "libc++";
|
|
150
|
+
CLANG_ENABLE_MODULES = YES;
|
|
151
|
+
CLANG_ENABLE_OBJC_ARC = YES;
|
|
152
|
+
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
153
|
+
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
154
|
+
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
155
|
+
CLANG_WARN_EMPTY_BODY = YES;
|
|
156
|
+
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
157
|
+
CLANG_WARN_INT_CONVERSION = YES;
|
|
158
|
+
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
159
|
+
CLANG_WARN_UNREACHABLE_CODE = YES;
|
|
160
|
+
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
161
|
+
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
|
162
|
+
COPY_PHASE_STRIP = NO;
|
|
163
|
+
DEBUG_INFORMATION_FORMAT = dwarf;
|
|
164
|
+
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
165
|
+
ENABLE_TESTABILITY = YES;
|
|
166
|
+
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
167
|
+
GCC_DYNAMIC_NO_PIC = NO;
|
|
168
|
+
GCC_NO_COMMON_BLOCKS = YES;
|
|
169
|
+
GCC_OPTIMIZATION_LEVEL = 0;
|
|
170
|
+
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
171
|
+
"DEBUG=1",
|
|
172
|
+
"$(inherited)",
|
|
173
|
+
);
|
|
174
|
+
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
175
|
+
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
176
|
+
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
177
|
+
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
178
|
+
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
179
|
+
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
180
|
+
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
|
|
181
|
+
MTL_ENABLE_DEBUG_INFO = YES;
|
|
182
|
+
ONLY_ACTIVE_ARCH = YES;
|
|
183
|
+
SDKROOT = iphoneos;
|
|
184
|
+
};
|
|
185
|
+
name = Debug;
|
|
186
|
+
};
|
|
187
|
+
05185E9D1CC73EFA00987485 /* Release */ = {
|
|
188
|
+
isa = XCBuildConfiguration;
|
|
189
|
+
buildSettings = {
|
|
190
|
+
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
191
|
+
CLANG_ANALYZER_NONNULL = YES;
|
|
192
|
+
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
193
|
+
CLANG_CXX_LIBRARY = "libc++";
|
|
194
|
+
CLANG_ENABLE_MODULES = YES;
|
|
195
|
+
CLANG_ENABLE_OBJC_ARC = YES;
|
|
196
|
+
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
197
|
+
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
198
|
+
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
199
|
+
CLANG_WARN_EMPTY_BODY = YES;
|
|
200
|
+
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
201
|
+
CLANG_WARN_INT_CONVERSION = YES;
|
|
202
|
+
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
203
|
+
CLANG_WARN_UNREACHABLE_CODE = YES;
|
|
204
|
+
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
205
|
+
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
|
206
|
+
COPY_PHASE_STRIP = NO;
|
|
207
|
+
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
208
|
+
ENABLE_NS_ASSERTIONS = NO;
|
|
209
|
+
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
210
|
+
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
211
|
+
GCC_NO_COMMON_BLOCKS = YES;
|
|
212
|
+
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
213
|
+
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
214
|
+
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
215
|
+
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
216
|
+
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
217
|
+
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
218
|
+
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
|
|
219
|
+
MTL_ENABLE_DEBUG_INFO = NO;
|
|
220
|
+
SDKROOT = iphoneos;
|
|
221
|
+
VALIDATE_PRODUCT = YES;
|
|
222
|
+
};
|
|
223
|
+
name = Release;
|
|
224
|
+
};
|
|
225
|
+
05185E9F1CC73EFA00987485 /* Debug */ = {
|
|
226
|
+
isa = XCBuildConfiguration;
|
|
227
|
+
buildSettings = {
|
|
228
|
+
INFOPLIST_FILE = SampleApp/Info.plist;
|
|
229
|
+
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
|
230
|
+
PRODUCT_BUNDLE_IDENTIFIER = com.github.plu.simctl.SampleApp;
|
|
231
|
+
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
232
|
+
};
|
|
233
|
+
name = Debug;
|
|
234
|
+
};
|
|
235
|
+
05185EA01CC73EFA00987485 /* Release */ = {
|
|
236
|
+
isa = XCBuildConfiguration;
|
|
237
|
+
buildSettings = {
|
|
238
|
+
INFOPLIST_FILE = SampleApp/Info.plist;
|
|
239
|
+
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
|
240
|
+
PRODUCT_BUNDLE_IDENTIFIER = com.github.plu.simctl.SampleApp;
|
|
241
|
+
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
242
|
+
};
|
|
243
|
+
name = Release;
|
|
244
|
+
};
|
|
245
|
+
/* End XCBuildConfiguration section */
|
|
246
|
+
|
|
247
|
+
/* Begin XCConfigurationList section */
|
|
248
|
+
05185E821CC73EFA00987485 /* Build configuration list for PBXProject "SampleApp" */ = {
|
|
249
|
+
isa = XCConfigurationList;
|
|
250
|
+
buildConfigurations = (
|
|
251
|
+
05185E9C1CC73EFA00987485 /* Debug */,
|
|
252
|
+
05185E9D1CC73EFA00987485 /* Release */,
|
|
253
|
+
);
|
|
254
|
+
defaultConfigurationIsVisible = 0;
|
|
255
|
+
defaultConfigurationName = Release;
|
|
256
|
+
};
|
|
257
|
+
05185E9E1CC73EFA00987485 /* Build configuration list for PBXNativeTarget "SampleApp" */ = {
|
|
258
|
+
isa = XCConfigurationList;
|
|
259
|
+
buildConfigurations = (
|
|
260
|
+
05185E9F1CC73EFA00987485 /* Debug */,
|
|
261
|
+
05185EA01CC73EFA00987485 /* Release */,
|
|
262
|
+
);
|
|
263
|
+
defaultConfigurationIsVisible = 0;
|
|
264
|
+
defaultConfigurationName = Release;
|
|
265
|
+
};
|
|
266
|
+
/* End XCConfigurationList section */
|
|
267
|
+
};
|
|
268
|
+
rootObject = 05185E7F1CC73EFA00987485 /* Project object */;
|
|
269
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//
|
|
2
|
+
// AppDelegate.h
|
|
3
|
+
// SampleApp
|
|
4
|
+
//
|
|
5
|
+
// Created by Plunien, Johannes on 20/04/16.
|
|
6
|
+
// Copyright © 2016 Johannes Plunien. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#import <UIKit/UIKit.h>
|
|
10
|
+
|
|
11
|
+
@interface AppDelegate : UIResponder <UIApplicationDelegate>
|
|
12
|
+
|
|
13
|
+
@property (strong, nonatomic) UIWindow *window;
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@end
|
|
17
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//
|
|
2
|
+
// AppDelegate.m
|
|
3
|
+
// SampleApp
|
|
4
|
+
//
|
|
5
|
+
// Created by Plunien, Johannes on 20/04/16.
|
|
6
|
+
// Copyright © 2016 Johannes Plunien. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#import "AppDelegate.h"
|
|
10
|
+
|
|
11
|
+
@interface AppDelegate ()
|
|
12
|
+
|
|
13
|
+
@end
|
|
14
|
+
|
|
15
|
+
@implementation AppDelegate
|
|
16
|
+
|
|
17
|
+
@end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>CFBundleDevelopmentRegion</key>
|
|
6
|
+
<string>en</string>
|
|
7
|
+
<key>CFBundleExecutable</key>
|
|
8
|
+
<string>$(EXECUTABLE_NAME)</string>
|
|
9
|
+
<key>CFBundleIdentifier</key>
|
|
10
|
+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
11
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
|
12
|
+
<string>6.0</string>
|
|
13
|
+
<key>CFBundleName</key>
|
|
14
|
+
<string>$(PRODUCT_NAME)</string>
|
|
15
|
+
<key>CFBundlePackageType</key>
|
|
16
|
+
<string>APPL</string>
|
|
17
|
+
<key>CFBundleShortVersionString</key>
|
|
18
|
+
<string>1.0</string>
|
|
19
|
+
<key>CFBundleSignature</key>
|
|
20
|
+
<string>????</string>
|
|
21
|
+
<key>CFBundleVersion</key>
|
|
22
|
+
<string>1</string>
|
|
23
|
+
<key>LSRequiresIPhoneOS</key>
|
|
24
|
+
<true/>
|
|
25
|
+
<key>UIMainStoryboardFile</key>
|
|
26
|
+
<string>Main</string>
|
|
27
|
+
<key>UIRequiredDeviceCapabilities</key>
|
|
28
|
+
<array>
|
|
29
|
+
<string>armv7</string>
|
|
30
|
+
</array>
|
|
31
|
+
<key>UISupportedInterfaceOrientations</key>
|
|
32
|
+
<array>
|
|
33
|
+
<string>UIInterfaceOrientationPortrait</string>
|
|
34
|
+
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
35
|
+
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
36
|
+
</array>
|
|
37
|
+
</dict>
|
|
38
|
+
</plist>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//
|
|
2
|
+
// main.m
|
|
3
|
+
// SampleApp
|
|
4
|
+
//
|
|
5
|
+
// Created by Plunien, Johannes on 20/04/16.
|
|
6
|
+
// Copyright © 2016 Johannes Plunien. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#import <UIKit/UIKit.h>
|
|
10
|
+
#import "AppDelegate.h"
|
|
11
|
+
|
|
12
|
+
int main(int argc, char *argv[])
|
|
13
|
+
{
|
|
14
|
+
@autoreleasepool {
|
|
15
|
+
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -16,13 +16,13 @@ class SimCtl::Command::CRUDTest < Minitest::Test
|
|
|
16
16
|
assert_raises { SimCtl.create_device name, SimCtl::DeviceType.find(name: devicetype), 'invalid runtime' }
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
should '
|
|
19
|
+
should '0100. create a new device' do
|
|
20
20
|
device = SimCtl.create_device name, devicetype, SimCtl::Runtime.latest(:ios)
|
|
21
21
|
device.wait! {|d| d.state == :shutdown}
|
|
22
22
|
udid = device.udid
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
should '
|
|
25
|
+
should '0200. find the device by udid' do
|
|
26
26
|
device = SimCtl.device(udid: udid)
|
|
27
27
|
assert_kind_of SimCtl::Device, device
|
|
28
28
|
assert device.availability != nil
|
|
@@ -32,62 +32,80 @@ class SimCtl::Command::CRUDTest < Minitest::Test
|
|
|
32
32
|
assert device.udid != nil
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
should '
|
|
35
|
+
should '0300. find the device by name' do
|
|
36
36
|
assert SimCtl.device(name: name).udid == udid
|
|
37
37
|
assert SimCtl.device(name: name) == SimCtl.device(udid: udid)
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
should '
|
|
40
|
+
should '0400. have devicetype property' do
|
|
41
41
|
assert SimCtl.device(udid: udid).devicetype == SimCtl.devicetype(name: devicetype)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
-
should '
|
|
44
|
+
should '0500. have runtime property' do
|
|
45
45
|
assert SimCtl.device(udid: udid).runtime == SimCtl::Runtime.latest(:ios)
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
should '
|
|
48
|
+
should '0600. rename the device' do
|
|
49
49
|
SimCtl.device(udid: udid).rename!('new name')
|
|
50
50
|
assert SimCtl.device(udid: udid).name == 'new name'
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
-
should '
|
|
53
|
+
should '0700. erase the device' do
|
|
54
54
|
SimCtl.device(udid: udid).erase!
|
|
55
55
|
end
|
|
56
56
|
|
|
57
|
-
should '
|
|
57
|
+
should '0800. launch the device' do
|
|
58
58
|
device = SimCtl.device(udid: udid)
|
|
59
59
|
device.launch!
|
|
60
60
|
device.wait!{|d| d.state == :booted}
|
|
61
61
|
end
|
|
62
62
|
|
|
63
|
-
should '
|
|
63
|
+
should '0810. launch safari' do
|
|
64
|
+
device = SimCtl.device(udid: udid)
|
|
65
|
+
device.launch_app!('com.apple.mobilesafari')
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
should '0820. install SampleApp' do
|
|
69
|
+
system 'cd test/SampleApp && xcodebuild -sdk iphonesimulator >/dev/null 2>&1'
|
|
70
|
+
device = SimCtl.device(udid: udid)
|
|
71
|
+
device.install!('test/SampleApp/build/Release-iphonesimulator/SampleApp.app')
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
should '0830. launch SampleApp' do
|
|
75
|
+
system 'cd test/SampleApp && xcodebuild -sdk iphonesimulator >/dev/null 2>&1'
|
|
76
|
+
device = SimCtl.device(udid: udid)
|
|
77
|
+
device.launch_app!('com.github.plu.simctl.SampleApp')
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
should '0900. kill the device' do
|
|
64
81
|
device = SimCtl.device(udid: udid)
|
|
65
82
|
assert device.kill!
|
|
66
83
|
device.wait!{|d| d.state == :shutdown}
|
|
67
84
|
end
|
|
68
85
|
|
|
69
|
-
should '
|
|
86
|
+
should '1000. boot the device' do
|
|
70
87
|
device = SimCtl.device(udid: udid)
|
|
71
88
|
device.boot!
|
|
72
89
|
device.wait!{|d| d.state == :booted}
|
|
73
90
|
end
|
|
74
91
|
|
|
75
|
-
should '
|
|
92
|
+
should '1100. shutdown the device' do
|
|
76
93
|
device = SimCtl.device(udid: udid)
|
|
77
94
|
device.shutdown!
|
|
78
95
|
device.wait!{|d| d.state == :shutdown}
|
|
79
96
|
end
|
|
80
97
|
|
|
81
|
-
should '
|
|
98
|
+
should '1200. disable keyboard helpers' do
|
|
82
99
|
device = SimCtl.device(udid: udid)
|
|
83
100
|
device.settings.disable_keyboard_helpers!
|
|
84
101
|
assert File.exists?(device.path.preferences_plist)
|
|
85
102
|
end
|
|
86
103
|
|
|
87
|
-
should '
|
|
104
|
+
should '9800. reset the device' do
|
|
88
105
|
old_device = SimCtl.device(udid: udid)
|
|
89
106
|
new_device = old_device.reset!
|
|
90
107
|
new_device.wait!{|d| d.state != :creating}
|
|
108
|
+
new_device.wait!{|d| File.exists?(d.path.device_plist)}
|
|
91
109
|
assert old_device.name == new_device.name
|
|
92
110
|
assert old_device.devicetype == new_device.devicetype
|
|
93
111
|
assert old_device.runtime == new_device.runtime
|
|
@@ -95,7 +113,7 @@ class SimCtl::Command::CRUDTest < Minitest::Test
|
|
|
95
113
|
udid = new_device.udid
|
|
96
114
|
end
|
|
97
115
|
|
|
98
|
-
should '
|
|
116
|
+
should '9900. delete the device' do
|
|
99
117
|
device = SimCtl.device(udid: udid)
|
|
100
118
|
device.delete!
|
|
101
119
|
assert_nil SimCtl.device(udid: udid)
|
|
@@ -5,6 +5,10 @@ class SimCtl::Command::ListTest < Minitest::Test
|
|
|
5
5
|
should 'find device type by name' do
|
|
6
6
|
assert_kind_of SimCtl::DeviceType, SimCtl.devicetype(name: 'iPhone 5')
|
|
7
7
|
end
|
|
8
|
+
|
|
9
|
+
should 'raise exception if device type is not found' do
|
|
10
|
+
assert_raises { SimCtl.devicetype(name: 'iPhone 1') }
|
|
11
|
+
end
|
|
8
12
|
end
|
|
9
13
|
|
|
10
14
|
context 'list_devicetypes' do
|
|
@@ -65,7 +69,11 @@ class SimCtl::Command::ListTest < Minitest::Test
|
|
|
65
69
|
|
|
66
70
|
context 'runtime' do
|
|
67
71
|
should 'find runtime by name' do
|
|
68
|
-
assert_kind_of SimCtl::Runtime, SimCtl.runtime(name: 'iOS 9.
|
|
72
|
+
assert_kind_of SimCtl::Runtime, SimCtl.runtime(name: 'iOS 9.3')
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
should 'raise exception if runtime is not found' do
|
|
76
|
+
assert_raises { SimCtl.runtime(name: 'iOS 17.0') }
|
|
69
77
|
end
|
|
70
78
|
end
|
|
71
79
|
|
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.
|
|
4
|
+
version: 1.5.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-
|
|
11
|
+
date: 2016-04-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -90,6 +90,7 @@ files:
|
|
|
90
90
|
- ".coveralls.yml"
|
|
91
91
|
- ".gitignore"
|
|
92
92
|
- ".travis.yml"
|
|
93
|
+
- CHANGELOG.md
|
|
93
94
|
- Gemfile
|
|
94
95
|
- Gemfile.lock
|
|
95
96
|
- LICENSE
|
|
@@ -101,6 +102,7 @@ files:
|
|
|
101
102
|
- lib/simctl/command/create.rb
|
|
102
103
|
- lib/simctl/command/delete.rb
|
|
103
104
|
- lib/simctl/command/erase.rb
|
|
105
|
+
- lib/simctl/command/install.rb
|
|
104
106
|
- lib/simctl/command/kill.rb
|
|
105
107
|
- lib/simctl/command/launch.rb
|
|
106
108
|
- lib/simctl/command/list.rb
|
|
@@ -117,6 +119,13 @@ files:
|
|
|
117
119
|
- lib/simctl/runtime.rb
|
|
118
120
|
- lib/simctl/version.rb
|
|
119
121
|
- simctl.gemspec
|
|
122
|
+
- test/SampleApp/.gitignore
|
|
123
|
+
- test/SampleApp/SampleApp.xcodeproj/project.pbxproj
|
|
124
|
+
- test/SampleApp/SampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
|
|
125
|
+
- test/SampleApp/SampleApp/AppDelegate.h
|
|
126
|
+
- test/SampleApp/SampleApp/AppDelegate.m
|
|
127
|
+
- test/SampleApp/SampleApp/Info.plist
|
|
128
|
+
- test/SampleApp/SampleApp/main.m
|
|
120
129
|
- test/simctl/command/crud_test.rb
|
|
121
130
|
- test/simctl/command/list_test.rb
|
|
122
131
|
- test/test_helper.rb
|
|
@@ -145,6 +154,13 @@ signing_key:
|
|
|
145
154
|
specification_version: 4
|
|
146
155
|
summary: Ruby interface to xcrun simctl
|
|
147
156
|
test_files:
|
|
157
|
+
- test/SampleApp/.gitignore
|
|
158
|
+
- test/SampleApp/SampleApp.xcodeproj/project.pbxproj
|
|
159
|
+
- test/SampleApp/SampleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
|
|
160
|
+
- test/SampleApp/SampleApp/AppDelegate.h
|
|
161
|
+
- test/SampleApp/SampleApp/AppDelegate.m
|
|
162
|
+
- test/SampleApp/SampleApp/Info.plist
|
|
163
|
+
- test/SampleApp/SampleApp/main.m
|
|
148
164
|
- test/simctl/command/crud_test.rb
|
|
149
165
|
- test/simctl/command/list_test.rb
|
|
150
166
|
- test/test_helper.rb
|