kibou 0.0.0 → 0.2.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.
- data/Gemfile +3 -0
- data/Gemfile.lock +18 -0
- data/LICENSE +20 -0
- data/README.md +100 -0
- data/Rakefile +10 -0
- data/kibou.gemspec +18 -0
- data/lib/kibou/dependency.rb +12 -0
- data/lib/kibou/package.rb +66 -0
- data/lib/kibou/rake_task.rb +53 -0
- data/lib/kibou/recipe.rb +71 -0
- data/lib/kibou/utility.rb +61 -0
- data/lib/kibou/version.rb +5 -0
- data/lib/kibou.rb +12 -0
- data/recipes/databases.rb +26 -0
- data/recipes/programmings.rb +14 -0
- data/recipes/tools.rb +65 -0
- metadata +20 -4
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Bryan Goines
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
# Kibou 希望 (Hope)
|
2
|
+
=============
|
3
|
+
|
4
|
+
Homebrew and Rakefile are OSX's best friends.
|
5
|
+
|
6
|
+
## Features
|
7
|
+
|
8
|
+
Kibou is using [Homebrew](http://mxcl.github.com/homebrew/) and [Rake](https://github.com/jimweirich/rake#readme) to manage your OSX configuration with only single `rake` command.
|
9
|
+
|
10
|
+
## Dependencies
|
11
|
+
|
12
|
+
* OSX
|
13
|
+
|
14
|
+
* [Homebrew](http://mxcl.github.com/homebrew/)
|
15
|
+
* [Installation guide](https://github.com/mxcl/homebrew/wiki/Installation)
|
16
|
+
|
17
|
+
* [Ruby 1.9.x](http://ruby-lang.org/)
|
18
|
+
|
19
|
+
* [rbenv](https://github.com/sstephenson/rbenv) (preferred)
|
20
|
+
|
21
|
+
* Installation
|
22
|
+
|
23
|
+
brew install rbenv ruby-build
|
24
|
+
rbenv install 1.9.3-p194
|
25
|
+
rbenv global 1.9.3-p194
|
26
|
+
rbenv rehash
|
27
|
+
* [rvm](http://rvm.beginrescueend.com/)
|
28
|
+
|
29
|
+
* Installation
|
30
|
+
|
31
|
+
# Follow rvm installation guide first
|
32
|
+
rvm install 1.9.3-p194
|
33
|
+
rvm default 1.9.3-p194
|
34
|
+
* **OR** install Ruby from Homebrew via `brew install ruby`
|
35
|
+
|
36
|
+
## Installation
|
37
|
+
|
38
|
+
gem install kibou
|
39
|
+
|
40
|
+
## Example / Usage
|
41
|
+
|
42
|
+
**Recipe**
|
43
|
+
|
44
|
+
# recipes/tools.rb
|
45
|
+
class Tools < Kibou::Recipe
|
46
|
+
package :tmux, :ensure => :latest
|
47
|
+
package :wemux, :via => "https://github.com/downloads/zolrath/wemux/wemux.rb"
|
48
|
+
|
49
|
+
post_install :test_tmux
|
50
|
+
|
51
|
+
def test_tmux
|
52
|
+
status = system("which tmux")
|
53
|
+
puts status ? "tmux is installed" : "tmux is not installed"
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
**Rakefile**
|
59
|
+
|
60
|
+
require 'kibou'
|
61
|
+
|
62
|
+
Kibou::RakeTask.new do |c|
|
63
|
+
c.recipes_directory = "recipes/*.rb"
|
64
|
+
c.recipes = ["tools"]
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
Run `rake kibou` to perform package installations via Homebrew.
|
69
|
+
|
70
|
+
## Documentation
|
71
|
+
|
72
|
+
### Kibou::RakeTask
|
73
|
+
|
74
|
+
* ** attributes **
|
75
|
+
|
76
|
+
* `recipes_directory` - specify the directory name of recipe files in a regex pattern (default: `recipes/*.rb`)
|
77
|
+
* `recipes`- a list of recipe names (Array is preferred)
|
78
|
+
|
79
|
+
### Kibou::Recipe
|
80
|
+
|
81
|
+
* Ensure that recipe file name is match to the class name or Kibou will fail to start.
|
82
|
+
|
83
|
+
Example: `tools.rb` **is** `Tools`, `blah.rb` **is** `Blah`
|
84
|
+
|
85
|
+
Notes: file names with underscore is not currently supported.
|
86
|
+
|
87
|
+
* ** package's options (Hash) **
|
88
|
+
|
89
|
+
* `:ensure` - ensures that package is `:installed` or `:latest` (default: `:installed`)
|
90
|
+
|
91
|
+
* `:via` - downloads a file from url or install from local file.
|
92
|
+
|
93
|
+
|
94
|
+
## Thanks
|
95
|
+
|
96
|
+
Inspired by two popular tools: Puppet and Chef. They are amazing automated server framework tools.
|
97
|
+
|
98
|
+
## License
|
99
|
+
|
100
|
+
Kibou is licensed under the MIT license.
|
data/Rakefile
ADDED
data/kibou.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
require 'kibou/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "kibou"
|
8
|
+
gem.version = Kibou::VERSION
|
9
|
+
gem.author = "Bryan Goines"
|
10
|
+
gem.summary = "Homebrew and Rakefile are OSX's best friends."
|
11
|
+
gem.email = "bryann83@gmail.com"
|
12
|
+
gem.homepage = "http://kiboulabs.com/"
|
13
|
+
|
14
|
+
gem.files = Dir['**/*']
|
15
|
+
|
16
|
+
gem.add_dependency "rake"
|
17
|
+
gem.add_dependency "small"
|
18
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Kibou
|
2
|
+
class Package
|
3
|
+
|
4
|
+
include Utility::Helpers
|
5
|
+
|
6
|
+
attr_reader :name, :options, :dependencies
|
7
|
+
|
8
|
+
def initialize(name, options = {})
|
9
|
+
@name = name.to_s
|
10
|
+
@options = options
|
11
|
+
@dependencies = (options[:require] || []).map {|dep| Kibou::Dependency.new(self, dep) }
|
12
|
+
@completed = false
|
13
|
+
@outdated = false
|
14
|
+
end
|
15
|
+
|
16
|
+
def perform
|
17
|
+
return invoke_proc if options[:proc].present?
|
18
|
+
return install if options[:via].present?
|
19
|
+
return not_found_message unless package_included?(name)
|
20
|
+
return install unless package_installed?(name)
|
21
|
+
outdated? ? upgrade : up_to_date_message
|
22
|
+
end
|
23
|
+
|
24
|
+
def completed?
|
25
|
+
!!@completed
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def up_to_date_message
|
31
|
+
puts " --> #{name} is up to date"
|
32
|
+
completed!
|
33
|
+
end
|
34
|
+
|
35
|
+
def not_found_message
|
36
|
+
puts "Package is not found: #{name}"
|
37
|
+
end
|
38
|
+
|
39
|
+
def outdated?
|
40
|
+
options[:ensure].to_s == 'latest' and package_outdated?(name)
|
41
|
+
end
|
42
|
+
|
43
|
+
def invoke_proc
|
44
|
+
puts " --> invoking proc #{name}"
|
45
|
+
raise "Unable to invoke proc for #{name}" unless options[:proc].present? ? options[:proc].call : false
|
46
|
+
completed!
|
47
|
+
end
|
48
|
+
|
49
|
+
def install
|
50
|
+
puts " --> installing #{name} #{options[:via].present? ? "via #{options[:via]}" : ""}"
|
51
|
+
package_install (options[:via].present? ? options[:via] : name)
|
52
|
+
completed!
|
53
|
+
end
|
54
|
+
|
55
|
+
def upgrade
|
56
|
+
puts " --> upgrading #{name}"
|
57
|
+
package_upgrade name
|
58
|
+
completed!
|
59
|
+
end
|
60
|
+
|
61
|
+
def completed!
|
62
|
+
@completed = true
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
|
4
|
+
module Kibou
|
5
|
+
class RakeTask < Rake::TaskLib
|
6
|
+
|
7
|
+
include Utility::Helpers
|
8
|
+
|
9
|
+
attr_accessor :recipes_path, :recipes
|
10
|
+
|
11
|
+
def initialize(name = :kibou)
|
12
|
+
@name = name
|
13
|
+
@recipes = []
|
14
|
+
@recipes_path = "recipes/*.rb"
|
15
|
+
yield self if block_given?
|
16
|
+
build_tasks!
|
17
|
+
end
|
18
|
+
|
19
|
+
def build_tasks!
|
20
|
+
desc "start Kibou -- run package installations via Homebrew"
|
21
|
+
task @name do
|
22
|
+
raise "Homebrew is not installed!" unless brew_installed?
|
23
|
+
require_tree @recipes_path
|
24
|
+
recipes = @recipes.map &Recipe.method(:new)
|
25
|
+
packages_sync(recipes)
|
26
|
+
end
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def require_tree(pattern)
|
31
|
+
Dir[pattern].map(&File.method(:expand_path)).each &method(:require)
|
32
|
+
end
|
33
|
+
|
34
|
+
def packages_sync(recipes)
|
35
|
+
brew :update
|
36
|
+
recipes.each do |recipe|
|
37
|
+
puts "#{recipe.name} (#{recipe.packages.size} packages)"
|
38
|
+
recipe.run_before_tasks
|
39
|
+
recipe.packages.each do |package|
|
40
|
+
package.dependencies.each do |dep|
|
41
|
+
pkg = recipe.find_package(dep.dependency)
|
42
|
+
raise "Missing dependencies: #{dep.dependency}" unless pkg
|
43
|
+
pkg.perform unless pkg.completed?
|
44
|
+
end
|
45
|
+
package.perform unless package.completed?
|
46
|
+
end
|
47
|
+
recipe.run_after_tasks
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
data/lib/kibou/recipe.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
module Kibou
|
2
|
+
class Recipe
|
3
|
+
|
4
|
+
extend Utility::Helpers
|
5
|
+
include Utility::Helpers
|
6
|
+
|
7
|
+
attr_reader :name, :packages, :before_tasks, :after_tasks, :constant
|
8
|
+
|
9
|
+
def initialize(name = nil)
|
10
|
+
if name
|
11
|
+
@name = name.to_s
|
12
|
+
@constant = @name.capitalize.camelize.constantize
|
13
|
+
@klass = @constant.new
|
14
|
+
@packages = @constant.packages
|
15
|
+
@before_tasks = @constant.before_tasks
|
16
|
+
@after_tasks = @constant.after_tasks
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.package(name, options = {}, &block)
|
21
|
+
options[:ensure] ||= :installed
|
22
|
+
options[:proc] = block if block_given?
|
23
|
+
packages << Package.new(name, options)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.packages
|
27
|
+
@packages ||= []
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.before(*args)
|
31
|
+
before_tasks.push *args
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.before_tasks
|
35
|
+
@before_tasks ||= []
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.after(*args)
|
39
|
+
after_tasks.push *args
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.after_tasks
|
43
|
+
@after_tasks ||= []
|
44
|
+
end
|
45
|
+
|
46
|
+
def find_package(name)
|
47
|
+
packages.select {|package| package.name == name }.first
|
48
|
+
end
|
49
|
+
|
50
|
+
def run_before_tasks
|
51
|
+
unless before_tasks.size == 0
|
52
|
+
puts "running before tasks"
|
53
|
+
before_tasks.each do |m|
|
54
|
+
puts "---> invoking: #{m}"
|
55
|
+
@klass.send(m)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def run_after_tasks
|
61
|
+
unless after_tasks.size == 0
|
62
|
+
puts "running after tasks"
|
63
|
+
after_tasks.each do |m|
|
64
|
+
puts "---> invoking: #{m}"
|
65
|
+
@klass.send(m)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Kibou
|
2
|
+
module Utility
|
3
|
+
module Helpers
|
4
|
+
|
5
|
+
def brew_installed?
|
6
|
+
`which brew`.chomp =~ /brew$/
|
7
|
+
end
|
8
|
+
|
9
|
+
def brew(*args)
|
10
|
+
args.unshift "brew"
|
11
|
+
`#{args.join(" ")}`.split(/\n/)
|
12
|
+
end
|
13
|
+
|
14
|
+
def info(pkg)
|
15
|
+
brew :info, pkg
|
16
|
+
end
|
17
|
+
|
18
|
+
def search(pkg)
|
19
|
+
brew :search, pkg
|
20
|
+
end
|
21
|
+
|
22
|
+
def outdated
|
23
|
+
brew :outdated
|
24
|
+
end
|
25
|
+
|
26
|
+
def update!
|
27
|
+
system("brew update > /dev/null 2>&1")
|
28
|
+
end
|
29
|
+
|
30
|
+
def package_install(pkg)
|
31
|
+
system("brew install #{pkg}")
|
32
|
+
end
|
33
|
+
|
34
|
+
def package_upgrade(pkg)
|
35
|
+
system("brew upgrade #{pkg}")
|
36
|
+
end
|
37
|
+
|
38
|
+
def package_installed?(pkg)
|
39
|
+
!info(pkg).include?("Not installed")
|
40
|
+
end
|
41
|
+
|
42
|
+
def package_included?(pkg)
|
43
|
+
search(pkg).include?(pkg)
|
44
|
+
end
|
45
|
+
|
46
|
+
def package_outdated?(pkg)
|
47
|
+
list = outdated.map {|pkg| pkg.split(/ /).first }
|
48
|
+
list.include?(pkg)
|
49
|
+
end
|
50
|
+
|
51
|
+
def run(*args)
|
52
|
+
system(args.join(" "))
|
53
|
+
end
|
54
|
+
|
55
|
+
def capture(*args)
|
56
|
+
`#{args.join(" ")}`
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/kibou.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
class Databases < Kibou::Recipe
|
2
|
+
|
3
|
+
package :mysql, :ensure => :latest
|
4
|
+
package :postgresql, :ensure => :latest
|
5
|
+
package :sqlite, :ensure => :latest
|
6
|
+
package :redis
|
7
|
+
package :elasticsearch
|
8
|
+
package :memcached
|
9
|
+
package :zeromq
|
10
|
+
|
11
|
+
after :start_mysql
|
12
|
+
|
13
|
+
def start_mysql
|
14
|
+
mysql :start unless mysql_started?
|
15
|
+
end
|
16
|
+
|
17
|
+
def mysql(*args)
|
18
|
+
args.unshift "mysql.server"
|
19
|
+
`#{args.join(" ")}`
|
20
|
+
end
|
21
|
+
|
22
|
+
def mysql_started?
|
23
|
+
mysql(:status).include?("SUCCESS")
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Programmings < Kibou::Recipe
|
2
|
+
|
3
|
+
package :node, :ensure => :latest
|
4
|
+
package :ruby, :ensure => :latest
|
5
|
+
package :jruby, :ensure => :latest
|
6
|
+
package :erlang, :ensure => :latest
|
7
|
+
package :groovy, :ensure => :latest
|
8
|
+
package :scala, :ensure => :latest
|
9
|
+
package :akka, :ensure => :latest
|
10
|
+
package :go, :ensure => :latest
|
11
|
+
|
12
|
+
package :sbt, :ensure => :latest, :require => ["scala"]
|
13
|
+
|
14
|
+
end
|
data/recipes/tools.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
class Tools < Kibou::Recipe
|
2
|
+
|
3
|
+
package :ack, :ensure => :latest
|
4
|
+
package :bash
|
5
|
+
package 'bash-completion'
|
6
|
+
package :grc
|
7
|
+
|
8
|
+
package :git, :ensure => :latest
|
9
|
+
package :tig, :ensure => :latest, :require => ["git"]
|
10
|
+
package 'git-extras', :ensure => :latest, :require => ["git"]
|
11
|
+
package :subversion
|
12
|
+
package :wget
|
13
|
+
package :mercurial
|
14
|
+
package :legit, :ensure => :latest, :require => ["git"]
|
15
|
+
|
16
|
+
package :macvim, :ensure => :latest
|
17
|
+
|
18
|
+
package :imagemagick, :ensure => :latest
|
19
|
+
|
20
|
+
package :curl, :ensure => :latest
|
21
|
+
package :tmux, :ensure => :latest
|
22
|
+
package :wemux, :via => "https://github.com/downloads/zolrath/wemux/wemux.rb"
|
23
|
+
package :ctags, :ensure => :latest
|
24
|
+
package :rbenv, :ensure => :latest, :require => ["ruby-build"]
|
25
|
+
package 'ruby-build', :ensure => :latest
|
26
|
+
|
27
|
+
package :pow, :ensure => :latest
|
28
|
+
|
29
|
+
package :sweet do
|
30
|
+
run "ls"
|
31
|
+
end
|
32
|
+
|
33
|
+
after :install_rubies, :install_gems
|
34
|
+
|
35
|
+
def install_rubies
|
36
|
+
%w(1.9.3-p194 jruby-1.6.7.2 rbx-1.2.4 ree-1.8.7-2012.02).each do |version|
|
37
|
+
rbenv(:install, version) unless ruby_installed?(version)
|
38
|
+
end
|
39
|
+
rbenv :global, "1.9.3-p194"
|
40
|
+
rbenv :rehash
|
41
|
+
end
|
42
|
+
|
43
|
+
def install_gems
|
44
|
+
%w(bundler rails powder).each do |gem|
|
45
|
+
run "gem install #{gem} --no-ri --no-rdoc"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def rbenv(*args)
|
50
|
+
args.unshift "rbenv"
|
51
|
+
run args.join(" ")
|
52
|
+
end
|
53
|
+
|
54
|
+
def ruby_installed?(version)
|
55
|
+
versions.include?(version)
|
56
|
+
end
|
57
|
+
|
58
|
+
def versions
|
59
|
+
@versions ||= capture("rbenv versions").split(/\n/).map{|v| v.gsub(/^\s+/,'').gsub(/^\*\s+/,'').gsub(/\s\(.*$/, '') }
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kibou
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05
|
12
|
+
date: 2012-06-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -48,8 +48,24 @@ email: bryann83@gmail.com
|
|
48
48
|
executables: []
|
49
49
|
extensions: []
|
50
50
|
extra_rdoc_files: []
|
51
|
-
files:
|
52
|
-
|
51
|
+
files:
|
52
|
+
- Gemfile
|
53
|
+
- Gemfile.lock
|
54
|
+
- kibou.gemspec
|
55
|
+
- lib/kibou/dependency.rb
|
56
|
+
- lib/kibou/package.rb
|
57
|
+
- lib/kibou/rake_task.rb
|
58
|
+
- lib/kibou/recipe.rb
|
59
|
+
- lib/kibou/utility.rb
|
60
|
+
- lib/kibou/version.rb
|
61
|
+
- lib/kibou.rb
|
62
|
+
- LICENSE
|
63
|
+
- Rakefile
|
64
|
+
- README.md
|
65
|
+
- recipes/databases.rb
|
66
|
+
- recipes/programmings.rb
|
67
|
+
- recipes/tools.rb
|
68
|
+
homepage: http://kiboulabs.com/
|
53
69
|
licenses: []
|
54
70
|
post_install_message:
|
55
71
|
rdoc_options: []
|