blue 0.0.1 → 0.0.2

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/.gitignore CHANGED
@@ -15,3 +15,7 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ *.swp
19
+ *.swo
20
+ README.html
21
+
data/ISSUES.md ADDED
@@ -0,0 +1,6 @@
1
+ Currently hacking in place (in an unsafe way) the github key fingerprint, or else the first git clone fails.
2
+
3
+ Postgres notes:
4
+ sudo apt-get install libpq-dev # required for gem 'pg'
5
+ will need to use puppet/shaddow_puppet from root install (not bundler) as they'll need to be available to install postgres/dependencies before the gem 'pg' can be installed
6
+
data/README.md CHANGED
@@ -1,20 +1,25 @@
1
1
  # Blue
2
2
 
3
- TODO: Write a gem description
3
+ Blue helps you manage your Ruby on Rails deployment.
4
+
5
+ * Deploy new code
6
+ * Install/Update/Restart services
4
7
 
5
8
  ## Installation
6
9
 
7
10
  Add this line to your application's Gemfile:
8
11
 
9
- gem 'blue'
12
+ group :development, :deployment do
13
+ gem 'blue', :git => 'git@github.com:crankharder/blue.git'
14
+ end
10
15
 
11
- And then execute:
16
+ Run Bundle:
12
17
 
13
18
  $ bundle
14
19
 
15
- Or install it yourself as:
20
+ Then run the following to move a basic set of configs into place.
16
21
 
17
- $ gem install blue
22
+ $ rake blue:setup
18
23
 
19
24
  ## Usage
20
25
 
@@ -27,3 +32,4 @@ TODO: Write usage instructions here
27
32
  3. Commit your changes (`git commit -am 'Add some feature'`)
28
33
  4. Push to the branch (`git push origin my-new-feature`)
29
34
  5. Create new Pull Request
35
+
data/Rakefile CHANGED
@@ -1 +1,2 @@
1
1
  require "bundler/gem_tasks"
2
+
data/blue.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Blue::VERSION
9
9
  spec.authors = ["Josh Sharpe"]
10
10
  spec.email = ["josh.m.sharpe@gmail.com"]
11
- spec.description = %q{BLUE}
12
- spec.summary = %q{BLUE}
11
+ spec.description = %q{A deployment framework for rails apps}
12
+ spec.summary = %q{Helps manage all aspects of your cloud infrastructure. Install services, deploy code, restart processes, monitor, etc...}
13
13
  spec.homepage = ""
14
14
  spec.license = "MIT"
15
15
 
@@ -18,6 +18,11 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.add_dependency 'hashie'
22
+ spec.add_dependency 'shadow_puppet'
23
+ spec.add_dependency 'capistrano'
24
+
21
25
  spec.add_development_dependency "bundler", "~> 1.3"
22
26
  spec.add_development_dependency "rake"
23
27
  end
28
+
@@ -0,0 +1,27 @@
1
+ module Blue
2
+ class AbstractManifest < ShadowPuppet::Manifest
3
+
4
+ def self.inherited(klass)
5
+ unless klass == Blue::Box
6
+ raise StandardError, "Do not inherit directly from #{self.class.name}. Instead, inherit from #{Blue::Box}"
7
+ end
8
+ end
9
+
10
+ def self.hostname
11
+ self.const_defined?(:HOSTNAME) ? self.const_get(:HOSTNAME) : self.name.underscore.gsub("_", '.')
12
+ end
13
+
14
+ def self.roles
15
+ self.const_get(:ROLES)
16
+ end
17
+
18
+ def self.__config__
19
+ ShadowPuppet::Manifest.__config__
20
+ end
21
+
22
+ def self.recipes
23
+ ShadowPuppet::Manifest.recipes
24
+ end
25
+ end
26
+ end
27
+
data/lib/blue/box.rb ADDED
@@ -0,0 +1,28 @@
1
+ require 'blue/template'
2
+
3
+ module Blue
4
+ class Box < Blue::AbstractManifest
5
+
6
+ include Blue::Template
7
+ include Blue::Ntpd
8
+
9
+ def self.inherited(klass)
10
+ Blue.register_box(klass)
11
+ klass.add_role(:ruby)
12
+ end
13
+
14
+ def self.add_role(role)
15
+ roles << role
16
+ true
17
+ end
18
+
19
+ def self.roles
20
+ @roles ||= Set.new
21
+ end
22
+
23
+ def roles
24
+ self.class.roles
25
+ end
26
+ end
27
+ end
28
+
@@ -0,0 +1,29 @@
1
+ module Blue
2
+ module Config
3
+
4
+ def self.included(klass)
5
+ klass.class_eval do
6
+ @@config = Hashie::Mash.new
7
+
8
+ def self.configure(new_config = {})
9
+ @@config.deep_merge!(new_config)
10
+ end
11
+
12
+ def self.load_app_config!
13
+ configure(YAML.load(IO.read(BLUE_CONFIG)))
14
+ end
15
+
16
+ def self.config
17
+ @@config
18
+ end
19
+
20
+ Blue.configure({
21
+ :user => 'rails',
22
+ :group => 'rails',
23
+ :scm => 'git'
24
+ })
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,17 @@
1
+ module Blue
2
+ module DatabaseConfig
3
+
4
+ def self.database_yml
5
+ File.join(Blue.current_release_dir, 'config', 'database.yml')
6
+ end
7
+
8
+ def self.load
9
+ if File.exists?(database_yml)
10
+ Blue.configure(:database => YAML::load(IO.read(database_yml))[Blue.env])
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ Blue::DatabaseConfig.load
17
+
@@ -0,0 +1,22 @@
1
+ class Hash
2
+ # Returns a new hash with +self+ and +other_hash+ merged recursively.
3
+ #
4
+ # h1 = {:x => {:y => [4,5,6]}, :z => [7,8,9]}
5
+ # h2 = {:x => {:y => [7,8,9]}, :z => "xyz"}
6
+ #
7
+ # h1.deep_merge(h2) #=> { :x => {:y => [7, 8, 9]}, :z => "xyz" }
8
+ # h2.deep_merge(h1) #=> { :x => {:y => [4, 5, 6]}, :z => [7, 8, 9] }
9
+ def deep_merge(other_hash)
10
+ dup.deep_merge!(other_hash)
11
+ end
12
+
13
+ # Same as +deep_merge+, but modifies +self+.
14
+ def deep_merge!(other_hash)
15
+ other_hash.each_pair do |k,v|
16
+ tv = self[k]
17
+ self[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? tv.deep_merge(v) : v
18
+ end
19
+ self
20
+ end
21
+ end
22
+
@@ -0,0 +1,16 @@
1
+ module Blue
2
+ module Ntpd
3
+
4
+ def ntpd
5
+ package :ntp, :ensure => :latest
6
+ service :ntp, :ensure => :running, :require => package('ntp'), :pattern => 'ntpd'
7
+ end
8
+
9
+ def self.included(klass)
10
+ klass.class_eval do
11
+ recipe :ntpd
12
+ end
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,16 @@
1
+ require 'blue/plugins/ntpd'
2
+
3
+ module Blue
4
+ module Plugins
5
+
6
+ # Scour loaded gems for matches and require them.
7
+ def self.init
8
+ Gem.loaded_specs.values.map(&:name).select{|n| n.match("blue-")}.each do |plugin|
9
+ require plugin.gsub('-','/')
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ Blue::Plugins.init
16
+
@@ -0,0 +1,10 @@
1
+ require 'blue'
2
+
3
+ module Blue
4
+ require 'rails'
5
+
6
+ class Railtie < Rails::Railtie
7
+ rake_tasks { load "tasks/blue.rake" }
8
+ end
9
+ end
10
+
@@ -0,0 +1,40 @@
1
+ module Blue
2
+ module Template
3
+
4
+ def self.included(klass)
5
+ klass.class_eval do
6
+ def local_template_dir
7
+ @local_template_dir ||= Pathname.new(Blue.rails_current + '/app/manifests/templates')
8
+ end
9
+
10
+ def local_template(pathname)
11
+ (local_template_dir + pathname.basename).expand_path
12
+ end
13
+
14
+ # Render the ERB template located at <tt>pathname</tt>. If a template exists
15
+ # with the same basename at <tt>RAILS_ROOT/app/manifests/templates</tt>, it
16
+ # is used instead. This is useful to override templates provided by plugins
17
+ # to customize application configuration files.
18
+ def template(pathname, b = binding)
19
+ pathname = Pathname.new(pathname) unless pathname.kind_of?(Pathname)
20
+
21
+ pathname = if local_template(pathname).exist?
22
+ local_template(pathname)
23
+ elsif pathname.exist?
24
+ pathname
25
+ else
26
+ raise LoadError, "Can't find template #{pathname}"
27
+ end
28
+ erb = ERB.new(pathname.read)
29
+ erb.filename = pathname.to_s
30
+ erb.result(b)
31
+ end
32
+ end
33
+ end
34
+
35
+ def template(pathname, b = binding)
36
+ self.class.template(pathname, b)
37
+ end
38
+ end
39
+ end
40
+
data/lib/blue/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Blue
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/blue.rb CHANGED
@@ -1,5 +1,74 @@
1
- require "blue/version"
1
+ ENV['DEPLOY_ENV'] ||= 'production'
2
+
3
+ require 'bundler/setup'
4
+ require 'capistrano'
5
+ require 'hashie'
6
+ require 'shadow_puppet'
7
+
8
+ require 'blue/version'
9
+ require 'blue/deep_merge'
10
+ require 'blue/config'
11
+
12
+ require 'blue/railtie' if defined?(Rails)
2
13
 
3
14
  module Blue
4
- # Your code goes here...
15
+ BLUE_CONFIG = 'config/blue.yml'
16
+
17
+ include Blue::Config
18
+
19
+ def self.env
20
+ ENV['DEPLOY_ENV']
21
+ end
22
+
23
+ def self.rails_root
24
+ @@rails_root ||= `pwd`.strip #File.join(current_release_dir.split('/')[0..3] + ['current'])
25
+ end
26
+
27
+ def self.rails_current
28
+ @@rails_current ||= File.join(current_release_dir.split('/')[0..3] + ['current'])
29
+ end
30
+
31
+ def self.current_release_dir
32
+ @@current_release_dir ||= `pwd`.strip
33
+ end
34
+
35
+ def self.shared_path
36
+ @@shared_path ||= "/u/apps/stocks/shared/"
37
+ end
38
+
39
+ @@boxes = []
40
+ def self.register_box(klass)
41
+ @@boxes << klass
42
+ end
43
+
44
+ def self.boxes
45
+ @@boxes
46
+ end
47
+
48
+ def self.load_boxes!
49
+ Dir.glob("#{rails_root}/config/blue/boxes/#{env}/*.rb").each do |rb|
50
+ require rb
51
+ end
52
+ end
53
+ end
54
+
55
+ if File.exists?(Blue::BLUE_CONFIG)
56
+ require 'blue/config'
57
+ require 'blue/database_config'
58
+
59
+ require 'capistrano/setup'
60
+ require 'capistrano/deploy'
61
+ require 'capistrano/rails'
62
+
63
+ require 'blue/plugins'
64
+ require 'blue/abstract_manifest'
65
+ require 'blue/box'
66
+
67
+ require 'capistrano/local_config'
68
+
69
+ Blue.load_app_config!
70
+ Blue.load_boxes!
5
71
  end
72
+
73
+ require "capistrano/integration"
74
+
@@ -0,0 +1,29 @@
1
+ module Blue
2
+ class Deploy
3
+ def self.load(capistrano_config)
4
+ capistrano_config.load do
5
+
6
+ namespace :blue do
7
+ desc 'Apply the Blue manifest for this application'
8
+ task :apply_manifest, :except => { :no_release => true } do
9
+ current_host = capture("echo $CAPISTRANO:HOST$").strip.gsub('.', '_')
10
+ run "cd #{latest_release} && RAILS_ROOT=#{latest_release} RAILS_ENV=#{Blue.env} sudo shadow_puppet #{latest_release}/config/blue/boxes/#{Blue.env}/#{current_host}.rb"
11
+ end
12
+
13
+ task :verify_db do
14
+ run "cd #{latest_release} && RAILS_ENV=#{Blue.env} bundle exec rails runner 'ActiveRecord::Base.connection.execute %q!SELECT 1=1!'"
15
+ end
16
+ end
17
+
18
+ after 'deploy:migrate', 'blue:verify_db'
19
+ before 'bundle:install', 'blue:apply_manifest'
20
+ after "deploy:update", "deploy:cleanup"
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ if Capistrano::Configuration.instance
27
+ Blue::Deploy.load(Capistrano::Configuration.instance)
28
+ end
29
+
@@ -0,0 +1,22 @@
1
+ module Blue
2
+ class Gems
3
+ def self.load(capistrano_config)
4
+ capistrano_config.load do
5
+
6
+ namespace :blue do
7
+ namespace :setup do
8
+ desc "Install required gems"
9
+ task :gems do
10
+ sudo "gem install bundler shadow_puppet --no-ri --no-rdoc"
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ if Capistrano::Configuration.instance
20
+ Blue::Gems.load(Capistrano::Configuration.instance)
21
+ end
22
+
@@ -0,0 +1,39 @@
1
+ module Blue
2
+ class CapistranoIntegration
3
+
4
+ def self.load(capistrano_config)
5
+ capistrano_config.load do
6
+
7
+ set :ruby_version, Blue.config.ruby.major_version
8
+ set :ruby_patch, Blue.config.ruby.minor_version
9
+
10
+ set :application, Blue.config.application
11
+ set :repository, Blue.config.repository
12
+ set :scm, Blue.config.scm
13
+ set :user, Blue.config.user
14
+
15
+ set :keep_releases, Blue.config.keep_releases || 5
16
+ set :normalize_asset_timestamps, false
17
+
18
+ set :shared_children, %w(system log pids tmp)
19
+
20
+ Blue.boxes.each do |box|
21
+ server box.hostname, *box.roles, :primary => true # primary is a hack, shouldn't be here
22
+ end
23
+
24
+ namespace :blue do
25
+ desc "Display Blue Configuration"
26
+ task :config do
27
+ require 'pp'
28
+ pp Blue.config
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ if Capistrano::Configuration.instance
37
+ Blue::CapistranoIntegration.load(Capistrano::Configuration.instance)
38
+ end
39
+
@@ -0,0 +1,59 @@
1
+ module Blue
2
+ module LocalConfig
3
+ module CapistranoIntegration
4
+
5
+ def self.included(klass)
6
+ Blue.load_config!({
7
+ :local_config => []
8
+ })
9
+ end
10
+
11
+ def self.load(capistrano_config)
12
+ capistrano_config.load do
13
+
14
+ set :local_config, Blue.config.local_config
15
+
16
+ namespace :local_config do
17
+
18
+ desc <<-DESC
19
+ Uploads local configuration files to the application's shared directory for \
20
+ later symlinking (if necessary). Called if local_config is set.
21
+ DESC
22
+ task :upload do
23
+ Blue.config.local_config.each do |file|
24
+ filename = File.basename(file)
25
+ path = File.dirname(file)
26
+ if File.exist?(file)
27
+ run "mkdir -p '#{shared_path}/#{path}'" unless path.empty?
28
+ parent.upload(file, "#{shared_path}/#{path}/#{filename}")
29
+ end
30
+ end
31
+ end
32
+
33
+ desc <<-DESC
34
+ Symlinks uploaded local configurations into the release directory.
35
+ DESC
36
+ task :symlink do
37
+ Blue.config.local_config.each do |file|
38
+ filename = File.basename(file)
39
+ path = File.dirname(file)
40
+ run "mkdir -p '#{latest_release}/#{path}'" unless path.empty?
41
+ run "ls #{latest_release}/#{file} 2> /dev/null || ln -nfs #{shared_path}/#{path}/#{filename} #{latest_release}/#{file}"
42
+ end
43
+ end
44
+ end
45
+
46
+ after 'deploy:finalize_update' do
47
+ local_config.upload
48
+ local_config.symlink
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ if Capistrano::Configuration.instance
57
+ Blue::LocalConfig::CapistranoIntegration.load(Capistrano::Configuration.instance)
58
+ end
59
+
@@ -0,0 +1,37 @@
1
+ module Blue
2
+ class Os
3
+ PACKAGES = %w(
4
+ g++ gcc make libc6-dev patch openssl ca-certificates libreadline6 \
5
+ libreadline6-dev curl zlib1g zlib1g-dev libssl-dev libyaml-dev \
6
+ libxml2-dev libxslt1-dev autoconf libc6-dev \
7
+ libgdbm-dev libncurses5-dev automake libtool bison pkg-config libffi-dev
8
+ )
9
+
10
+ def self.load(capistrano_config)
11
+ capistrano_config.load do
12
+
13
+ namespace :blue do
14
+ namespace :setup do
15
+ desc "Install required gems"
16
+ task :os do
17
+ sudo "apt-get install -y #{Blue::Os::PACKAGES.join(' ')}"
18
+
19
+ # Capistrano isn't smart enough to set this up correctly
20
+ path = "/u/apps/#{application}"
21
+ sudo "chown -R #{user} #{path}"
22
+
23
+ # Grab github's fingerprint
24
+ # Oh yea, this is dangerous
25
+ run "ssh -o StrictHostKeyChecking=no git@github.com || true"
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ if Capistrano::Configuration.instance
35
+ Blue::Os.load(Capistrano::Configuration.instance)
36
+ end
37
+
@@ -0,0 +1,25 @@
1
+ module Blue
2
+ class Rails
3
+ def self.load(capistrano_config)
4
+ capistrano_config.load do
5
+
6
+ namespace :blue do
7
+ namespace :precompile do
8
+ desc "Precompile assets"
9
+ task :assets do
10
+ run "cd #{release_path} && RAILS_ENV=#{Blue.env} RAILS_GROUPS=assets bundle exec rake assets:precompile"
11
+ end
12
+ end
13
+ end
14
+
15
+ after 'blue:apply_manifest', 'deploy:migrate'
16
+ after 'deploy:migrate', 'blue:precompile:assets'
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ if Capistrano::Configuration.instance
23
+ Blue::Rails.load(Capistrano::Configuration.instance)
24
+ end
25
+
@@ -0,0 +1,44 @@
1
+ module Blue
2
+ class RubyInstall
3
+
4
+ def self.load(capistrano_config)
5
+ capistrano_config.load do
6
+
7
+ namespace :blue do
8
+ namespace :setup do
9
+ desc "Install Ruby 1.9.3"
10
+ task :ruby do
11
+ version = "ruby-#{Blue.config.ruby.major_version}-p#{Blue.config.ruby.minor_version}"
12
+
13
+ cmd = [
14
+ 'sudo apt-get install autoconf libyaml-dev -y || true',
15
+ 'cd /tmp',
16
+ "sudo rm -rf #{version}* || true",
17
+ "wget -q http://ftp.ruby-lang.org/pub/ruby/#{version}.tar.gz",
18
+ "tar zxvf #{version}.tar.gz",
19
+ "cd /tmp/#{version}",
20
+ "./configure --prefix=/usr",
21
+ "make",
22
+ "sudo make install"
23
+ ].join(' && ')
24
+
25
+ run "test -x /usr/bin/ruby && test #{Blue.config.ruby.major_version}p#{Blue.config.ruby.minor_version} = $(ruby --version | awk '{print $2}') || (#{cmd})"
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ Blue.configure({
35
+ :ruby => {
36
+ :major_version => '1.9.3',
37
+ :minor_version => '429'
38
+ }
39
+ })
40
+
41
+ if Capistrano::Configuration.instance
42
+ Blue::RubyInstall.load(Capistrano::Configuration.instance)
43
+ end
44
+
@@ -0,0 +1,28 @@
1
+ module Blue
2
+ class Setup
3
+ def self.load(capistrano_config)
4
+ capistrano_config.load do
5
+
6
+ namespace :blue do
7
+ # This task should be idempotent
8
+ desc "Configures generic dependencies Blue depends on"
9
+ task :install, :roles => [:ruby] do
10
+ blue.setup.os
11
+ blue.setup.ruby
12
+ blue.setup.gems
13
+ end
14
+ end
15
+ after 'deploy:setup', 'blue:install'
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ if Capistrano::Configuration.instance
22
+ Blue::Setup.load(Capistrano::Configuration.instance)
23
+ end
24
+
25
+ require 'capistrano/os'
26
+ require 'capistrano/ruby'
27
+ require 'capistrano/gems'
28
+
@@ -0,0 +1,28 @@
1
+ namespace :blue do
2
+ desc "Move a basic set of configs into place"
3
+ task :setup do
4
+ puts "Copying configs into place inside your application..."
5
+ puts ""
6
+
7
+ gem_path = Bundler.load.specs.detect{|s| s.name == 'blue' }.try(:full_gem_path)
8
+
9
+ puts "cp config/blue.yml"
10
+ FileUtils.cp gem_path + "/templates/blue.yml", "config/blue.yml"
11
+ puts "cp Capfile"
12
+ FileUtils.cp gem_path + "/templates/Capfile", "Capfile"
13
+ puts "cp config/deploy.rb"
14
+ FileUtils.cp gem_path + "/templates/deploy.rb", "config/deploy.rb"
15
+
16
+ FileUtils.mkdir_p("config/blue/boxes/production")
17
+ puts "cp config/blue/boxes/production/some_hostname_com.rb"
18
+ FileUtils.cp gem_path + "/templates/box.rb", "config/blue/boxes/production/some_hostname_com.rb"
19
+
20
+ puts ""
21
+ puts "#####################################################################"
22
+ puts "## Great! All done adding some configs. ##"
23
+ puts "## Now go read config/blue/boxes/production/some_hostname_com.rb ##"
24
+ puts "#####################################################################"
25
+ puts ""
26
+ end
27
+ end
28
+
data/templates/Capfile ADDED
@@ -0,0 +1,3 @@
1
+ load 'deploy'
2
+ load 'config/deploy'
3
+
@@ -0,0 +1,10 @@
1
+ application: APPLICATION_NAME
2
+ repository: REPOSITORY
3
+ user: REMOTE_USERNAME
4
+ scm: git
5
+
6
+ keep_releases: 5
7
+
8
+ local_config:
9
+ - config/database.yml
10
+
data/templates/box.rb ADDED
@@ -0,0 +1,23 @@
1
+ require 'blue'
2
+
3
+ # This class/file represents a machine.
4
+
5
+ # Both the filename, and the class's name are relevant.
6
+ # Your server's hosname probably isn't some.hostname.com
7
+ # So, rename this file, and the classname below.
8
+
9
+ class SomeHostnameCom < Blue::Box
10
+
11
+ # Blue modules get included like so:
12
+
13
+ # include Blue::Redis
14
+ # include Blue::Monit
15
+
16
+ # That should really be all you need to do in here.
17
+ end
18
+
19
+ #
20
+ # Have multiple machines? I bet you do!
21
+ # Copy this file and change things accordingly.
22
+ #
23
+
@@ -0,0 +1,3 @@
1
+ require 'bundler/capistrano'
2
+ require 'blue'
3
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blue
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Josh Sharpe
@@ -15,12 +15,54 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2013-05-14 00:00:00 Z
18
+ date: 2013-05-24 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: bundler
21
+ name: hashie
22
22
  prerelease: false
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: shadow_puppet
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :runtime
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: capistrano
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ type: :runtime
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ name: bundler
64
+ prerelease: false
65
+ requirement: &id004 !ruby/object:Gem::Requirement
24
66
  none: false
25
67
  requirements:
26
68
  - - ~>
@@ -31,11 +73,11 @@ dependencies:
31
73
  - 3
32
74
  version: "1.3"
33
75
  type: :development
34
- version_requirements: *id001
76
+ version_requirements: *id004
35
77
  - !ruby/object:Gem::Dependency
36
78
  name: rake
37
79
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
80
+ requirement: &id005 !ruby/object:Gem::Requirement
39
81
  none: false
40
82
  requirements:
41
83
  - - ">="
@@ -45,8 +87,8 @@ dependencies:
45
87
  - 0
46
88
  version: "0"
47
89
  type: :development
48
- version_requirements: *id002
49
- description: BLUE
90
+ version_requirements: *id005
91
+ description: A deployment framework for rails apps
50
92
  email:
51
93
  - josh.m.sharpe@gmail.com
52
94
  executables: []
@@ -58,12 +100,35 @@ extra_rdoc_files: []
58
100
  files:
59
101
  - .gitignore
60
102
  - Gemfile
103
+ - ISSUES.md
61
104
  - LICENSE.txt
62
105
  - README.md
63
106
  - Rakefile
64
107
  - blue.gemspec
65
108
  - lib/blue.rb
109
+ - lib/blue/abstract_manifest.rb
110
+ - lib/blue/box.rb
111
+ - lib/blue/config.rb
112
+ - lib/blue/database_config.rb
113
+ - lib/blue/deep_merge.rb
114
+ - lib/blue/plugins.rb
115
+ - lib/blue/plugins/ntpd.rb
116
+ - lib/blue/railtie.rb
117
+ - lib/blue/template.rb
66
118
  - lib/blue/version.rb
119
+ - lib/capistrano/deploy.rb
120
+ - lib/capistrano/gems.rb
121
+ - lib/capistrano/integration.rb
122
+ - lib/capistrano/local_config.rb
123
+ - lib/capistrano/os.rb
124
+ - lib/capistrano/rails.rb
125
+ - lib/capistrano/ruby.rb
126
+ - lib/capistrano/setup.rb
127
+ - lib/tasks/blue.rake
128
+ - templates/Capfile
129
+ - templates/blue.yml
130
+ - templates/box.rb
131
+ - templates/deploy.rb
67
132
  homepage: ""
68
133
  licenses:
69
134
  - MIT
@@ -93,10 +158,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
158
  requirements: []
94
159
 
95
160
  rubyforge_project:
96
- rubygems_version: 1.8.25
161
+ rubygems_version: 1.8.24
97
162
  signing_key:
98
163
  specification_version: 3
99
- summary: BLUE
164
+ summary: Helps manage all aspects of your cloud infrastructure. Install services, deploy code, restart processes, monitor, etc...
100
165
  test_files: []
101
166
 
102
- has_rdoc: