fourflusher 1.0.1 → 2.0.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/.gitignore +0 -1
- data/.travis.yml +5 -2
- data/CHANGELOG.md +89 -0
- data/Gemfile.lock +47 -0
- data/lib/fourflusher/find.rb +85 -48
- data/lib/fourflusher/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 51d11f36e15ae2cef0aec386296a4ff9888ece0e
|
4
|
+
data.tar.gz: a363748b2fd402115f6ca433f802f22160ead987
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eea706a0d6b0bb7bb538557a729b398714e4b45c354168ff2544f3e5fd0d8aad46b33bd6e21812bedb3838b9c6261b370c844baa5cc0a35c23e836d3f4773d12
|
7
|
+
data.tar.gz: e327d66420dcf7c0178bcf7a52ad8cdda85ae06599980b78c3be2e8a4eee97f5c414cb4492efb89753d43ea8f0e7701f3213697b61775c1292455a2b4bb42193
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
language: ruby
|
2
2
|
os: osx
|
3
|
-
osx_image:
|
4
|
-
rvm: 2.0.0-
|
3
|
+
osx_image: xcode8
|
4
|
+
rvm: 2.0.0-p648
|
5
5
|
cache: bundler
|
6
6
|
before_install: gem install bundler
|
7
|
+
before_script:
|
8
|
+
# Useful for reference while reviewing travis failures
|
9
|
+
- xcrun simctl list -j devices
|
7
10
|
script:
|
8
11
|
- bundle exec rake spec
|
9
12
|
- bundle exec rake rubocop
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
|
2
|
+
## 2.0.0 (2016-10-02)
|
3
|
+
|
4
|
+
##### Enhancements
|
5
|
+
|
6
|
+
* None
|
7
|
+
|
8
|
+
##### Bug Fixes
|
9
|
+
|
10
|
+
* None
|
11
|
+
|
12
|
+
## v2.0.0 (2016-10-02)
|
13
|
+
|
14
|
+
##### Breaking
|
15
|
+
|
16
|
+
* Use JSON output from `xcrun simctl list`. Drop support for Xcode 6 (doesn't support JSON output)
|
17
|
+
[Ben Asher](https://github.com/benasher44)
|
18
|
+
[#6](https://github.com/CocoaPods/fourflusher/pull/6)
|
19
|
+
|
20
|
+
##### Enhancements
|
21
|
+
|
22
|
+
* Update simulator count for Travis
|
23
|
+
[Boris Bügling](https://github.com/neonichu)
|
24
|
+
[#5](https://github.com/CocoaPods/fourflusher/pull/5)
|
25
|
+
|
26
|
+
* A more helpful error message for missing simulators
|
27
|
+
[Radek Pietruszewski](https://github.com/radex)
|
28
|
+
[#4](https://github.com/CocoaPods/fourflusher/pull/4)
|
29
|
+
|
30
|
+
##### Bug Fixes
|
31
|
+
|
32
|
+
* None
|
33
|
+
|
34
|
+
## v1.0.1 (2016-06-25)
|
35
|
+
|
36
|
+
##### Enhancements
|
37
|
+
|
38
|
+
* Show better error for `:oldest` simulator search
|
39
|
+
[Boris Bügling](https://github.com/neonichu)
|
40
|
+
|
41
|
+
## v1.0.0 (2016-06-24)
|
42
|
+
|
43
|
+
##### Enhancements
|
44
|
+
|
45
|
+
* Improve finding simulators
|
46
|
+
[Boris Bügling](https://github.com/neonichu)
|
47
|
+
|
48
|
+
## v0.3.2 (2016-06-16)
|
49
|
+
|
50
|
+
##### Enhancements
|
51
|
+
|
52
|
+
* Support for parsing iOS 10.0 and tvOS 10.0
|
53
|
+
[Boris Bügling](https://github.com/neonichu)
|
54
|
+
|
55
|
+
##### Bug Fixes
|
56
|
+
|
57
|
+
* Rubocop fixes
|
58
|
+
[Boris Bügling](https://github.com/neonichu)
|
59
|
+
|
60
|
+
## v0.3.1 (2016-05-30)
|
61
|
+
|
62
|
+
##### Enhancements
|
63
|
+
|
64
|
+
* Travis CI improvements
|
65
|
+
[Boris Bügling](https://github.com/neonichu)
|
66
|
+
[#1](https://github.com/CocoaPods/fourflusher/pull/1)
|
67
|
+
|
68
|
+
* Handle missing Xcode more gracefully
|
69
|
+
[Boris Bügling](https://github.com/neonichu)
|
70
|
+
|
71
|
+
## v0.3.0 (2015-12-29)
|
72
|
+
|
73
|
+
##### Enhancements
|
74
|
+
|
75
|
+
* Allow specifying constraints for `destination()`
|
76
|
+
[Boris Bügling](https://github.com/neonichu)
|
77
|
+
|
78
|
+
## v0.2.0 (2015-12-29)
|
79
|
+
|
80
|
+
##### Enhancements
|
81
|
+
|
82
|
+
* Allow constraining simulators by OS version
|
83
|
+
[Boris Bügling](https://github.com/neonichu)
|
84
|
+
|
85
|
+
## v0.1.0 (2015-12-18)
|
86
|
+
|
87
|
+
* List usable simulators. Find simulators by name. Get the destination setting for the simulator to pass to Xcodebuild
|
88
|
+
[Boris Bügling](https://github.com/neonichu)
|
89
|
+
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
fourflusher (2.0.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
ast (2.3.0)
|
10
|
+
astrolabe (1.3.1)
|
11
|
+
parser (~> 2.2)
|
12
|
+
diff-lcs (1.2.5)
|
13
|
+
parser (2.3.1.4)
|
14
|
+
ast (~> 2.2)
|
15
|
+
powerpack (0.1.1)
|
16
|
+
rainbow (2.1.0)
|
17
|
+
rake (10.5.0)
|
18
|
+
rspec (2.99.0)
|
19
|
+
rspec-core (~> 2.99.0)
|
20
|
+
rspec-expectations (~> 2.99.0)
|
21
|
+
rspec-mocks (~> 2.99.0)
|
22
|
+
rspec-core (2.99.2)
|
23
|
+
rspec-expectations (2.99.2)
|
24
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
25
|
+
rspec-mocks (2.99.4)
|
26
|
+
rubocop (0.35.1)
|
27
|
+
astrolabe (~> 1.3)
|
28
|
+
parser (>= 2.2.3.0, < 3.0)
|
29
|
+
powerpack (~> 0.1)
|
30
|
+
rainbow (>= 1.99.1, < 3.0)
|
31
|
+
ruby-progressbar (~> 1.7)
|
32
|
+
tins (<= 1.6.0)
|
33
|
+
ruby-progressbar (1.8.1)
|
34
|
+
tins (1.6.0)
|
35
|
+
|
36
|
+
PLATFORMS
|
37
|
+
ruby
|
38
|
+
|
39
|
+
DEPENDENCIES
|
40
|
+
bundler (~> 1.11)
|
41
|
+
fourflusher!
|
42
|
+
rake (~> 10.0)
|
43
|
+
rspec (~> 2)
|
44
|
+
rubocop (~> 0.35.0)
|
45
|
+
|
46
|
+
BUNDLED WITH
|
47
|
+
1.13.1
|
data/lib/fourflusher/find.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'fourflusher/simctl'
|
2
|
+
require 'json'
|
2
3
|
require 'rubygems/version'
|
3
4
|
|
4
5
|
module Fourflusher
|
@@ -8,12 +9,6 @@ module Fourflusher
|
|
8
9
|
attr_reader :name
|
9
10
|
attr_reader :os_version
|
10
11
|
|
11
|
-
def self.match(line, os_name, os_version)
|
12
|
-
sims = []
|
13
|
-
@@sim_regex.match(line) { |m| sims << Simulator.new(m, os_name, Gem::Version.new(os_version)) }
|
14
|
-
sims
|
15
|
-
end
|
16
|
-
|
17
12
|
def os_name
|
18
13
|
@os_name.downcase.to_sym
|
19
14
|
end
|
@@ -26,73 +21,115 @@ module Fourflusher
|
|
26
21
|
"#{@name} (#{@id}) - #{@os_name} #{@os_version}"
|
27
22
|
end
|
28
23
|
|
29
|
-
|
24
|
+
# Compare function for sorting simulators in order by
|
25
|
+
# - OS Name: ascending
|
26
|
+
# - OS Version: descending
|
27
|
+
# - Device type: iPhone first, then ascending
|
28
|
+
# - Model: ascending
|
29
|
+
def sim_list_compare(other)
|
30
|
+
return os_name.to_s <=> other.os_name.to_s unless os_name == other.os_name
|
31
|
+
return other.os_version <=> os_version unless os_version == other.os_version
|
32
|
+
device1, model1 = device_and_model
|
33
|
+
device2, model2 = other.device_and_model
|
34
|
+
unless device1 == device2
|
35
|
+
return -1 if device1 == 'iPhone'
|
36
|
+
return 1 if device2 == 'iPhone'
|
37
|
+
return device1 <=> device2
|
38
|
+
end
|
39
|
+
model1 <=> model2
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns the [device, model] for use during sorting
|
43
|
+
# Examples: [iPhone, 5s], [iPhone, 6s Plus], [Apple Watch Series 2, 38mm]
|
44
|
+
def device_and_model
|
45
|
+
if os_name == :watchos
|
46
|
+
# Sample string: Apple Watch Series 2 - 38mm
|
47
|
+
name.split ' - '
|
48
|
+
else
|
49
|
+
# Sample string: "iPhone 5s" or "iPhone 6 Plus" or "iPad Air 2"
|
50
|
+
if name.start_with? 'Apple TV'
|
51
|
+
# The last part is the model, and the rest is the device
|
52
|
+
parts = name.rpartition(' ').reject { |str| str.strip.empty? }
|
53
|
+
[parts[0...-1].join(' '), parts.drop(parts.count - 1).join(' ')].map(&:strip)
|
54
|
+
else
|
55
|
+
# The first part is device, and the rest is the model
|
56
|
+
name.split ' ', 2
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
30
60
|
|
31
|
-
|
61
|
+
private
|
32
62
|
|
33
|
-
def initialize(
|
34
|
-
@id =
|
35
|
-
@name =
|
63
|
+
def initialize(device_json, os_name, os_version)
|
64
|
+
@id = device_json['udid']
|
65
|
+
@name = device_json['name']
|
36
66
|
@os_name = os_name
|
37
|
-
@os_version = os_version
|
67
|
+
@os_version = Gem::Version.new os_version
|
38
68
|
end
|
39
69
|
end
|
40
70
|
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
71
|
+
# {
|
72
|
+
# "devices" : {
|
73
|
+
# "iOS 10.0" : [
|
74
|
+
# {
|
75
|
+
# "state" : "Shutdown",
|
76
|
+
# "availability" : "(available)",
|
77
|
+
# "name" : "iPhone 5",
|
78
|
+
# "udid" : "B7D21008-CC16-47D6-A9A9-885FE1FC47A8"
|
79
|
+
# },
|
80
|
+
# {
|
81
|
+
# "state" : "Shutdown",
|
82
|
+
# "availability" : "(available)",
|
83
|
+
# "name" : "iPhone 5s",
|
84
|
+
# "udid" : "38EAE7BD-90C3-4C3D-A672-3AF683EEC5A2"
|
85
|
+
# },
|
86
|
+
# ]
|
87
|
+
# }
|
88
|
+
# }
|
59
89
|
|
60
90
|
# Executes `simctl` commands
|
61
91
|
class SimControl
|
62
|
-
def initialize
|
63
|
-
@os_regex = /^-- (?<os_name>.*?) (?<os_version>[0-9][0-9]?\.[0-9]) --$/
|
64
|
-
end
|
65
|
-
|
66
92
|
def simulator(filter, os_name = :ios, minimum_version = '1.0')
|
67
93
|
usable_simulators(filter, os_name, minimum_version).first
|
68
94
|
end
|
69
95
|
|
70
96
|
def usable_simulators(filter = nil, os = :ios, minimum_version = '1.0')
|
71
|
-
|
72
|
-
os_version = ''
|
73
|
-
sims = []
|
74
|
-
|
75
|
-
list(['devices']).lines.each do |line|
|
76
|
-
@os_regex.match(line) do |m|
|
77
|
-
os_name = m['os_name']
|
78
|
-
os_version = m['os_version']
|
79
|
-
end
|
80
|
-
sims += Simulator.match(line, os_name, os_version)
|
81
|
-
end
|
82
|
-
|
97
|
+
sims = fetch_sims
|
83
98
|
oses = sims.map(&:os_name).uniq
|
84
99
|
os = os.downcase.to_sym
|
85
|
-
|
100
|
+
|
101
|
+
unless oses.include?(os)
|
102
|
+
fail "Could not find a `#{os}` simulator (valid values: #{oses.join(', ')}). Ensure that "\
|
103
|
+
"Xcode -> Window -> Devices has at least one `#{os}` simulator listed or otherwise add one."
|
104
|
+
end
|
86
105
|
|
87
106
|
return sims if filter.nil?
|
88
107
|
minimum_version = Gem::Version.new(minimum_version)
|
89
108
|
sims = sims.select { |sim| sim.os_name == os && sim.compatible?(minimum_version) }
|
90
109
|
|
91
|
-
return [sims.
|
110
|
+
return [sims.min_by(&:os_version)] if filter == :oldest
|
92
111
|
|
93
112
|
found_sims = sims.select { |sim| sim.name == filter }
|
94
113
|
return found_sims if found_sims.count > 0
|
95
114
|
sims.select { |sim| sim.name.start_with?(filter) }
|
96
115
|
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
# Gets the simulators and transforms the simctl json into Simulator objects
|
120
|
+
def fetch_sims
|
121
|
+
device_list = JSON.parse(list(['-j', 'devices']))['devices']
|
122
|
+
unless device_list.is_a?(Hash)
|
123
|
+
msg = "Expected devices to be of type Hash but instated found #{device_list.class}"
|
124
|
+
fail Fourflusher::Informative, msg
|
125
|
+
end
|
126
|
+
device_list.flat_map do |runtime_str, devices|
|
127
|
+
# Sample string: iOS 9.3
|
128
|
+
os_name, os_version = runtime_str.split ' '
|
129
|
+
devices.map do |device|
|
130
|
+
Simulator.new(device, os_name, os_version) if device['availability'] == '(available)'
|
131
|
+
end
|
132
|
+
end.compact.sort(&:sim_list_compare)
|
133
|
+
end
|
97
134
|
end
|
98
135
|
end
|
data/lib/fourflusher/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fourflusher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Boris Bügling
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -76,7 +76,9 @@ files:
|
|
76
76
|
- .gitignore
|
77
77
|
- .rubocop.yml
|
78
78
|
- .travis.yml
|
79
|
+
- CHANGELOG.md
|
79
80
|
- Gemfile
|
81
|
+
- Gemfile.lock
|
80
82
|
- LICENSE.txt
|
81
83
|
- README.md
|
82
84
|
- Rakefile
|
@@ -115,4 +117,3 @@ signing_key:
|
|
115
117
|
specification_version: 4
|
116
118
|
summary: A library for interacting with Xcode simulators.
|
117
119
|
test_files: []
|
118
|
-
has_rdoc:
|