fourflusher 1.0.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|