fourflusher 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0b9b1b16d80d85f6951d9677e82ee5fa4ca8799b
4
+ data.tar.gz: 0988f174ba49fa20ed9f589d5c9e06413ab8d832
5
+ SHA512:
6
+ metadata.gz: 4a22323c2beb75d477040ccad026f74b2f011f3893be39422d5077a4b4fcfa229fd8a12588dfa0fdbae18aa8f4e2f1ddbad096e7edecf4be46684d9849f84656
7
+ data.tar.gz: 0e38f04530f78e9893f9d26b015d4b2e080aa0add5792321ff15bdd30dda31c9ef2922c3719426137804debbfb3e41e8e4323d5efcb7f8934f3fd8ed922fa906
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
@@ -0,0 +1,26 @@
1
+ Metrics/AbcSize:
2
+ Max: 25
3
+
4
+ Metrics/CyclomaticComplexity:
5
+ Max: 10
6
+
7
+ Metrics/LineLength:
8
+ Max: 100
9
+
10
+ Metrics/MethodLength:
11
+ Max: 30
12
+
13
+ Style/AsciiComments:
14
+ Exclude:
15
+ - 'lib/fourflusher/executable.rb'
16
+
17
+ Style/ClassVars:
18
+ Exclude:
19
+ - 'lib/fourflusher/find.rb'
20
+
21
+ Style/Documentation:
22
+ Exclude:
23
+ - 'spec/**/*'
24
+ - 'test/**/*'
25
+ - 'lib/fourflusher/version.rb'
26
+ - 'lib/fourflusher/compat.rb'
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm: 2.0.0-p598
3
+ cache: bundler
4
+ script:
5
+ - bundle exec rake spec
6
+ - bundle exec rake rubocop
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Boris Bügling
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,37 @@
1
+ # four-flusher
2
+
3
+ A library for interacting with Xcode simulators.
4
+
5
+ ## Usage
6
+
7
+ TODO: Write usage instructions here
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'fourflusher'
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install fourflusher
24
+
25
+ ## Development
26
+
27
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
28
+
29
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
30
+
31
+ ## Contributing
32
+
33
+ Bug reports and pull requests are welcome on GitHub at https://github.com/neonichu/fourflusher.
34
+
35
+ ## License
36
+
37
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new
5
+
6
+ require 'rubocop/rake_task'
7
+ RuboCop::RakeTask.new(:rubocop)
8
+
9
+ task default: [:spec, :rubocop]
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'fourflusher'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fourflusher/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'fourflusher'
8
+ spec.version = Fourflusher::VERSION
9
+ spec.authors = ['Boris Bügling']
10
+ spec.email = ['boris@icculus.org']
11
+
12
+ spec.summary = 'A library for interacting with Xcode simulators.'
13
+ spec.homepage = 'https://github.com/neonichu/fourflusher'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ }
19
+ spec.bindir = 'exe'
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.add_development_dependency 'bundler', '~> 1.11'
24
+ spec.add_development_dependency 'rake', '~> 10.0'
25
+ spec.add_development_dependency 'rspec', '~> 2'
26
+ spec.add_development_dependency 'rubocop', '~> 0.35.0'
27
+ end
@@ -0,0 +1,3 @@
1
+ require 'fourflusher/find'
2
+ require 'fourflusher/version'
3
+ require 'fourflusher/xcodebuild'
@@ -0,0 +1,21 @@
1
+ module Fourflusher
2
+ class Config
3
+ def self.instance
4
+ @instance || new
5
+ end
6
+
7
+ def verbose?
8
+ false
9
+ end
10
+ end
11
+
12
+ class UI
13
+ def self.indentation_level
14
+ 0
15
+ end
16
+
17
+ def self.message(message)
18
+ print(message)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,236 @@
1
+ require 'fourflusher/compat'
2
+
3
+ # This file is a verbatim copy from CocoaPods, a project licensed under the MIT license.
4
+
5
+ # Copyright (c) 2011 - 2015 Eloy Durán <eloy.de.enige@gmail.com>,
6
+ # Fabio Pelosin <fabiopelosin@gmail.com>,
7
+ # Samuel Giddins <segiddins@segiddins.me>,
8
+ # Marius Rackwitz <git@mariusrackwitz.de>,
9
+ # Kyle Fuller <kyle@fuller.li>,
10
+ # Boris Bügling <boris@buegling.com>,
11
+ # Orta Therox <orta.therox@gmail.com>, and
12
+ # Olivier Halligon <olivier@halligon.net>.
13
+
14
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
15
+ # of this software and associated documentation files (the "Software"), to deal
16
+ # in the Software without restriction, including without limitation the rights
17
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18
+ # copies of the Software, and to permit persons to whom the Software is
19
+ # furnished to do so, subject to the following conditions:
20
+
21
+ # The above copyright notice and this permission notice shall be included in
22
+ # all copies or substantial portions of the Software.
23
+
24
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
30
+ # THE SOFTWARE.
31
+
32
+ module Fourflusher
33
+ # Module which provides support for running executables.
34
+ #
35
+ # In a class it can be used as:
36
+ #
37
+ # extend Executable
38
+ # executable :git
39
+ #
40
+ # This will create two methods `git` and `git!` both accept a command but
41
+ # the later will raise on non successful executions. The methods return the
42
+ # output of the command.
43
+ #
44
+ module Executable
45
+ # Creates the methods for the executable with the given name.
46
+ #
47
+ # @param [Symbol] name
48
+ # the name of the executable.
49
+ #
50
+ # @return [void]
51
+ #
52
+ def executable(name)
53
+ define_method(name) do |*command|
54
+ Executable.execute_command(name, Array(command).flatten, false)
55
+ end
56
+
57
+ define_method(name.to_s + '!') do |*command|
58
+ Executable.execute_command(name, Array(command).flatten, true)
59
+ end
60
+ end
61
+
62
+ # Executes the given command displaying it if in verbose mode.
63
+ #
64
+ # @param [String] bin
65
+ # The binary to use.
66
+ #
67
+ # @param [Array<#to_s>] command
68
+ # The command to send to the binary.
69
+ #
70
+ # @param [Bool] raise_on_failure
71
+ # Whether it should raise if the command fails.
72
+ #
73
+ # @raise If the executable could not be located.
74
+ #
75
+ # @raise If the command fails and the `raise_on_failure` is set to true.
76
+ #
77
+ # @return [String] the output of the command (STDOUT and STDERR).
78
+ #
79
+ def self.execute_command(executable, command, raise_on_failure = true)
80
+ bin = which(executable)
81
+ fail Informative, "Unable to locate the executable `#{executable}`" unless bin
82
+
83
+ command = command.map(&:to_s)
84
+ full_command = "#{bin} #{command.join(' ')}"
85
+
86
+ if Config.instance.verbose?
87
+ UI.message("$ #{full_command}")
88
+ stdout = Indenter.new(STDOUT)
89
+ stderr = Indenter.new(STDERR)
90
+ else
91
+ stdout = Indenter.new
92
+ stderr = Indenter.new
93
+ end
94
+
95
+ status = popen3(bin, command, stdout, stderr)
96
+ stdout = stdout.join
97
+ stderr = stderr.join
98
+ output = stdout + stderr
99
+ unless status.success?
100
+ if raise_on_failure
101
+ fail Informative, "#{full_command}\n\n#{output}"
102
+ else
103
+ UI.message("[!] Failed: #{full_command}".red)
104
+ end
105
+ end
106
+
107
+ output
108
+ end
109
+
110
+ # Returns the absolute path to the binary with the given name on the current
111
+ # `PATH`, or `nil` if none is found.
112
+ #
113
+ # @param [String] program
114
+ # The name of the program being searched for.
115
+ #
116
+ # @return [String,Nil] The absolute path to the given program, or `nil` if
117
+ # it wasn't found in the current `PATH`.
118
+ #
119
+ def self.which(program)
120
+ program = program.to_s
121
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
122
+ bin = File.expand_path(program, path)
123
+ return bin if File.file?(bin) && File.executable?(bin)
124
+ end
125
+ nil
126
+ end
127
+
128
+ # Runs the given command, capturing the desired output.
129
+ #
130
+ # @param [String] bin
131
+ # The binary to use.
132
+ #
133
+ # @param [Array<#to_s>] command
134
+ # The command to send to the binary.
135
+ #
136
+ # @param [Symbol] capture
137
+ # Whether it should raise if the command fails.
138
+ #
139
+ # @raise If the executable could not be located.
140
+ #
141
+ # @return [(String, Process::Status)]
142
+ # The desired captured output from the command, and the status from
143
+ # running the command.
144
+ #
145
+ def self.capture_command(executable, command, capture: :merge)
146
+ bin = which(executable)
147
+ fail Informative, "Unable to locate the executable `#{executable}`" unless bin
148
+
149
+ require 'open3'
150
+ command = command.map(&:to_s)
151
+ case capture
152
+ when :merge then Open3.capture2e(bin, *command)
153
+ when :both then Open3.capture3(bin, *command)
154
+ when :out then Open3.capture2(bin, *command)
155
+ when :err then Open3.capture3(bin, *command).drop(1)
156
+ when :none then Open3.capture2(bin, *command).last
157
+ end
158
+ end
159
+
160
+ private
161
+
162
+ def self.popen3(bin, command, stdout, stderr)
163
+ require 'open3'
164
+ Open3.popen3(bin, *command) do |i, o, e, t|
165
+ reader(o, stdout)
166
+ reader(e, stderr)
167
+ i.close
168
+
169
+ status = t.value
170
+
171
+ o.flush
172
+ e.flush
173
+ sleep(0.01)
174
+
175
+ status
176
+ end
177
+ end
178
+
179
+ def self.reader(input, output)
180
+ Thread.new do
181
+ buf = ''
182
+ begin
183
+ loop do
184
+ buf << input.readpartial(4096)
185
+ loop do
186
+ string, separator, buf = buf.partition(/[\r\n]/)
187
+ if separator.empty?
188
+ buf = string
189
+ break
190
+ end
191
+ output << (string << separator)
192
+ end
193
+ end
194
+ rescue EOFError
195
+ output << (buf << $INPUT_RECORD_SEPARATOR) unless buf.empty?
196
+ end
197
+ end
198
+ end
199
+
200
+ #-------------------------------------------------------------------------#
201
+
202
+ # Helper class that allows to write to an {IO} instance taking into account
203
+ # the UI indentation level.
204
+ #
205
+ class Indenter < ::Array
206
+ # @return [Fixnum] The indentation level of the UI.
207
+ #
208
+ attr_accessor :indent
209
+
210
+ # @return [IO] the {IO} to which the output should be printed.
211
+ #
212
+ attr_accessor :io
213
+
214
+ # Init a new Indenter
215
+ #
216
+ # @param [IO] io @see io
217
+ #
218
+ def initialize(io = nil)
219
+ @io = io
220
+ @indent = ' ' * UI.indentation_level
221
+ end
222
+
223
+ # Stores a portion of the output and prints it to the {IO} instance.
224
+ #
225
+ # @param [String] value
226
+ # the output to print.
227
+ #
228
+ # @return [void]
229
+ #
230
+ def <<(value)
231
+ super
232
+ io << "#{indent}#{value}" if io
233
+ end
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,79 @@
1
+ require 'fourflusher/simctl'
2
+
3
+ module Fourflusher
4
+ # Metadata about an installed Xcode simulator
5
+ class Simulator
6
+ attr_reader :id
7
+ attr_reader :name
8
+ attr_reader :os_name
9
+ attr_reader :os_version
10
+
11
+ def self.match(line, os_name, os_version)
12
+ sims = []
13
+ @@sim_regex.match(line) { |m| sims << Simulator.new(m, os_name, os_version) }
14
+ sims
15
+ end
16
+
17
+ def to_s
18
+ "#{@name} (#{@id}) - #{@os_name} #{@os_version}"
19
+ end
20
+
21
+ private
22
+
23
+ @@sim_regex = /^\s*(?<sim_name>[^\)]*?) \((?<sim_id>[^\)]*?)\) \((?<sim_state>[^\)]*?)\)$/
24
+
25
+ def initialize(match_data, os_name, os_version)
26
+ @id = match_data['sim_id']
27
+ @name = match_data['sim_name']
28
+ @os_name = os_name
29
+ @os_version = os_version
30
+ end
31
+ end
32
+
33
+ # -- iOS 9.2 --
34
+ # iPhone 4s (C0404A23-2D2D-4208-8CEC-774194D06759) (Shutdown)
35
+ # iPhone 5 (7A0F62DD-8330-44F0-9828-AC8B1BC9BF05) (Shutdown)
36
+ # iPhone 5s (51C1CB50-FBCB-47ED-B8FF-68C816BF0932) (Shutdown)
37
+ # iPhone 6 (6F4E143A-6914-476E-90BF-51B680B8E2EF) (Shutdown)
38
+ # iPhone 6 Plus (BEB9BFE9-AF1A-4FEA-9FA5-CAFD5243CA42) (Shutdown)
39
+ # iPhone 6s (98DB904B-DF98-4F3C-AB21-A4D133604BA4) (Shutdown)
40
+ # iPhone 6s Plus (65838307-4C03-4DD3-84E4-A6477CFD3490) (Shutdown)
41
+ # iPad 2 (349C1313-6C9C-48C6-8849-DAB18BE2F15C) (Shutdown)
42
+ # iPad Retina (30909168-4C90-48CD-B142-86DCF7B1372A) (Shutdown)
43
+ # iPad Air (A8B5F651-C215-459C-95C6-663194F2277B) (Shutdown)
44
+ # iPad Air 2 (BFDB363E-D514-490C-A1D6-AC86402089BA) (Shutdown)
45
+ # iPad Pro (AE5DA548-66F6-4FCE-AA6D-5E6E17CD721E) (Shutdown)
46
+ # -- tvOS 9.1 --
47
+ # Apple TV 1080p (C5A44868-685C-4D72-BEBD-102246C870F7) (Shutdown)
48
+ # -- watchOS 2.1 --
49
+ # Apple Watch - 38mm (FE557B65-A044-44C3-96AC-2EAC395A6090) (Shutdown)
50
+ # Apple Watch - 42mm (C9138FAE-6812-4BB5-A463-76520C116AF4) (Shutdown)
51
+
52
+ # Executes `simctl` commands
53
+ class SimControl
54
+ def initialize
55
+ @os_regex = /^-- (?<os_name>.*?) (?<os_version>[0-9].[0-9]) --$/
56
+ end
57
+
58
+ def simulator(filter)
59
+ usable_simulators(filter).first
60
+ end
61
+
62
+ def usable_simulators(filter = nil)
63
+ os_name = ''
64
+ os_version = ''
65
+ sims = []
66
+
67
+ list(['devices']).lines.each do |line|
68
+ @os_regex.match(line) do |m|
69
+ os_name = m['os_name']
70
+ os_version = m['os_version']
71
+ end
72
+ sims += Simulator.match(line, os_name, os_version)
73
+ end
74
+
75
+ return sims if filter.nil?
76
+ sims.select { |sim| sim.name == filter }
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,19 @@
1
+ require 'fourflusher/executable'
2
+
3
+ module Fourflusher
4
+ # Executes `simctl` commands
5
+ class SimControl
6
+ extend Executable
7
+ executable :xcrun
8
+
9
+ def list(args)
10
+ simctl!(['list'] + args)
11
+ end
12
+
13
+ private
14
+
15
+ def simctl!(args)
16
+ xcrun!(['simctl'] + args)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module Fourflusher
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,11 @@
1
+ require 'fourflusher/find'
2
+
3
+ module Fourflusher
4
+ class SimControl
5
+ def destination(filter)
6
+ sim = simulator(filter)
7
+ raise "Simulator #{filter} is not available." if sim.nil?
8
+ ['-destination', "id=#{sim.id}"]
9
+ end
10
+ end
11
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fourflusher
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Boris Bügling
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-12-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.35.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 0.35.0
69
+ description:
70
+ email:
71
+ - boris@icculus.org
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .rubocop.yml
78
+ - .travis.yml
79
+ - Gemfile
80
+ - LICENSE.txt
81
+ - README.md
82
+ - Rakefile
83
+ - bin/console
84
+ - bin/setup
85
+ - fourflusher.gemspec
86
+ - lib/fourflusher.rb
87
+ - lib/fourflusher/compat.rb
88
+ - lib/fourflusher/executable.rb
89
+ - lib/fourflusher/find.rb
90
+ - lib/fourflusher/simctl.rb
91
+ - lib/fourflusher/version.rb
92
+ - lib/fourflusher/xcodebuild.rb
93
+ homepage: https://github.com/neonichu/fourflusher
94
+ licenses:
95
+ - MIT
96
+ metadata: {}
97
+ post_install_message:
98
+ rdoc_options: []
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ requirements: []
112
+ rubyforge_project:
113
+ rubygems_version: 2.0.14
114
+ signing_key:
115
+ specification_version: 4
116
+ summary: A library for interacting with Xcode simulators.
117
+ test_files: []
118
+ has_rdoc: