xcinvoke 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5801a55bb74f9fc80bc999371bfa4076e9b7cf7b
4
+ data.tar.gz: 4d83ebf8936738acf25c676e600ffe234adb85e5
5
+ SHA512:
6
+ metadata.gz: b317b87f5b74c579ab3977e5a0b7e6449069a5f59a0a32314cb0040d4f3a5382658a46998e764e3d20d1b27c4380fc3be7fe888612a775b21f0f1e3d01c62219
7
+ data.tar.gz: 1d060b6f26b1912d9d16f718297cbe92e6310331cd11653bc1c64f8ec73bce19faf396d2955e796c2e91ff978315ef4e0f608b41be1b6e1db651442da4f04d6b
@@ -0,0 +1,8 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
@@ -0,0 +1,71 @@
1
+ AllCops:
2
+ Include:
3
+ - ./Rakefile
4
+ - ./Gemfile
5
+ - ./*.gemspec
6
+
7
+ # At the moment not ready to be used
8
+ # https://github.com/bbatsov/rubocop/issues/947
9
+ Documentation:
10
+ Enabled: false
11
+
12
+ #- XCInvoke -----------------------------------------------------------------#
13
+
14
+ Metrics/LineLength:
15
+ Max: 100
16
+
17
+ # 20 lines is more reasonable than rubocop's default of 10
18
+ Metrics/MethodLength:
19
+ Max: 20
20
+
21
+ # We adopted raise instead of fail.
22
+ SignalException:
23
+ EnforcedStyle: only_raise
24
+
25
+ # They are idiomatic
26
+ AssignmentInCondition:
27
+ Enabled: false
28
+
29
+ # Allow backticks
30
+ AsciiComments:
31
+ Enabled: false
32
+
33
+ # Indentation clarifies logic branches in implementations
34
+ IfUnlessModifier:
35
+ Enabled: false
36
+
37
+ # No enforced convention here.
38
+ SingleLineBlockParams:
39
+ Enabled: false
40
+
41
+ # We only add the comment when needed.
42
+ Encoding:
43
+ Enabled: false
44
+
45
+ # Having these make it easier to *not* forget to add one when adding a new
46
+ # value and you can simply copy the previous line.
47
+ TrailingComma:
48
+ EnforcedStyleForMultiline: comma
49
+
50
+ Style/SpecialGlobalVars:
51
+ Enabled: false
52
+
53
+ #- XCInvoke specs -----------------------------------------------------------#
54
+
55
+ # Allow for `should.match /regexp/`.
56
+ AmbiguousRegexpLiteral:
57
+ Exclude:
58
+ - spec/**/*
59
+
60
+ # Allow `object.should == object` syntax.
61
+ Void:
62
+ Exclude:
63
+ - spec/**/*
64
+
65
+ ClassAndModuleChildren:
66
+ Exclude:
67
+ - spec/**/*
68
+
69
+ UselessComparison:
70
+ Exclude:
71
+ - spec/**/*
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ before_install: gem install bundler -v 1.10.6
@@ -0,0 +1,6 @@
1
+ ## 0.1.0
2
+
3
+ ##### Enhancements
4
+
5
+ * Initial release.
6
+ [Samuel Giddins](https://github.com/segiddins)
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in xcinvoke.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ # Code style
8
+ gem 'rubocop'
9
+
10
+ # Tests
11
+ gem 'bacon'
12
+ gem 'mocha'
13
+ gem 'mocha-on-bacon'
14
+ gem 'prettybacon'
15
+ gem 'webmock'
16
+ end
@@ -0,0 +1,57 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ xcinvoke (0.1.0)
5
+ liferaft (~> 0.0.4)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ addressable (2.3.8)
11
+ ast (2.0.0)
12
+ astrolabe (1.3.1)
13
+ parser (~> 2.2)
14
+ bacon (1.2.0)
15
+ crack (0.4.2)
16
+ safe_yaml (~> 1.0.0)
17
+ liferaft (0.0.4)
18
+ metaclass (0.0.4)
19
+ mocha (1.1.0)
20
+ metaclass (~> 0.0.1)
21
+ mocha-on-bacon (0.2.2)
22
+ mocha (>= 0.13.0)
23
+ parser (2.2.2.6)
24
+ ast (>= 1.1, < 3.0)
25
+ powerpack (0.1.1)
26
+ prettybacon (0.0.2)
27
+ bacon (~> 1.2)
28
+ rainbow (2.0.0)
29
+ rake (10.4.2)
30
+ rubocop (0.32.1)
31
+ astrolabe (~> 1.3)
32
+ parser (>= 2.2.2.5, < 3.0)
33
+ powerpack (~> 0.1)
34
+ rainbow (>= 1.99.1, < 3.0)
35
+ ruby-progressbar (~> 1.4)
36
+ ruby-progressbar (1.7.5)
37
+ safe_yaml (1.0.4)
38
+ webmock (1.21.0)
39
+ addressable (>= 2.3.6)
40
+ crack (>= 0.3.2)
41
+
42
+ PLATFORMS
43
+ ruby
44
+
45
+ DEPENDENCIES
46
+ bacon
47
+ bundler (~> 1.10)
48
+ mocha
49
+ mocha-on-bacon
50
+ prettybacon
51
+ rake (~> 10.0)
52
+ rubocop
53
+ webmock
54
+ xcinvoke!
55
+
56
+ BUNDLED WITH
57
+ 1.10.6
@@ -0,0 +1,33 @@
1
+ # XCInvoke
2
+
3
+ XCInvoke is a tiny gem that makes managing Xcode versions a breeze.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'xcinvoke'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install xcinvoke
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Development
26
+
27
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. 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/segiddins/xcinvoke.
@@ -0,0 +1,63 @@
1
+ #-- Bootstrap --------------------------------------------------------------#
2
+
3
+ desc 'Initializes your working copy to run the specs'
4
+ task :bootstrap do
5
+ if system('which bundle')
6
+ title 'Installing gems'
7
+ sh 'bundle install'
8
+
9
+ title 'Updating submodules'
10
+ sh 'git submodule update --init --recursive'
11
+ else
12
+ $stderr.puts "\033[0;31m" \
13
+ "[!] Please install the bundler gem manually:\n" \
14
+ ' $ [sudo] gem install bundler' \
15
+ "\e[0m"
16
+ exit 1
17
+ end
18
+ end
19
+
20
+ begin
21
+ require 'bundler/gem_tasks'
22
+ require 'fileutils'
23
+
24
+ task default: :spec
25
+
26
+ #-- Specs ------------------------------------------------------------------#
27
+
28
+ desc 'Run specs'
29
+ task :spec do
30
+ title 'Running Unit Tests'
31
+ files = FileList['spec/**/*_spec.rb']
32
+ .exclude('spec/integration_spec.rb').shuffle.join(' ')
33
+ sh "bundle exec bacon #{files}"
34
+
35
+ title 'Checking Style Conformance'
36
+ Rake::Task['rubocop'].invoke
37
+ end
38
+
39
+ #-- RuboCop ----------------------------------------------------------------#
40
+
41
+ require 'rubocop/rake_task'
42
+ RuboCop::RakeTask.new(:rubocop)
43
+
44
+ rescue LoadError, NameError => e
45
+ $stderr.puts "\033[0;31m" \
46
+ '[!] Some Rake tasks haven been disabled because the environment' \
47
+ ' couldn’t be loaded. Be sure to run `rake bootstrap` first.' \
48
+ "\e[0m"
49
+ $stderr.puts e.message
50
+ $stderr.puts e.backtrace
51
+ $stderr.puts
52
+ end
53
+
54
+ #-- Helpers ------------------------------------------------------------------#
55
+
56
+ def title(title)
57
+ cyan_title = "\033[0;36m#{title}\033[0m"
58
+ puts
59
+ puts '-' * 80
60
+ puts cyan_title
61
+ puts '-' * 80
62
+ puts
63
+ end
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'xcinvoke'
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 'irb'
11
+ IRB.start
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rake' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('rake', 'rake')
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ rake bootstrap
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,4 @@
1
+ module XCInvoke
2
+ require 'xcinvoke/version'
3
+ require 'xcinvoke/xcode'
4
+ end
@@ -0,0 +1,3 @@
1
+ module XCInvoke
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,110 @@
1
+ require 'liferaft'
2
+ require 'open3'
3
+
4
+ module Liferaft
5
+ class Version
6
+ unless instance_methods.include?(:other)
7
+ def <=>(other)
8
+ if self == other
9
+ 0
10
+ elsif self < other
11
+ -1
12
+ else
13
+ 1
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ module XCInvoke
21
+ class Xcode
22
+ extend Enumerable
23
+
24
+ attr_reader :developer_dir
25
+
26
+ def initialize(path)
27
+ @developer_dir = Pathname(path)
28
+ end
29
+
30
+ def self.selected
31
+ dir, = Open3.capture2('xcode-select', '-p', err: '/dev/null')
32
+ new(dir.strip)
33
+ end
34
+
35
+ def self.each(&blk)
36
+ xcodes, = Open3.capture2('mdfind',
37
+ "kMDItemCFBundleIdentifier == 'com.apple.dt.Xcode'",
38
+ err: '/dev/null')
39
+ xcodes = xcodes.split("\n").map(&:strip)
40
+ xcodes = xcodes.map do |xc|
41
+ xc = Pathname(xc) + 'Contents/Developer'
42
+ new(xc)
43
+ end
44
+ xcodes.each(&blk)
45
+ end
46
+
47
+ def self.all
48
+ to_a
49
+ end
50
+
51
+ def self.find_swift_version(swift_version)
52
+ select { |xc| xc.swift_version == swift_version }.sort.last
53
+ end
54
+
55
+ def swift_version
56
+ info = swift_info
57
+ info.first if info
58
+ end
59
+
60
+ def build_number
61
+ info = xcodebuild_info
62
+ info[1] if info
63
+ end
64
+
65
+ def version
66
+ Liferaft::Version.new(build_number)
67
+ end
68
+
69
+ def <=>(other)
70
+ version <=> other.version
71
+ end
72
+
73
+ def xcrun(cmd, env: {})
74
+ env = env.merge(as_env)
75
+ cmd = %w(xcrun) + cmd
76
+ output, = Open3.capture2(env, *cmd, err: '/dev/null')
77
+ output
78
+ end
79
+
80
+ def as_env
81
+ {
82
+ 'DEVELOPER_DIR' => developer_dir.to_path,
83
+ 'DYLD_FRAMEWORK_PATH' => dyld_framework_path.to_path,
84
+ 'DYLD_LIBRARY_PATH' => dyld_library_path.to_path,
85
+ }
86
+ end
87
+
88
+ def dyld_framework_path
89
+ developer_dir + 'Toolchains/XcodeDefault.xctoolchain/usr/lib'
90
+ end
91
+
92
+ def dyld_library_path
93
+ developer_dir + 'Toolchains/XcodeDefault.xctoolchain/usr/lib'
94
+ end
95
+
96
+ private
97
+
98
+ def xcodebuild_info
99
+ xcodebuild_info_regex = /\AXcode (.*?)\s*Build version (.*?)\s*\Z/i
100
+ return unless xcrun(%w(xcodebuild -version)) =~ xcodebuild_info_regex
101
+ [Regexp.last_match(1), Regexp.last_match(2)]
102
+ end
103
+
104
+ def swift_info
105
+ swift_info_regex = /Swift version ([\d\.]+) \(swift(?:lang)?-([\d\.]+)/i
106
+ return unless xcrun(%w(swift --version)) =~ swift_info_regex
107
+ [Regexp.last_match(1), Regexp.last_match(2)]
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'xcinvoke/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'xcinvoke'
8
+ spec.version = XCInvoke::VERSION
9
+ spec.authors = ['Samuel E. Giddins']
10
+ spec.email = ['segiddins@segiddins.me']
11
+
12
+ spec.summary = 'Manage Xcode versions with ease!'
13
+ spec.homepage = 'https://github.com/segiddins/xcinvoke'
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.bindir = 'exe'
17
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.add_runtime_dependency 'liferaft', '~> 0.0.4'
21
+
22
+ spec.add_development_dependency 'bundler', '~> 1.10'
23
+ spec.add_development_dependency 'rake', '~> 10.0'
24
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xcinvoke
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Samuel E. Giddins
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-07-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: liferaft
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.4
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.10'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.10'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ description:
56
+ email:
57
+ - segiddins@segiddins.me
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - ".rubocop.yml"
64
+ - ".travis.yml"
65
+ - CHANGELOG.md
66
+ - Gemfile
67
+ - Gemfile.lock
68
+ - README.md
69
+ - Rakefile
70
+ - bin/console
71
+ - bin/rake
72
+ - bin/setup
73
+ - lib/xcinvoke.rb
74
+ - lib/xcinvoke/version.rb
75
+ - lib/xcinvoke/xcode.rb
76
+ - xcinvoke.gemspec
77
+ homepage: https://github.com/segiddins/xcinvoke
78
+ licenses: []
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.4.8
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Manage Xcode versions with ease!
100
+ test_files: []