brew-flight 0.0.1
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 +7 -0
- data/.gitignore +14 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Brewfile +1 -0
- data/Brewfile.lock +1 -0
- data/Gemfile +4 -0
- data/LICENSE.md +22 -0
- data/Makefile +20 -0
- data/README.md +77 -0
- data/Rakefile +7 -0
- data/bin/flight +5 -0
- data/etc/Brewfile +7 -0
- data/flight.gemspec +25 -0
- data/lib/flight.rb +20 -0
- data/lib/flight/brewfile.rb +83 -0
- data/lib/flight/brewfile/dsl.rb +33 -0
- data/lib/flight/brewfile/lockfile.rb +41 -0
- data/lib/flight/executable.rb +78 -0
- data/lib/flight/package.rb +89 -0
- data/lib/flight/package/collection.rb +37 -0
- data/lib/flight/package/options.rb +30 -0
- data/lib/flight/package/version.rb +20 -0
- data/lib/flight/tap.rb +37 -0
- data/lib/flight/version.rb +3 -0
- data/lib/templates/Brewfile +33 -0
- data/spec/flight/executable_spec.rb +7 -0
- data/spec/flight/package/options_spec.rb +24 -0
- data/spec/flight/package_spec.rb +53 -0
- data/spec/flight_spec.rb +14 -0
- data/spec/spec_helper.rb +6 -0
- metadata +138 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 84187cec81ce54b6adf2d93a36a06c504e60f215
|
4
|
+
data.tar.gz: 99d88bd2876afdfcfc6946d2cd3930ce0377569e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 15460c44d76579ca596eebe3983fd6f7d385a772a127b5c01be71be8efd87f3f817d898f33fae212414e87857333a6a6c50043b795acac87f5e8e4ca9a4476c5
|
7
|
+
data.tar.gz: 574bc23b90d731e1f1c89d4757ff9e9ac6b2274a9a96475544c0209b194d5c557d38fd87c6f2bee20862ca6f84135e20b88f7b6b1792010504d459d3ec6f0f0e
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Brewfile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
brew 'git', '~> 2.2'
|
data/Brewfile.lock
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"flight":{"version":"0.0.1","ruby_version":"2.0.0","brew_version":"0.9.5\n","last_flown":1419060077},"taps":[],"packages":["#<Flight::Package:0x007fc473132b78>"]}
|
data/Gemfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Tom Scott.
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Makefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
.PHONY: all share/man/man.1/flight.1 man build install
|
2
|
+
|
3
|
+
all: man build
|
4
|
+
|
5
|
+
test:
|
6
|
+
bundle exec rspec
|
7
|
+
|
8
|
+
share/man/man.1/flight.1:
|
9
|
+
kramdown-man doc/man/flight.md share/man/man.1/flight.1
|
10
|
+
|
11
|
+
man: share/man/man.1/flight.1
|
12
|
+
|
13
|
+
dependencies:
|
14
|
+
bundle install --path=${PREFIX}/vendor/bundle --deployment
|
15
|
+
|
16
|
+
build: dependencies
|
17
|
+
bundle exec rake build
|
18
|
+
|
19
|
+
install: build
|
20
|
+
sudo gem install ${PREFIX}/pkg/*.gem
|
data/README.md
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
# Flight
|
2
|
+
|
3
|
+
**WARNING:** Flight is untested and probably doesn't work.
|
4
|
+
|
5
|
+
Flight helps manage your Homebrew packages in the same way
|
6
|
+
[Bundler][bundle] helps you manage gem dependencies. With your
|
7
|
+
`Brewfile`, you can tell Homebrew to install packages, configure build
|
8
|
+
options, and even install custom taps.
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Flight is a RubyGem, and for now you can only install it _with_
|
13
|
+
RubyGems:
|
14
|
+
|
15
|
+
```bash
|
16
|
+
$ gem install flight
|
17
|
+
```
|
18
|
+
|
19
|
+
You can also include it as a dependency in your Ruby project with
|
20
|
+
Bundler. Just add this line to your Gemfile and run `bundle`:
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
gem 'flight'
|
24
|
+
```
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
First of all, you'll need a Brewfile before you do anything else.
|
29
|
+
Generate one with the following command:
|
30
|
+
|
31
|
+
```bash
|
32
|
+
$ flight generate
|
33
|
+
```
|
34
|
+
|
35
|
+
Next, edit the Brewfile with the packages you want to install. You can
|
36
|
+
specify version constraints in the same manner as [Bundler][bundle] and
|
37
|
+
[Berkshelf][berks].
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
brew 'vim'
|
41
|
+
brew 'git', '~> 2.2'
|
42
|
+
```
|
43
|
+
|
44
|
+
Once you're all done figuring out the packages you wish to install, it's
|
45
|
+
time to actually run Homebrew. Run the following command to install
|
46
|
+
every package and build a `Brewfile.lock` which saves the state of the
|
47
|
+
current run.
|
48
|
+
|
49
|
+
```bash
|
50
|
+
$ flight install
|
51
|
+
```
|
52
|
+
|
53
|
+
Packages get updated over time, and Flight can handle managing updates
|
54
|
+
and outdated packages. Run the following command to see what's outdated:
|
55
|
+
|
56
|
+
```bash
|
57
|
+
$ flight outdated
|
58
|
+
```
|
59
|
+
|
60
|
+
This will inform you of any formulae that have been updated to build a
|
61
|
+
version past the one you already have installed. You can now run `bundle
|
62
|
+
update PACKAGE` to upgrade just that one package, or `bundle update` to
|
63
|
+
upgrade every package. Flight uses the `brew upgrade` command to update
|
64
|
+
packages.
|
65
|
+
|
66
|
+
## Contributing
|
67
|
+
|
68
|
+
All contributions must include tests.
|
69
|
+
|
70
|
+
1. Fork it ( https://github.com/tubbo/flight/fork )
|
71
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
72
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
73
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
74
|
+
5. Create a new Pull Request
|
75
|
+
|
76
|
+
[bundle]: http://bundler.io
|
77
|
+
[berks]: http://berkshelf.com
|
data/Rakefile
ADDED
data/bin/flight
ADDED
data/etc/Brewfile
ADDED
data/flight.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'flight/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "brew-flight"
|
8
|
+
spec.version = Flight::VERSION
|
9
|
+
spec.authors = ["Tom Scott"]
|
10
|
+
spec.email = ["tscott@telvue.com"]
|
11
|
+
spec.summary = %q{Flight is a Bundler for Homebrew.}
|
12
|
+
spec.description = "#{spec.summary} It helps you manage the Homebrew packages you want on your system."
|
13
|
+
spec.homepage = "http://github.com/tubbo/flight"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "rspec", "~> 3"
|
24
|
+
spec.add_dependency "thor"
|
25
|
+
end
|
data/lib/flight.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require "flight/version"
|
2
|
+
require "flight/executable"
|
3
|
+
|
4
|
+
# Flight is a dependency manager for your Homebrew packages. This is the
|
5
|
+
# base module that includes configuration, global attributes, and
|
6
|
+
# requires to the actual code. Most of the codebase lies in the data
|
7
|
+
# models of Package and Tap, with the Executable being the "controller"
|
8
|
+
# to the UI.
|
9
|
+
|
10
|
+
module Flight
|
11
|
+
DEBUG = ENV['FLIGHT_DEBUG']
|
12
|
+
|
13
|
+
def self.version
|
14
|
+
VERSION
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.debug?
|
18
|
+
!!DEBUG
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'flight/brewfile/dsl'
|
2
|
+
require 'flight/brewfile/lockfile'
|
3
|
+
|
4
|
+
require 'flight/package'
|
5
|
+
require 'flight/tap'
|
6
|
+
|
7
|
+
require 'json'
|
8
|
+
|
9
|
+
module Flight
|
10
|
+
# Parses a Brewfile, responsible for instantiating collections of
|
11
|
+
# Package objects.
|
12
|
+
class Brewfile
|
13
|
+
include DSL
|
14
|
+
|
15
|
+
attr_reader :filename
|
16
|
+
|
17
|
+
attr_reader :lockfile
|
18
|
+
|
19
|
+
attr_accessor :packages
|
20
|
+
|
21
|
+
attr_accessor :taps
|
22
|
+
|
23
|
+
DEFAULT_SOURCE = 'homebrew/homebrew'
|
24
|
+
|
25
|
+
attr_accessor :source_repository
|
26
|
+
|
27
|
+
def initialize(filename='./Brewfile')
|
28
|
+
@filename = File.expand_path(filename)
|
29
|
+
@lockfile = Lockfile.new filename, existing_lockfile_data
|
30
|
+
@packages = Package::Collection.new
|
31
|
+
@taps = Tap::Collection.new
|
32
|
+
@source_repository = DEFAULT_SOURCE
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.parse!
|
36
|
+
file = new
|
37
|
+
file.parse
|
38
|
+
file.lock if file.changed?
|
39
|
+
file
|
40
|
+
end
|
41
|
+
|
42
|
+
def parse
|
43
|
+
instance_eval contents
|
44
|
+
end
|
45
|
+
|
46
|
+
def changed?
|
47
|
+
lockfile.taps != taps.to_json || lockfile.packages != packages.to_json
|
48
|
+
end
|
49
|
+
|
50
|
+
def default_source?
|
51
|
+
source_repository == DEFAULT_SOURCE
|
52
|
+
end
|
53
|
+
|
54
|
+
def lock
|
55
|
+
update_lockfile and write_lockfile
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def update_lockfile
|
60
|
+
lockfile.taps = tap_attributes
|
61
|
+
lockfile.packages = package_attributes
|
62
|
+
lockfile.taps.any? && lockfile.packages.any?
|
63
|
+
end
|
64
|
+
|
65
|
+
def write_lockfile
|
66
|
+
File.write lockfile.path, lockfile.to_json
|
67
|
+
lockfile.exist?
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
def contents
|
72
|
+
@contents ||= File.read filename
|
73
|
+
rescue Errno::ENOENT
|
74
|
+
raise "You must have a Brewfile in this dir to proceed."
|
75
|
+
end
|
76
|
+
|
77
|
+
def lockfile_contents
|
78
|
+
JSON.parse File.read("#{filename}.lock")
|
79
|
+
rescue
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'flight/tap'
|
2
|
+
require 'flight/package'
|
3
|
+
|
4
|
+
module Flight
|
5
|
+
class Brewfile
|
6
|
+
# The various commands you can use in a Brewfile.
|
7
|
+
module DSL
|
8
|
+
# Change the source of this Brewfile. Defaults to
|
9
|
+
# 'homebrew/homebrew', but you can supply your own fork here if
|
10
|
+
# necessary.
|
11
|
+
def source(path)
|
12
|
+
self.source_repository = "https://github.com/#{path}.git"
|
13
|
+
end
|
14
|
+
|
15
|
+
# Install a tap source.
|
16
|
+
def tap(repo)
|
17
|
+
self.taps << Tap.new(name: repo)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Install a package.
|
21
|
+
def brew(name, *args)
|
22
|
+
options = args.last.is_a?(Hash) ? args.pop.dup : {}
|
23
|
+
version = args || [">= 0"]
|
24
|
+
|
25
|
+
self.packages << Package.new(
|
26
|
+
name: name,
|
27
|
+
version: version.join("\s"),
|
28
|
+
options: options
|
29
|
+
)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'flight/version'
|
3
|
+
|
4
|
+
module Flight
|
5
|
+
class Brewfile
|
6
|
+
class Lockfile
|
7
|
+
attr_accessor :taps
|
8
|
+
|
9
|
+
attr_accessor :packages
|
10
|
+
|
11
|
+
attr_reader :path
|
12
|
+
|
13
|
+
def initialize(from_filename, and_json=nil)
|
14
|
+
@path = "#{from_filename}.lock"
|
15
|
+
@attributes = and_json
|
16
|
+
end
|
17
|
+
|
18
|
+
def exist?
|
19
|
+
File.exist? path
|
20
|
+
end
|
21
|
+
|
22
|
+
def attributes
|
23
|
+
@attributes ||= {
|
24
|
+
flight: {
|
25
|
+
version: Flight::VERSION,
|
26
|
+
ruby_version: RUBY_VERSION,
|
27
|
+
brew_version: `brew --version`,
|
28
|
+
locked_at: Time.now.to_i,
|
29
|
+
debug: (Flight.debug?) ? 'on' : 'off'
|
30
|
+
},
|
31
|
+
taps: taps
|
32
|
+
packages: packages
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_json
|
37
|
+
attributes.to_json
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'flight'
|
3
|
+
require 'flight/brewfile'
|
4
|
+
|
5
|
+
module Flight
|
6
|
+
class Executable < Thor
|
7
|
+
include Thor::Actions
|
8
|
+
|
9
|
+
source_root File.expand_path('../../templates', __FILE__)
|
10
|
+
|
11
|
+
desc :install, "Install Homebrew packages."
|
12
|
+
def install
|
13
|
+
update_brew and
|
14
|
+
brewfile.packages.each { |pkg| use pkg } and
|
15
|
+
say("Your flight is complete!\nPackages have been installed to #{prefix}.")
|
16
|
+
end
|
17
|
+
|
18
|
+
desc :update, "Update all Homebrew packages and edit the lockfile"
|
19
|
+
def update
|
20
|
+
update_brew and brewfile.packages.outdated.each { |pkg| use pkg }
|
21
|
+
end
|
22
|
+
|
23
|
+
desc :update, "List all outdated Homebrew packages"
|
24
|
+
def outdated
|
25
|
+
update_brew and brewfile.packages.outdated.each do |pkg|
|
26
|
+
say "Current #{pkg.name} is #{pkg.current}, you have #{pkg.version}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
desc :generate, "Create a Brewfile in this directory."
|
31
|
+
def generate
|
32
|
+
template 'Brewfile', 'Brewfile'
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def use(package)
|
37
|
+
if package.installed?
|
38
|
+
say "Using #{package}"
|
39
|
+
else
|
40
|
+
brew :install, "#{package.name} #{package.options}"
|
41
|
+
say "Installed #{package}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def brewfile
|
46
|
+
@brewfile ||= Brewfile.parse!
|
47
|
+
end
|
48
|
+
|
49
|
+
def update_brew
|
50
|
+
install_source unless brewfile.default_source?
|
51
|
+
brewfile.taps.unknown.each { |package| brew :tap, tap }
|
52
|
+
brew :update
|
53
|
+
end
|
54
|
+
|
55
|
+
def brew(command, arguments='')
|
56
|
+
if Flight.debug?
|
57
|
+
run "brew #{command} #{arguments} --quiet"
|
58
|
+
else
|
59
|
+
system "brew #{command} #{arguments} --quiet"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def prefix
|
64
|
+
`brew --prefix`.strip
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
def install_source
|
69
|
+
system %[
|
70
|
+
cd $(brew --prefix) &&
|
71
|
+
git remote rm flight-source;
|
72
|
+
git remote add flight-source #{brewfile.source_repository} &&
|
73
|
+
git branch --set-upstream-to=flight-source/master &&
|
74
|
+
git fetch flight-source
|
75
|
+
] or raise "Source '#{brewfile.source_repository}' could not be loaded."
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'flight/package/collection'
|
2
|
+
require 'flight/package/options'
|
3
|
+
|
4
|
+
module Flight
|
5
|
+
# Represents a single Package in the Brewfile.
|
6
|
+
class Package
|
7
|
+
# Parameters passed in as options when instantiated.
|
8
|
+
attr_reader :params
|
9
|
+
|
10
|
+
# The name of this package
|
11
|
+
attr_accessor :name
|
12
|
+
|
13
|
+
# Any build options to be passed in
|
14
|
+
attr_writer :options
|
15
|
+
|
16
|
+
# Instantiate the object and assign any attributes.
|
17
|
+
def initialize(arguments={})
|
18
|
+
@params = arguments
|
19
|
+
@options = Options.new @params.delete(:options)
|
20
|
+
@version = Version.new @params.delete(:version)
|
21
|
+
|
22
|
+
params.each do |key, value|
|
23
|
+
setter = "#{key}="
|
24
|
+
send setter, value if respond_to? setter
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def version=(new_version_string)
|
29
|
+
@version.string = new_version_string
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_s
|
33
|
+
"#{name} at v#{version}"
|
34
|
+
end
|
35
|
+
|
36
|
+
# Render relevant attributes as a Hash.
|
37
|
+
def attributes
|
38
|
+
{
|
39
|
+
name: name,
|
40
|
+
version: version,
|
41
|
+
options: options.to_h
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
# The version of this package as defined by Homebrew.
|
46
|
+
def current_version
|
47
|
+
if info =~ /#{name}: stable (?<version>.*)(\(|,)/
|
48
|
+
$1.strip
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def has_version?
|
53
|
+
@version != '>= 0'
|
54
|
+
end
|
55
|
+
|
56
|
+
def requested_version
|
57
|
+
@version
|
58
|
+
end
|
59
|
+
|
60
|
+
def version
|
61
|
+
if has_version?
|
62
|
+
requested_version
|
63
|
+
else
|
64
|
+
current_version
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Check if this package is installed with Homebrew. Actually, it
|
69
|
+
# checks if this package is not NOT installed with Homebrew. :)
|
70
|
+
def installed?
|
71
|
+
info !~ /Not Installed/
|
72
|
+
end
|
73
|
+
|
74
|
+
# Checks if this package is up-to-date by comparing the stored
|
75
|
+
# version with the latest version from Homebrew's info command.
|
76
|
+
def up_to_date?
|
77
|
+
info.split("\n").first.include? version
|
78
|
+
end
|
79
|
+
|
80
|
+
def outdated?
|
81
|
+
(not up_to_date?)
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
def info
|
86
|
+
@info ||= `brew info #{name}`
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Flight
|
2
|
+
class Package
|
3
|
+
# Represents the entire Brewfile.
|
4
|
+
class Collection
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
attr_accessor :all
|
8
|
+
|
9
|
+
def initialize(with_packages=[])
|
10
|
+
@all = with_packages
|
11
|
+
end
|
12
|
+
|
13
|
+
def each
|
14
|
+
all.each { |package| yield package }
|
15
|
+
end
|
16
|
+
|
17
|
+
# Filter out packages which are installed.
|
18
|
+
def installed
|
19
|
+
all.select(&:installed?)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Filter out packages which are installed, but according to
|
23
|
+
# Homebrew are out of date.
|
24
|
+
def outdated
|
25
|
+
all.select(&:up_to_date?)
|
26
|
+
end
|
27
|
+
|
28
|
+
def <<(new_pkg)
|
29
|
+
@all << new_pkg
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_json
|
33
|
+
all.map(&:attributes).to_json
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Flight
|
2
|
+
class Package
|
3
|
+
# Stores command-line options for a Package as a Hash, and outputs
|
4
|
+
# said options to a String suitable for tacking onto the end of a
|
5
|
+
# `brew install` run.
|
6
|
+
class Options
|
7
|
+
def initialize(from_hash={})
|
8
|
+
@hash = from_hash
|
9
|
+
end
|
10
|
+
|
11
|
+
# Convert the hash of build options into a string of command-line
|
12
|
+
# arguments.
|
13
|
+
def to_s
|
14
|
+
@hash.map { |key, value|
|
15
|
+
option = key.to_s.gsub(/_/, '-')
|
16
|
+
if !!value == value
|
17
|
+
value ? "--#{option}" : "--no-#{option}"
|
18
|
+
else
|
19
|
+
"--#{option}=#{value}"
|
20
|
+
end
|
21
|
+
}.join("\s")
|
22
|
+
end
|
23
|
+
|
24
|
+
# Output options as a Hash.
|
25
|
+
def to_h
|
26
|
+
@hash
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Flight
|
2
|
+
class Package
|
3
|
+
class Version
|
4
|
+
attr_accessor :string
|
5
|
+
|
6
|
+
def initialize(with_string)
|
7
|
+
@string = with_string
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
resolve string
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def resolve(string)
|
16
|
+
string
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/flight/tap.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
module Flight
|
2
|
+
# Represents a tap designated by the `tap` directive in Brewfile. This
|
3
|
+
# is a repo we should be pulling formulae from.
|
4
|
+
class Tap
|
5
|
+
attr_reader :name
|
6
|
+
|
7
|
+
def initialize(with_name)
|
8
|
+
@name = with_name
|
9
|
+
end
|
10
|
+
|
11
|
+
def installed?
|
12
|
+
`brew tap`.include? name
|
13
|
+
end
|
14
|
+
|
15
|
+
class Collection
|
16
|
+
attr_reader :all
|
17
|
+
|
18
|
+
def initialize(with_taps=[])
|
19
|
+
@all = with_taps
|
20
|
+
end
|
21
|
+
|
22
|
+
def unknown
|
23
|
+
all.reject do |tap|
|
24
|
+
known.include? tap.name
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def known
|
29
|
+
`brew tap`.split("\n").map { |name| Tap.new(name) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def <<(new_tap)
|
33
|
+
@all << new_tap
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# This is your Brewfile. Use the following command to install a new
|
2
|
+
# package from Homebrew source:
|
3
|
+
#
|
4
|
+
# brew 'git', '~> 2.2'
|
5
|
+
#
|
6
|
+
# You can also install packages from custom taps:
|
7
|
+
#
|
8
|
+
# tap 'neovim/neovim'
|
9
|
+
#
|
10
|
+
# brew 'neovim', HEAD: true
|
11
|
+
#
|
12
|
+
# Much like Bundler's `source`, you only need to specify a tap once.
|
13
|
+
# It's installed the first time you add it and checked every time you
|
14
|
+
# run `flight install`.
|
15
|
+
#
|
16
|
+
# Start by adding some packages and taps and run `flight install` to get
|
17
|
+
# them on your system! Here's a few good packages to get you started:
|
18
|
+
|
19
|
+
brew 'vim'
|
20
|
+
brew 'git', '~> 2.2'
|
21
|
+
brew 'chruby'
|
22
|
+
brew 'ruby-install'
|
23
|
+
brew 'zsh'
|
24
|
+
brew 'postgresql'
|
25
|
+
brew 'bats'
|
26
|
+
brew 'hub'
|
27
|
+
brew 'gist'
|
28
|
+
brew 'the_silver_searcher'
|
29
|
+
|
30
|
+
#tap 'tubbo/homebrew-tap'
|
31
|
+
#brew 'rails-template'
|
32
|
+
#brew 'antigen'
|
33
|
+
#brew 'homer'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'flight/package/options'
|
3
|
+
|
4
|
+
module Flight
|
5
|
+
class Package
|
6
|
+
RSpec.describe Options do
|
7
|
+
let :hash do
|
8
|
+
{ with_ruby: true, perl: false }
|
9
|
+
end
|
10
|
+
|
11
|
+
subject do
|
12
|
+
Options.new hash
|
13
|
+
end
|
14
|
+
|
15
|
+
it "converts options into query parameters" do
|
16
|
+
expect(subject.to_s).to eq('--with-ruby --no-perl')
|
17
|
+
end
|
18
|
+
|
19
|
+
it "outputs options as a hash" do
|
20
|
+
expect(subject.to_h).to eq(hash)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'flight/package'
|
3
|
+
|
4
|
+
module Flight
|
5
|
+
RSpec.describe Package do
|
6
|
+
subject do
|
7
|
+
Package.new(
|
8
|
+
name: 'flight',
|
9
|
+
version: '1.0.0',
|
10
|
+
options: { with_ruby: true }
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "converts params into attributes" do
|
15
|
+
expect(subject.name).to eq('flight')
|
16
|
+
expect(subject.version).to eq('1.0.0')
|
17
|
+
end
|
18
|
+
|
19
|
+
it "converts options param hash into options object" do
|
20
|
+
expect(subject.options).to be_a(Package::Options)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "finds current version from brew" do
|
24
|
+
allow(subject).to receive(:info).and_return("flight: #{subject.version} stable, HEAD")
|
25
|
+
expect(subject.current_version).to eq(subject.version)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "is up to date when current_version matches version" do
|
29
|
+
allow(subject).to receive(:info).and_return("flight: #{subject.version} stable, HEAD")
|
30
|
+
expect(subject).to be_up_to_date
|
31
|
+
expect(subject).to_not be_outdated
|
32
|
+
end
|
33
|
+
|
34
|
+
it "is outdated when current_version does not match version" do
|
35
|
+
allow(subject).to receive(:info).and_return("flight: 2.0.0 (bottled)")
|
36
|
+
expect(subject.current_version).to eq('2.1.1')
|
37
|
+
expect(subject.current_version).to_not eq(subject.version)
|
38
|
+
expect(subject).to be_outdated
|
39
|
+
expect(subject).to_not be_up_to_date
|
40
|
+
end
|
41
|
+
|
42
|
+
it "is installed when 'Not Installed' can't be found in brew info" do
|
43
|
+
allow(subject).to receive(:info).and_return("/usr/local/Cellar")
|
44
|
+
expect(subject).to be_installed
|
45
|
+
end
|
46
|
+
|
47
|
+
it "is not installed when brew info tells us" do
|
48
|
+
allow(subject).to receive(:info).and_return("Not Installed")
|
49
|
+
expect(subject).to_not be_installed
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
data/spec/flight_spec.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'flight'
|
3
|
+
|
4
|
+
RSpec.describe Flight do
|
5
|
+
it 'has a version number' do
|
6
|
+
expect(Flight::VERSION).not_to be nil
|
7
|
+
expect(Flight.version).to eq(Flight::VERSION)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'detects if we are in debug mode' do
|
11
|
+
expect(Flight::DEBUG).to be_nil
|
12
|
+
expect(Flight.debug?).to eq(false)
|
13
|
+
end
|
14
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: brew-flight
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tom Scott
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-12-20 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.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
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: '3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: thor
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Flight is a Bundler for Homebrew. It helps you manage the Homebrew packages
|
70
|
+
you want on your system.
|
71
|
+
email:
|
72
|
+
- tscott@telvue.com
|
73
|
+
executables:
|
74
|
+
- flight
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- .gitignore
|
79
|
+
- .rspec
|
80
|
+
- .travis.yml
|
81
|
+
- Brewfile
|
82
|
+
- Brewfile.lock
|
83
|
+
- Gemfile
|
84
|
+
- LICENSE.md
|
85
|
+
- Makefile
|
86
|
+
- README.md
|
87
|
+
- Rakefile
|
88
|
+
- bin/flight
|
89
|
+
- doc/man/flight.md
|
90
|
+
- etc/Brewfile
|
91
|
+
- flight.gemspec
|
92
|
+
- lib/flight.rb
|
93
|
+
- lib/flight/brewfile.rb
|
94
|
+
- lib/flight/brewfile/dsl.rb
|
95
|
+
- lib/flight/brewfile/lockfile.rb
|
96
|
+
- lib/flight/executable.rb
|
97
|
+
- lib/flight/package.rb
|
98
|
+
- lib/flight/package/collection.rb
|
99
|
+
- lib/flight/package/options.rb
|
100
|
+
- lib/flight/package/version.rb
|
101
|
+
- lib/flight/tap.rb
|
102
|
+
- lib/flight/version.rb
|
103
|
+
- lib/templates/Brewfile
|
104
|
+
- spec/flight/executable_spec.rb
|
105
|
+
- spec/flight/package/options_spec.rb
|
106
|
+
- spec/flight/package_spec.rb
|
107
|
+
- spec/flight_spec.rb
|
108
|
+
- spec/spec_helper.rb
|
109
|
+
homepage: http://github.com/tubbo/flight
|
110
|
+
licenses:
|
111
|
+
- MIT
|
112
|
+
metadata: {}
|
113
|
+
post_install_message:
|
114
|
+
rdoc_options: []
|
115
|
+
require_paths:
|
116
|
+
- lib
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - '>='
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
requirements: []
|
128
|
+
rubyforge_project:
|
129
|
+
rubygems_version: 2.0.14
|
130
|
+
signing_key:
|
131
|
+
specification_version: 4
|
132
|
+
summary: Flight is a Bundler for Homebrew.
|
133
|
+
test_files:
|
134
|
+
- spec/flight/executable_spec.rb
|
135
|
+
- spec/flight/package/options_spec.rb
|
136
|
+
- spec/flight/package_spec.rb
|
137
|
+
- spec/flight_spec.rb
|
138
|
+
- spec/spec_helper.rb
|